+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.argeo.security.ui.admin.views;
import java.util.ArrayList;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
+import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import javax.jcr.query.Query;
import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.dialogs.Error;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
import org.argeo.jcr.ArgeoNames;
import org.argeo.jcr.ArgeoTypes;
-import org.argeo.security.ArgeoUser;
+import org.argeo.jcr.JcrUtils;
import org.argeo.security.ui.admin.SecurityAdminPlugin;
import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor;
-import org.argeo.security.ui.admin.editors.ArgeoUserEditor;
-import org.argeo.security.ui.admin.editors.ArgeoUserEditorInput;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
/** List all users. */
-public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
- EventListener {
+public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
public final static String ID = "org.argeo.security.ui.admin.adminUsersView";
private TableViewer viewer;
private Session session;
+ private UserStructureListener userStructureListener;
+
+ private Font italic;
+ private Font bold;
+
@Override
public void createPartControl(Composite parent) {
- viewer = new TableViewer(createTable(parent));
+ italic = EclipseUiUtils.getItalicFont(parent);
+ bold = EclipseUiUtils.getBoldFont(parent);
+
+ // viewer = new TableViewer(createTable(parent));
+ viewer = createTableViewer(parent);
+ EclipseUiSpecificUtils.enableToolTipSupport(viewer);
viewer.setContentProvider(new UsersContentProvider());
- viewer.setLabelProvider(new UsersLabelProvider());
+ // viewer.setLabelProvider(new UsersLabelProvider());
viewer.addDoubleClickListener(new ViewDoubleClickListener());
+ getViewSite().setSelectionProvider(viewer);
viewer.setInput(getViewSite());
+
+ userStructureListener = new UserStructureListener();
+ JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
+ | Event.NODE_REMOVED, JcrUtils.DEFAULT_HOME_BASE_PATH,
+ ArgeoTypes.ARGEO_USER_HOME);
}
- protected Table createTable(Composite parent) {
+ protected TableViewer createTableViewer(final Composite parent) {
+
Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ TableViewer viewer = new TableViewer(table);
table.setLinesVisible(true);
table.setHeaderVisible(true);
- TableColumn column = new TableColumn(table, SWT.LEFT, 0);
- column.setText("User");
- column.setWidth(50);
- column = new TableColumn(table, SWT.LEFT, 1);
- column.setText("First Name");
- column.setWidth(100);
- column = new TableColumn(table, SWT.LEFT, 2);
- column.setText("Last Name");
- column.setWidth(100);
- column = new TableColumn(table, SWT.LEFT, 3);
- column.setText("E-mail");
- column.setWidth(100);
- return table;
+
+ // User ID
+ TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("User ID");
+ column.getColumn().setWidth(100);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, ARGEO_USER_ID);
+ // if (username.equals(session.getUserID()))
+ // return "[" + username + "]";
+ // else
+ // return username;
+ }
+ });
+
+ // Displayed name
+ column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("Name");
+ column.getColumn().setWidth(150);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, Property.JCR_TITLE);
+ }
+ });
+
+ // E-mail
+ column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("E-mail");
+ column.getColumn().setWidth(150);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, ARGEO_PRIMARY_EMAIL);
+ }
+ });
+
+ // E-mail
+ column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("Description");
+ column.getColumn().setWidth(200);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, Property.JCR_DESCRIPTION);
+ }
+ });
+
+ return viewer;
}
+ private class CLProvider extends ColumnLabelProvider {
+
+ public String getToolTipText(Object element) {
+ return getText(element);
+ }
+
+ @Override
+ public Font getFont(Object elem) {
+ // self
+ String username = getProperty(elem, ARGEO_USER_ID);
+ if (username.equals(session.getUserID()))
+ return bold;
+
+ // disabled
+ try {
+ Node userHome = (Node) elem;
+ Node userProfile = userHome.getNode(ARGEO_PROFILE);
+ if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
+ return italic;
+ else
+ return null;
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot get font for " + username, e);
+ }
+ }
+
+ }
+
+ // protected Table createTable(Composite parent) {
+ // // TODO use a more flexible API
+ // Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ // table.setLinesVisible(true);
+ // table.setHeaderVisible(true);
+ // TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+ // column.setText("Username");
+ // column.setWidth(100);
+ // column = new TableColumn(table, SWT.LEFT, 1);
+ // column.setText("Displayed name");
+ // column.setWidth(150);
+ // column = new TableColumn(table, SWT.LEFT, 2);
+ // column.setText("E-mail");
+ // column.setWidth(100);
+ // column = new TableColumn(table, SWT.LEFT, 3);
+ // column.setText("First Name");
+ // column.setWidth(100);
+ // column = new TableColumn(table, SWT.LEFT, 4);
+ // column.setText("Last Name");
+ // column.setWidth(100);
+ // column = new TableColumn(table, SWT.LEFT, 5);
+ // column.setText("Status");
+ // column.setWidth(50);
+ // column = new TableColumn(table, SWT.LEFT, 6);
+ // column.setText("Description");
+ // column.setWidth(200);
+ // return table;
+ // }
+
+ // private class UsersLabelProvider extends LabelProvider implements
+ // ITableLabelProvider {
+ // public String getColumnText(Object element, int columnIndex) {
+ // try {
+ // Node userHome = (Node) element;
+ // Node userProfile = userHome.getNode(ARGEO_PROFILE);
+ // switch (columnIndex) {
+ // case 0:
+ // String username = userHome.getProperty(ARGEO_USER_ID)
+ // .getString();
+ // if (username.equals(session.getUserID()))
+ // return "[" + username + "]";
+ // else
+ // return username;
+ // case 1:
+ // return getProperty(userProfile, Property.JCR_TITLE);
+ // case 2:
+ // return getProperty(userProfile, ARGEO_PRIMARY_EMAIL);
+ // case 3:
+ // return getProperty(userProfile, ARGEO_FIRST_NAME);
+ // case 4:
+ // return getProperty(userProfile, ARGEO_LAST_NAME);
+ // case 5:
+ // return userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? ""
+ // : "disabled";
+ // case 6:
+ // return getProperty(userProfile, Property.JCR_DESCRIPTION);
+ // default:
+ // throw new ArgeoException("Unmanaged column " + columnIndex);
+ // }
+ // } catch (RepositoryException e) {
+ // throw new ArgeoException("Cannot get text", e);
+ // }
+ // }
+ //
+ // public Image getColumnImage(Object element, int columnIndex) {
+ // return null;
+ // }
+ //
+ // }
+
@Override
public void setFocus() {
viewer.getTable().setFocus();
}
+ @Override
+ public void dispose() {
+ JcrUtils.removeListenerQuietly(session, userStructureListener);
+ super.dispose();
+ }
+
public void setSession(Session session) {
this.session = session;
}
viewer.refresh();
}
- @Override
- public void onEvent(EventIterator events) {
- viewer.refresh();
+ protected String getProperty(Node userProfile, String name)
+ throws RepositoryException {
+ return userProfile.hasProperty(name) ? userProfile.getProperty(name)
+ .getString() : "";
+ }
+
+ protected String getProperty(Object element, String name) {
+ try {
+ Node userHome = (Node) element;
+ Node userProfile = userHome.getNode(ARGEO_PROFILE);
+ return userProfile.hasProperty(name) ? userProfile
+ .getProperty(name).getString() : "";
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot get property " + name, e);
+ }
+ }
+
+ private class UserStructureListener implements EventListener {
+
+ @Override
+ public void onEvent(EventIterator events) {
+ viewer.refresh();
+ }
}
private class UsersContentProvider implements IStructuredContentProvider {
.getWorkspace()
.getQueryManager()
.createQuery(
- "select [" + ARGEO_USER_PROFILE + "] from ["
+ "select [" + ARGEO_PROFILE + "] from ["
+ ARGEO_USER_HOME + "]", Query.JCR_SQL2);
NodeIterator nit = query.execute().getNodes();
List<Node> userProfiles = new ArrayList<Node>();
}
- private class UsersLabelProvider extends LabelProvider implements
- ITableLabelProvider {
- public String getColumnText(Object element, int columnIndex) {
- try {
- Node userHome = (Node) element;
- switch (columnIndex) {
- case 0:
- String userName = userHome.getProperty(ARGEO_USER_ID)
- .getString();
- if (userName.equals(session.getUserID()))
- return "[" + userName + "]";
- else
- return userName;
- case 1:
- return userHome.getNode(ARGEO_USER_PROFILE)
- .getProperty(ARGEO_FIRST_NAME).getString();
- case 2:
- return userHome.getNode(ARGEO_USER_PROFILE)
- .getProperty(ARGEO_LAST_NAME).getString();
- case 3:
- return userHome.getNode(ARGEO_USER_PROFILE)
- .getProperty(ARGEO_PRIMARY_EMAIL).getString();
- default:
- throw new ArgeoException("Unmanaged column " + columnIndex);
- }
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot get text", e);
- }
-
- // String currentUsername = CurrentUser.getUsername();
- // String currentUsername = "";
- // ArgeoUser user = (ArgeoUser) element;
- // SimpleUserNature simpleNature = SimpleUserNature
- // .findSimpleUserNature(user, simpleNatureType);
- // switch (columnIndex) {
- // case 0:
- // String userName = user.getUsername();
- // if (userName.equals(currentUsername))
- // userName = userName + "*";
- // return userName;
- // case 1:
- // return simpleNature.getFirstName();
- // case 2:
- // return simpleNature.getLastName();
- // case 3:
- // return simpleNature.getEmail();
- // default:
- // throw new ArgeoException("Unmanaged column " + columnIndex);
- // }
- }
-
- public Image getColumnImage(Object element, int columnIndex) {
- // TODO Auto-generated method stub
- return null;
- }
-
- }
-
class ViewDoubleClickListener implements IDoubleClickListener {
public void doubleClick(DoubleClickEvent evt) {
if (evt.getSelection().isEmpty())
Object obj = ((IStructuredSelection) evt.getSelection())
.getFirstElement();
if (obj instanceof Node) {
- try {
- IWorkbench iw = SecurityAdminPlugin.getDefault()
- .getWorkbench();
- iw.getActiveWorkbenchWindow()
- .getActivePage()
- .openEditor(new ArgeoUserEditorInput((Node) obj),
- ArgeoUserEditor.ID);
- } catch (PartInitException e) {
- Error.show("Cannot open user editor for " + obj, e);
- }
- } else if (obj instanceof ArgeoUser) {
- ArgeoUser argeoUser = (ArgeoUser) obj;
-
IWorkbench iw = SecurityAdminPlugin.getDefault().getWorkbench();
IHandlerService handlerService = (IHandlerService) iw
.getService(IHandlerService.class);
try {
+ String username = ((Node) obj).getProperty(ARGEO_USER_ID)
+ .getString();
String commandId = OpenArgeoUserEditor.COMMAND_ID;
String paramName = OpenArgeoUserEditor.PARAM_USERNAME;
ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
IParameter iparam = cmd.getParameter(paramName);
Parameterization param = new Parameterization(iparam,
- argeoUser.getUsername());
+ username);
parameters.add(param);
ParameterizedCommand pc = new ParameterizedCommand(cmd,
parameters.toArray(new Parameterization[parameters