Work on user management page.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / users / Users.java
index e7f09440d88fdd015edd0dde9d4a7e0a557946bf..58e0e88622164be3c722236efedf34b0872d4b2d 100644 (file)
@@ -1,30 +1,41 @@
 package org.argeo.cms.users;
 
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.security.AccessControlManager;
 import javax.jcr.security.Privilege;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.cms.CmsUiProvider;
 import org.argeo.cms.CmsUtils;
 import org.argeo.cms.maintenance.NonAdminPage;
 import org.argeo.eclipse.ui.dialogs.UserCreationWizard;
 import org.argeo.eclipse.ui.parts.UsersTable;
+import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.security.UserAdminService;
 import org.argeo.security.jcr.JcrSecurityModel;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
@@ -36,6 +47,8 @@ import org.eclipse.swt.widgets.Control;
  */
 public class Users implements CmsUiProvider {
 
+       private final static Log log = LogFactory.getLog(Users.class);
+
        // Enable user CRUD // INJECTED
        private UserAdminService userAdminService;
        private JcrSecurityModel jcrSecurityModel;
@@ -116,31 +129,20 @@ public class Users implements CmsUiProvider {
                // Delete
                final Button deleteBtn = new Button(buttonCmp, SWT.PUSH);
                deleteBtn.setText("Delete selected");
+               deleteBtn
+                               .setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
+
                // Add
                final Button addBtn = new Button(buttonCmp, SWT.PUSH);
                addBtn.setText("Create");
-               addBtn.addSelectionListener(new SelectionListener() {
-                       private static final long serialVersionUID = 9214984636836267786L;
-
-                       @Override
-                       public void widgetSelected(SelectionEvent e) {
-                               UserCreationWizard newUserWizard = new UserCreationWizard(
-                                               session, userAdminService, jcrSecurityModel);
-                               WizardDialog dialog = new WizardDialog(addBtn.getShell(),
-                                               newUserWizard);
-                               dialog.open();
-                               // TODO refresh list if user has been created
-                       }
-
-                       @Override
-                       public void widgetDefaultSelected(SelectionEvent e) {
-                       }
-               });
 
                // Create the composite that displays the list and a filter
-               UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS, session);
+               final UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS,
+                               session);
                userTableCmp.populate(true, false);
                userTableCmp.setLayoutData(CmsUtils.fillAll());
+
+               // The various listeners
                userTableCmp.addDisposeListener(new DisposeListener() {
                        private static final long serialVersionUID = -8854052549807709846L;
 
@@ -150,6 +152,77 @@ public class Users implements CmsUiProvider {
                        }
                });
 
+               deleteBtn.addSelectionListener(new SelectionAdapter() {
+                       private static final long serialVersionUID = -7340611909297995666L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+
+                               TableViewer viewer = userTableCmp.getTableViewer();
+                               ISelection selection = viewer.getSelection();
+                               if (selection.isEmpty())
+                                       return;
+
+                               Map<String, Node> toDelete = new TreeMap<String, Node>();
+                               @SuppressWarnings("unchecked")
+                               Iterator<Node> it = ((IStructuredSelection) selection)
+                                               .iterator();
+                               nodes: while (it.hasNext()) {
+                                       Node profileNode = it.next();
+                                       try {
+                                               String userName = profileNode.getProperty(
+                                                               ArgeoNames.ARGEO_USER_ID).getString();
+                                               if (userName.equals(profileNode.getSession()
+                                                               .getUserID())) {
+                                                       log.warn("Cannot delete its own user: " + userName);
+                                                       continue nodes;
+                                               }
+                                               toDelete.put(userName, profileNode);
+                                       } catch (RepositoryException re) {
+                                               log.warn("Cannot interpred user " + profileNode);
+                                       }
+                               }
+
+                               if (!MessageDialog.openQuestion(
+                                               userTableCmp.getShell(),
+                                               "Delete User",
+                                               "Are you sure that you want to delete users "
+                                                               + toDelete.keySet()
+                                                               + "?\n"
+                                                               + "This may lead to inconsistencies in the application."))
+                                       return;
+
+                               for (String username : toDelete.keySet()) {
+                                       Session session = null;
+                                       try {
+                                               Node profileNode = toDelete.get(username);
+                                               userAdminService.deleteUser(username);
+                                               profileNode.getParent().remove();
+                                               session = profileNode.getSession();
+                                               session.save();
+                                       } catch (RepositoryException re) {
+                                               JcrUtils.discardQuietly(session);
+                                               throw new ArgeoException("Cannot list users", re);
+                                       }
+                               }
+                               userTableCmp.refresh();
+                       }
+               });
+
+               addBtn.addSelectionListener(new SelectionAdapter() {
+                       private static final long serialVersionUID = 9214984636836267786L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               UserCreationWizard newUserWizard = new UserCreationWizard(
+                                               session, userAdminService, jcrSecurityModel);
+                               WizardDialog dialog = new WizardDialog(addBtn.getShell(),
+                                               newUserWizard);
+                               if (dialog.open() == Window.OK)
+                                       userTableCmp.refresh();
+                       }
+               });
+
                // Configure
                // userTableCmp.getTableViewer().addDoubleClickListener(
                // new ViewDoubleClickListener());
@@ -267,6 +340,6 @@ public class Users implements CmsUiProvider {
 
        public void setJcrSecurityModel(JcrSecurityModel jcrSecurityModel) {
                this.jcrSecurityModel = jcrSecurityModel;
-               userPage.setJcrSecurityModel(jcrSecurityModel);
+               // userPage.setJcrSecurityModel(jcrSecurityModel);
        }
 }
\ No newline at end of file