]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java
Merge from commons 1.2.x, see following bugs:
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / views / UsersView.java
index ca89aef446dc49c8c6a9b0360d56545fedf15a77..5f47741f5edb951cff6fd40797d48c1e6cbfcbf3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2012 Mathieu Baudier
+ * Copyright (C) 2007-2012 Argeo GmbH
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 package org.argeo.security.ui.admin.views;
 
-import java.util.ArrayList;
-import java.util.List;
-
 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.EclipseUiUtils;
-import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
+import org.argeo.eclipse.ui.utils.CommandUtils;
+import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.ArgeoTypes;
 import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.UserJcrUtils;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.UserTableComposite;
 import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor;
-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.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.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.part.ViewPart;
 
-/** List all users. */
-public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
-       public final static String ID = "org.argeo.security.ui.admin.adminUsersView";
+/** List all users with filter. */
+public class UsersView extends ViewPart implements ArgeoNames {
+       public final static String ID = SecurityAdminPlugin.PLUGIN_ID
+                       + ".adminUsersView";
 
-       private TableViewer viewer;
+       private UserTableComposite userTableCmp;
        private Session session;
-
-       private UserStructureListener userStructureListener;
-
-       private Font italic;
-       private Font bold;
+       private JcrUserListener userStructureListener;
+       private JcrUserListener userPropertiesListener;
 
        @Override
        public void createPartControl(Composite 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.addDoubleClickListener(new ViewDoubleClickListener());
-               getViewSite().setSelectionProvider(viewer);
-               viewer.setInput(getViewSite());
-
-               userStructureListener = new UserStructureListener();
-               JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
-                               | Event.NODE_REMOVED, UserJcrUtils.DEFAULT_HOME_BASE_PATH,
-                               ArgeoTypes.ARGEO_USER_HOME);
-       }
-
-       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);
-
-               // 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);
-               }
+               parent.setLayout(new FillLayout());
 
-               @Override
-               public Font getFont(Object elem) {
-                       // self
-                       String username = getProperty(elem, ARGEO_USER_ID);
-                       if (username.equals(session.getUserID()))
-                               return bold;
+               // Create the composite that displays the list and a filter
+               userTableCmp = new UserTableComposite(parent, SWT.NO_FOCUS, session);
+               userTableCmp.populate(true, false);
 
-                       // 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);
-                       }
-               }
+               // Configure
+               userTableCmp.getTableViewer().addDoubleClickListener(
+                               new ViewDoubleClickListener());
+               getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
 
+               // Add listener to refresh the list when something changes
+               userStructureListener = new JcrUserListener(getSite().getShell()
+                               .getDisplay());
+               JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
+                               | Event.NODE_REMOVED, ArgeoJcrConstants.PEOPLE_BASE_PATH, null);
+               userPropertiesListener = new JcrUserListener(getSite().getShell()
+                               .getDisplay());
+               JcrUtils.addListener(session, userStructureListener,
+                               Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED
+                                               | Event.PROPERTY_REMOVED,
+                               ArgeoJcrConstants.PEOPLE_BASE_PATH,
+                               ArgeoTypes.ARGEO_USER_PROFILE);
        }
 
-       // 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();
+               userTableCmp.setFocus();
        }
 
        @Override
        public void dispose() {
                JcrUtils.removeListenerQuietly(session, userStructureListener);
+               JcrUtils.removeListenerQuietly(session, userPropertiesListener);
                super.dispose();
        }
 
@@ -259,62 +94,31 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
        }
 
        public void refresh() {
-               viewer.refresh();
+               this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
+                       @Override
+                       public void run() {
+                               userTableCmp.refresh();
+                       }
+               });
        }
 
-       protected String getProperty(Node userProfile, String name)
-                       throws RepositoryException {
-               return userProfile.hasProperty(name) ? userProfile.getProperty(name)
-                               .getString() : "";
-       }
+       private class JcrUserListener implements EventListener {
+               private final Display display;
 
-       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);
+               public JcrUserListener(Display display) {
+                       super();
+                       this.display = display;
                }
-       }
-
-       private class UserStructureListener implements EventListener {
 
                @Override
                public void onEvent(EventIterator events) {
-                       viewer.refresh();
-               }
-       }
-
-       private class UsersContentProvider implements IStructuredContentProvider {
-
-               public Object[] getElements(Object inputElement) {
-                       try {
-                               Query query = session
-                                               .getWorkspace()
-                                               .getQueryManager()
-                                               .createQuery(
-                                                               "select [" + ARGEO_PROFILE + "] from ["
-                                                                               + ARGEO_USER_HOME + "]", Query.JCR_SQL2);
-                               NodeIterator nit = query.execute().getNodes();
-                               List<Node> userProfiles = new ArrayList<Node>();
-                               while (nit.hasNext()) {
-                                       userProfiles.add(nit.nextNode());
+                       display.asyncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       userTableCmp.refresh();
                                }
-                               return userProfiles.toArray();
-                       } catch (RepositoryException e) {
-                               throw new ArgeoException("Cannot list users", e);
-                       }
-                       // return userAdminService.listUsers().toArray();
-               }
-
-               public void dispose() {
+                       });
                }
-
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-
        }
 
        class ViewDoubleClickListener implements IDoubleClickListener {
@@ -325,38 +129,16 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
                        Object obj = ((IStructuredSelection) evt.getSelection())
                                        .getFirstElement();
                        if (obj instanceof Node) {
-                               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;
-
-                                       // TODO: factorize this
-                                       // execute related command
-                                       IWorkbenchWindow window = iw.getActiveWorkbenchWindow();
-                                       ICommandService cmdService = (ICommandService) window
-                                                       .getService(ICommandService.class);
-                                       Command cmd = cmdService.getCommand(commandId);
-                                       ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
-                                       IParameter iparam = cmd.getParameter(paramName);
-                                       Parameterization param = new Parameterization(iparam,
-                                                       username);
-                                       parameters.add(param);
-                                       ParameterizedCommand pc = new ParameterizedCommand(cmd,
-                                                       parameters.toArray(new Parameterization[parameters
-                                                                       .size()]));
-                                       handlerService = (IHandlerService) window
-                                                       .getService(IHandlerService.class);
-                                       handlerService.executeCommand(pc, null);
-                               } catch (Exception e) {
-                                       throw new ArgeoException("Cannot open editor", e);
+                                       CommandUtils.callCommand(commandId, paramName, username);
+                               } catch (RepositoryException e) {
+                                       throw new ArgeoException("Cannot open user editor", e);
                                }
-
                        }
                }
        }
-
-}
+}
\ No newline at end of file