First draft of a wizard to launch batch updates on users.
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / views / UsersView.java
index 6c8986b2ba16af973ceeda1660b8b2f7d901a6bc..5f47741f5edb951cff6fd40797d48c1e6cbfcbf3 100644 (file)
  */
 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.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.qom.Constraint;
-import javax.jcr.query.qom.DynamicOperand;
-import javax.jcr.query.qom.Ordering;
-import javax.jcr.query.qom.QueryObjectModel;
-import javax.jcr.query.qom.QueryObjectModelFactory;
-import javax.jcr.query.qom.Selector;
-import javax.jcr.query.qom.StaticOperand;
 
 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.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.UserTableComposite;
 import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor;
-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.jface.viewers.ViewerComparator;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.part.ViewPart;
 
-/** List all users. */
+/** 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 Text filterTxt;
-       private final static String FILTER_HELP_MSG = "Type filter criterion "
-                       + "separated by a space (on user ID, name and E-mail)";
-       private final static Image FILTER_RESET = SecurityAdminPlugin
-                       .getImageDescriptor("icons/clear.gif").createImage();
-
+       private UserTableComposite userTableCmp;
        private Session session;
-
-       private UserStructureListener userStructureListener;
-       private UserPropertiesListener userPropertiesListener;
-
-       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);
+               parent.setLayout(new FillLayout());
 
-               // Main Layout
-               GridLayout layout = new GridLayout(1, false);
-               parent.setLayout(layout);
-               createFilterPart(parent);
+               // Create the composite that displays the list and a filter
+               userTableCmp = new UserTableComposite(parent, SWT.NO_FOCUS, session);
+               userTableCmp.populate(true, false);
 
-               viewer = createTableViewer(parent);
-               EclipseUiSpecificUtils.enableToolTipSupport(viewer);
-               viewer.setContentProvider(new UsersContentProvider());
-               viewer.addDoubleClickListener(new ViewDoubleClickListener());
-               getViewSite().setSelectionProvider(viewer);
+               // Configure
+               userTableCmp.getTableViewer().addDoubleClickListener(
+                               new ViewDoubleClickListener());
+               getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
 
-               userStructureListener = new UserStructureListener();
+               // 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 UserPropertiesListener();
+               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);
-
-               refreshFilteredList();
-       }
-
-       protected TableViewer createTableViewer(final Composite parent) {
-
-               Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-               GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
-               gd.grabExcessHorizontalSpace = true;
-               gd.grabExcessVerticalSpace = true;
-               table.setLayoutData(gd);
-
-               TableViewer viewer = new TableViewer(table);
-               table.setLinesVisible(true);
-               table.setHeaderVisible(true);
-
-               // pass a mapping between col index and property name to the comparator.
-               List<String> propertiesList = new ArrayList<String>();
-
-               // User ID
-               TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
-               column.getColumn().setText("User ID");
-               column.getColumn().setWidth(100);
-               column.getColumn().addSelectionListener(getSelectionAdapter(0));
-               propertiesList.add(ARGEO_USER_ID);
-               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.getColumn().addSelectionListener(getSelectionAdapter(1));
-               propertiesList.add(Property.JCR_TITLE);
-               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.getColumn().addSelectionListener(getSelectionAdapter(2));
-               propertiesList.add(ARGEO_PRIMARY_EMAIL);
-               column.setLabelProvider(new CLProvider() {
-                       public String getText(Object elem) {
-                               return getProperty(elem, ARGEO_PRIMARY_EMAIL);
-                       }
-               });
-
-               // Description
-               column = new TableViewerColumn(viewer, SWT.NONE);
-               column.getColumn().setText("Description");
-               column.getColumn().setWidth(200);
-               column.getColumn().addSelectionListener(getSelectionAdapter(3));
-               propertiesList.add(Property.JCR_DESCRIPTION);
-               column.setLabelProvider(new CLProvider() {
-                       public String getText(Object elem) {
-                               return getProperty(elem, Property.JCR_DESCRIPTION);
-                       }
-               });
-
-               viewer.setComparator(new UsersViewerComparator(propertiesList));
-
-               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 userProfile = (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);
-                       }
-               }
-
-       }
-
-       private SelectionAdapter getSelectionAdapter(final int index) {
-               SelectionAdapter selectionAdapter = new SelectionAdapter() {
-                       @Override
-                       public void widgetSelected(SelectionEvent e) {
-                               UsersViewerComparator comparator = (UsersViewerComparator) viewer
-                                               .getComparator();
-
-                               if (index == comparator.getSortColumn()) {
-                                       comparator.setAscending(!comparator.isAscending());
-                               }
-                               comparator.setSortColumn(index);
-                               viewer.getTable().setSortColumn(
-                                               viewer.getTable().getColumn(index));
-                               viewer.getTable().setSortDirection(
-                                               comparator.isAscending() ? SWT.UP : SWT.DOWN);
-                               viewer.refresh(false);
-                       }
-               };
-               return selectionAdapter;
-       }
-
-       private class UsersViewerComparator extends ViewerComparator {
-
-               private List<String> propertyList;
-               private int sortColumn = 0;
-               private boolean ascending = true;
-               // use this to enable two levels sort
-               @SuppressWarnings("unused")
-               private int lastSortColumn = 0;
-               @SuppressWarnings("unused")
-               private boolean lastAscending = true;
-
-               public UsersViewerComparator(List<String> propertyList) {
-                       super();
-                       this.propertyList = propertyList;
-               }
-
-               public int compare(Viewer viewer, Object e1, Object e2) {
-                       String s1 = getProperty(e1, propertyList.get(sortColumn));
-                       String s2 = getProperty(e2, propertyList.get(sortColumn));
-                       int result = super.compare(viewer, s1, s2);
-                       return ascending ? result : (-1) * result;
-               }
-
-               /**
-                * @return Returns the sortColumn.
-                */
-               public int getSortColumn() {
-                       return sortColumn;
-               }
-
-               /**
-                * @param sortColumn
-                *            The sortColumn to set.
-                */
-               public void setSortColumn(int sortColumn) {
-                       if (this.sortColumn != sortColumn) {
-                               lastSortColumn = this.sortColumn;
-                               lastAscending = this.ascending;
-                               this.sortColumn = sortColumn;
-                       }
-               }
-
-               /**
-                * @return Returns the ascending.
-                */
-               public boolean isAscending() {
-                       return ascending;
-               }
-
-               /**
-                * @param ascending
-                *            The ascending to set.
-                */
-               public void setAscending(boolean ascending) {
-                       this.ascending = ascending;
-               }
        }
 
        @Override
        public void setFocus() {
-               viewer.getTable().setFocus();
+               userTableCmp.setFocus();
        }
 
        @Override
