]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/users/Users.java
Fix a few glitches in the various maintenance pages.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / users / Users.java
index c8a9cc497fb3ba28b67655c5683f525949dbadfa..2637ed4d9afeeb923af00e3a6bb3a829805c0071 100644 (file)
 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.cms.util.CmsUtils;
 import org.argeo.eclipse.ui.parts.UsersTable;
+import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.security.UserAdminService;
+import org.eclipse.jface.dialogs.Dialog;
+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.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.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.springframework.security.provisioning.UserDetailsManager;
 
+/**
+ * Simple page to manage users of a given repository. We still rely on Argeo
+ * model; with user stored in the main workspace
+ */
 public class Users implements CmsUiProvider {
 
+       private final static Log log = LogFactory.getLog(Users.class);
+
+       // Enable user CRUD // INJECTED
+       private UserAdminService userAdminService;
+       // private UserDetailsManager userDetailsManager;
+       private String userWkspName;
+
+       // Local UI Providers
        NonAdminPage nap = new NonAdminPage();
+       UserPage userPage = new UserPage();
 
+       // Manage authorization
        @Override
        public Control createUi(Composite parent, Node context)
                        throws RepositoryException {
-
                if (isAdmin(context)) {
                        Session session = context.getSession().getRepository()
-                                       .login("main");
-                       return createUsersTable(parent, session);
+                                       .login(userWkspName);
+                       return createMainLayout(parent, session);
                } else
                        nap.createUi(parent, context);
                return null;
+       }
+
+       // Main layout
+       // Left: User Table - Right User Details Edition
+       private Control createMainLayout(Composite parent, final Session session)
+                       throws RepositoryException {
+
+               Composite layoutCmp = new Composite(parent, SWT.NO_FOCUS);
+               layoutCmp.setLayoutData(CmsUtils.fillAll());
+               layoutCmp
+                               .setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(2, true)));
+
+               Composite left = new Composite(layoutCmp, SWT.NO_FOCUS);
+               left.setLayoutData(CmsUtils.fillAll());
+               UsersTable table = createUsersTable(left, session);
+
+               final Composite right = new Composite(layoutCmp, SWT.NO_FOCUS);
+               right.setLayoutData(CmsUtils.fillAll());
+               // Composite innerPage = createUserPage(right);
+               // final UserViewerOld userViewer = new UserViewerOld(innerPage);
+
+               final TableViewer viewer = table.getTableViewer();
+               viewer.addSelectionChangedListener(new ISelectionChangedListener() {
 
+                       @Override
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               IStructuredSelection selection = (IStructuredSelection) viewer
+                                               .getSelection();
+                               if (selection.isEmpty()) {
+                                       // Should we clean the right column?
+                                       return;
+                               } else {
+                                       Node context = (Node) selection.getFirstElement();
+                                       try {
+                                               CmsUtils.clear(right);
+                                               userPage.createUi(right, context);
+                                               right.layout();
+                                               right.getParent().layout();
+                                       } catch (RepositoryException e) {
+                                               e.printStackTrace();
+                                               throw new ArgeoException("unable to create "
+                                                               + "editor for user " + context, e);
+                                       }
+                               }
+                       }
+               });
+               return left;
        }
 
-       private Control createUsersTable(Composite parent, final Session session)
+       private UsersTable createUsersTable(Composite parent, final Session session)
                        throws RepositoryException {
+               parent.setLayout(CmsUtils.noSpaceGridLayout());
+
+               // Add user CRUD buttons
+               Composite buttonCmp = new Composite(parent, SWT.NO_FOCUS);
+               buttonCmp.setLayoutData(CmsUtils.fillWidth());
+               buttonCmp.setLayout(new GridLayout(2, false));
+               // 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");
+
                // 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;
 
@@ -52,6 +151,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) {
+                               NewUserWizard newUserWizard = new NewUserWizard(session,
+                                               userAdminService);
+                               WizardDialog dialog = new WizardDialog(addBtn.getShell(),
+                                               newUserWizard);
+                               if (dialog.open() == Dialog.OK)
+                                       userTableCmp.refresh();
+                       }
+               });
+
                // Configure
                // userTableCmp.getTableViewer().addDoubleClickListener(
                // new ViewDoubleClickListener());
@@ -73,8 +243,23 @@ public class Users implements CmsUiProvider {
                return userTableCmp;
        }
 
+       // protected Composite createUserPage(Composite parent) {
+       // parent.setLayout(CmsUtils.noSpaceGridLayout());
+       // ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE);
+       // scrolled.setLayoutData(CmsUtils.fillAll());
+       // scrolled.setLayout(CmsUtils.noSpaceGridLayout());
+       // // TODO manage style
+       // // CmsUtils.style(scrolled, "maintenance_user_form");
+       //
+       // Composite page = new Composite(scrolled, SWT.NONE);
+       // page.setLayout(CmsUtils.noSpaceGridLayout());
+       // page.setBackgroundMode(SWT.INHERIT_NONE);
+       //
+       // return page;
+       // }
+
        private boolean isAdmin(Node node) throws RepositoryException {
-               // FIXME clean this check one new user management policy has been
+               // FIXME clean this once new user management policy has been
                // implemented.
                AccessControlManager acm = node.getSession().getAccessControlManager();
                Privilege[] privs = new Privilege[1];
@@ -142,4 +327,18 @@ public class Users implements CmsUiProvider {
        // }
        // }
 
-}
+       /* DEPENDENCY INJECTION */
+       public void setWorkspaceName(String workspaceName) {
+               this.userWkspName = workspaceName;
+       }
+
+       public void setUserAdminService(UserAdminService userAdminService) {
+               this.userAdminService = userAdminService;
+               userPage.setUserAdminService(userAdminService);
+       }
+
+       public void setUserDetailsManager(UserDetailsManager userDetailsManager) {
+               // this.userDetailsManager = userDetailsManager;
+               // userPage.setUserDetailsManager(userDetailsManager);
+       }
+}
\ No newline at end of file