]> 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
Update license headers
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / views / UsersView.java
index 9ef5afe2bb14ce2dee48964786f37710a6b5b2db..254149b095f4c279476d395b391224c46e8aa028 100644 (file)
@@ -1,30 +1,58 @@
+/*
+ * 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 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.security.ArgeoSecurityService;
-import org.argeo.security.ArgeoUser;
-import org.argeo.security.nature.SimpleUserNature;
+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.jcr.JcrUtils;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 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.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.commands.ICommandService;
@@ -32,117 +60,277 @@ import org.eclipse.ui.handlers.IHandlerService;
 import org.eclipse.ui.part.ViewPart;
 
 /** List all users. */
-public class UsersView extends ViewPart {
-       public final static String ID = "org.argeo.security.ui.usersView";
+public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
+       public final static String ID = "org.argeo.security.ui.admin.adminUsersView";
 
        private TableViewer viewer;
-       private ArgeoSecurityService securityService;
+       private Session session;
+
+       private UserStructureListener userStructureListener;
 
-       private String simpleNatureType = null;
+       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();
        }
 
-       public void setSecurityService(ArgeoSecurityService securityService) {
-               this.securityService = securityService;
+       @Override
+       public void dispose() {
+               JcrUtils.removeListenerQuietly(session, userStructureListener);
+               super.dispose();
        }
 
-       public void setSimpleNatureType(String simpleNatureType) {
-               this.simpleNatureType = simpleNatureType;
+       public void setSession(Session session) {
+               this.session = session;
        }
 
        public void refresh() {
                viewer.refresh();
        }
 
-       private class UsersContentProvider implements IStructuredContentProvider {
+       protected String getProperty(Node userProfile, String name)
+                       throws RepositoryException {
+               return userProfile.hasProperty(name) ? userProfile.getProperty(name)
+                               .getString() : "";
+       }
 
-               public Object[] getElements(Object inputElement) {
-                       return securityService.listUsers().toArray();
+       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 void dispose() {
-               }
+       private class UserStructureListener implements EventListener {
 
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               @Override
+               public void onEvent(EventIterator events) {
+                       viewer.refresh();
                }
-
        }
 
-       private class UsersLabelProvider extends LabelProvider implements
-                       ITableLabelProvider {
-               public String getColumnText(Object element, int columnIndex) {
-                       //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);
+       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());
+                               }
+                               return userProfiles.toArray();
+                       } catch (RepositoryException e) {
+                               throw new ArgeoException("Cannot list users", e);
                        }
+                       // return userAdminService.listUsers().toArray();
                }
 
-               public Image getColumnImage(Object element, int columnIndex) {
-                       // TODO Auto-generated method stub
-                       return null;
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                }
 
        }
 
        class ViewDoubleClickListener implements IDoubleClickListener {
                public void doubleClick(DoubleClickEvent evt) {
+                       if (evt.getSelection().isEmpty())
+                               return;
+
                        Object obj = ((IStructuredSelection) evt.getSelection())
                                        .getFirstElement();
-
-                       if (obj instanceof ArgeoUser) {
-                               ArgeoUser argeoUser = (ArgeoUser) obj;
-
+                       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;
 
@@ -155,7 +343,7 @@ public class UsersView extends ViewPart {
                                        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