@@ -316,76 +94,31 @@ public class UsersView extends ViewPart implements ArgeoNames {
        }
 
        public void refresh() {
-               // viewer.refresh();
-               refreshFilteredList();
-       }
-
-       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 userProfile = (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);
-               }
+               this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
+                       @Override
+                       public void run() {
+                               userTableCmp.refresh();
+                       }
+               });
        }
 
-       private class UserStructureListener implements EventListener {
+       private class JcrUserListener implements EventListener {
+               private final Display display;
 
-               @Override
-               public void onEvent(EventIterator events) {
-                       // viewer.refresh();
-                       refreshFilteredList();
+               public JcrUserListener(Display display) {
+                       super();
+                       this.display = display;
                }
-       }
-
-       private class UserPropertiesListener implements EventListener {
 
                @Override
                public void onEvent(EventIterator events) {
-                       // viewer.refresh();
-                       refreshFilteredList();
-               }
-       }
-
-       private class UsersContentProvider implements IStructuredContentProvider {
-
-               public Object[] getElements(Object inputElement) {
-                       return (Object[]) inputElement;
-
-                       // try {
-                       // Query query = session
-                       // .getWorkspace()
-                       // .getQueryManager()
-                       // .createQuery(
-                       // "select * from ["
-                       // + ArgeoTypes.ARGEO_USER_PROFILE + "]",
-                       // Query.JCR_SQL2);
-                       // NodeIterator nit = query.execute().getNodes();
-                       // List<Node> userProfiles = new ArrayList<Node>();
-                       // while (nit.hasNext()) {
-                       // userProfiles.add(nit.nextNode());
-                       // }
-                       // 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) {
+                       display.asyncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       userTableCmp.refresh();
+                               }
+                       });
                }
-
        }
 
        class ViewDoubleClickListener implements IDoubleClickListener {
@@ -408,109 +141,4 @@ public class UsersView extends ViewPart implements ArgeoNames {
                        }
                }
        }
-
-       /* MANAGE FILTER */
-       private void createFilterPart(Composite parent) {
-               Composite header = new Composite(parent, SWT.FILL);
-               header.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-               header.setLayout(new GridLayout(2, false));
-
-               // Text Area to filter
-               filterTxt = new Text(header, SWT.BORDER | SWT.SINGLE);
-               filterTxt.setMessage(FILTER_HELP_MSG);
-               GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
-               gd.grabExcessHorizontalSpace = true;
-               filterTxt.setLayoutData(gd);
-               filterTxt.addModifyListener(new ModifyListener() {
-                       public void modifyText(ModifyEvent event) {
-                               refreshFilteredList();
-                       }
-               });
-
-               Button resetBtn = new Button(header, SWT.PUSH);
-               resetBtn.setImage(FILTER_RESET);
-               resetBtn.addSelectionListener(new SelectionListener() {
-                       public void widgetSelected(SelectionEvent e) {
-                               resetFilter();
-                       }
-
-                       public void widgetDefaultSelected(SelectionEvent e) {
-                       }
-               });
-
-       }
-
-       private void resetFilter() {
-               filterTxt.setText("");
-               filterTxt.setMessage(FILTER_HELP_MSG);
-       }
-
-       private void refreshFilteredList() {
-               List<Node> nodes;
-               try {
-                       nodes = JcrUtils.nodeIteratorToList(listFilteredElements(session,
-                                       filterTxt.getText()));
-                       viewer.setInput(nodes.toArray());
-               } catch (RepositoryException e) {
-                       throw new ArgeoException("Unable to list users", e);
-               }
-       }
-
-       /** Build repository request */
-       private NodeIterator listFilteredElements(Session session, String filter)
-                       throws RepositoryException {
-               QueryManager queryManager = session.getWorkspace().getQueryManager();
-               QueryObjectModelFactory factory = queryManager.getQOMFactory();
-
-               final String bundleArtifactsSelector = "userProfiles";
-               Selector source = factory.selector(ArgeoTypes.ARGEO_USER_PROFILE,
-                               bundleArtifactsSelector);
-
-               // Create a dynamic operand for each property on which we want to filter
-               DynamicOperand userIdDO = factory.propertyValue(
-                               source.getSelectorName(), ARGEO_USER_ID);
-               DynamicOperand fullNameDO = factory.propertyValue(
-                               source.getSelectorName(), Property.JCR_TITLE);
-               DynamicOperand mailDO = factory.propertyValue(source.getSelectorName(),
-                               ARGEO_PRIMARY_EMAIL);
-
-               // Default Constraint: no source artifacts
-               Constraint defaultC = null;
-
-               // Build constraints based the textArea content
-               if (filter != null && !"".equals(filter.trim())) {
-                       // Parse the String
-                       String[] strs = filter.trim().split(" ");
-                       for (String token : strs) {
-                               token = token.replace('*', '%');
-                               StaticOperand so = factory.literal(session.getValueFactory()
-                                               .createValue("%" + token + "%"));
-
-                               Constraint currC = factory.comparison(userIdDO,
-                                               QueryObjectModelFactory.JCR_OPERATOR_LIKE, so);
-                               currC = factory.or(currC, factory.comparison(fullNameDO,
-                                               QueryObjectModelFactory.JCR_OPERATOR_LIKE, so));
-                               currC = factory.or(currC, factory.comparison(mailDO,
-                                               QueryObjectModelFactory.JCR_OPERATOR_LIKE, so));
-
-                               if (defaultC == null)
-                                       defaultC = currC;
-                               else
-                                       defaultC = factory.and(defaultC, currC);
-                       }
-               }
-
-               Ordering order = factory.ascending(factory.propertyValue(
-                               bundleArtifactsSelector, ARGEO_USER_ID));
-               // Ordering order2 = factory.ascending(factory.propertyValue(
-               // bundleArtifactsSelector, ARGEO_PRIMARY_EMAIL));
-               // Ordering[] orderings = { order, order2 };
-               Ordering[] orderings = { order };
-
-               QueryObjectModel query = factory.createQuery(source, defaultC,
-                               orderings, null);
-
-               QueryResult result = query.execute();
-               return result.getNodes();
-       }
 }
\ No newline at end of file