Suite user administration.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 23 Nov 2020 18:22:16 +0000 (19:22 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 23 Nov 2020 18:22:16 +0000 (19:22 +0100)
org.argeo.entity.api/src/org/argeo/entity/EntityType.java
org.argeo.entity.api/src/org/argeo/entity/entity.cnd
org.argeo.suite.ui/OSGI-INF/cmsApp.xml
org.argeo.suite.ui/src/org/argeo/suite/ui/AdminEntryArea.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUserUiProvider.java

index 822bbd98c19304b65efb7aeed193bdf47498cd57..408b142c35fe4230b5782c2680a44d0faacfc86e 100644 (file)
@@ -11,7 +11,7 @@ public enum EntityType implements JcrName {
        // graphics
        box,
        // ldap
        // graphics
        box,
        // ldap
-       person;
+       person, user;
 
        @Override
        public String getPrefix() {
 
        @Override
        public String getPrefix() {
index 8a6b2e084d2a607c52f27244e32722ec194c0eb6..85da6506de449c819d0b484f8e61384a1e82138d 100644 (file)
@@ -74,3 +74,7 @@ mixin
 mixin
 - ldap:sn (String)
 - ldap:givenName (String)
 mixin
 - ldap:sn (String)
 - ldap:givenName (String)
+
+[entity:user] > entity:person
+- ldap:uid (String)
+
index 6818fb8484ec5fd1363f48479dcb09db9c8f5f61..e42eeeb367e0861c15dd0707e08b1d724add8098 100644 (file)
@@ -10,4 +10,5 @@
    <reference bind="addTheme" cardinality="1..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
    <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="dynamic" target="(cn=ego)"/>
    <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
    <reference bind="addTheme" cardinality="1..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
    <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="dynamic" target="(cn=ego)"/>
    <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
 </scr:component>
 </scr:component>
index fd390f51d5288a03fe6b13df2aa03df7e7d8806f..0e7d2d87d600fc49de998e6fe583ab48b5c7d462 100644 (file)
 package org.argeo.suite.ui;
 
 package org.argeo.suite.ui;
 
+import java.util.Set;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
+import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityType;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.naming.LdapAttrs;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+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.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.osgi.service.useradmin.User;
 
 
+/** Entry to the admin area. */
 public class AdminEntryArea implements CmsUiProvider {
 
 public class AdminEntryArea implements CmsUiProvider {
 
+       private CmsUserManager cmsUserManager;
+
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
-               // TODO Auto-generated method stub
-               return null;
+               CmsTheme theme = CmsTheme.getCmsTheme(parent);
+               parent.setLayout(new GridLayout());
+               TableViewer usersViewer = new TableViewer(parent);
+               usersViewer.setContentProvider(new UsersContentProvider());
+
+               TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               idCol.getColumn().setWidth(70);
+               idCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.uid.name());
+                       }
+               });
+
+               TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               givenNameCol.getColumn().setWidth(70);
+               givenNameCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.givenName.name());
+                       }
+               });
+
+               TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               snCol.getColumn().setWidth(70);
+               snCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.sn.name());
+                       }
+               });
+
+               TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
+               mailCol.getColumn().setWidth(200);
+               mailCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+
+                               return getUserProperty(element, LdapAttrs.mail.name());
+                       }
+               });
+
+               Composite bottom = new Composite(parent, SWT.NONE);
+               bottom.setLayoutData(CmsUiUtils.fillWidth());
+               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
+               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
+               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
+               deleteItem.setEnabled(false);
+//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
+               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
+               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
+               addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
+               usersViewer.addDoubleClickListener(new IDoubleClickListener() {
+
+                       @Override
+                       public void doubleClick(DoubleClickEvent event) {
+                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+                               if (user != null) {
+                                       Node userNode = getOrCreateUserNode(user, context);
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
+                                                       SuiteEvent.eventProperties(userNode));
+                               }
+
+                       }
+               });
+               usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
+                               if (user != null) {
+                                       Node userNode = getOrCreateUserNode(user, context);
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
+                                                       SuiteEvent.eventProperties(userNode));
+                                       deleteItem.setEnabled(true);
+                               } else {
+                                       deleteItem.setEnabled(false);
+                               }
+                       }
+               });
+
+               usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
+               usersViewer.setInput(cmsUserManager);
+
+               return usersViewer.getTable();
+       }
+
+       private Node getOrCreateUserNode(User user, Node context) {
+               return JcrUtils.mkdirs(Jcr.getSession(context),
+                               "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
+                               EntityType.user.get());
+       }
+
+       private String getUserProperty(Object element, String key) {
+               Object value = ((User) element).getProperties().get(key);
+               return value != null ? value.toString() : null;
+       }
+
+       class UsersContentProvider implements IStructuredContentProvider {
+
+               @Override
+               public Object[] getElements(Object inputElement) {
+                       CmsUserManager cum = (CmsUserManager) inputElement;
+                       String baseGroup = "cn=apaf-coworker,cn=groups,cn=accounts,dc=id,dc=argeo,dc=pro";
+                       Set<User> users = cum.listUsersInGroup(baseGroup, null);
+                       return users.toArray();
+               }
+
+               @Override
+               public void dispose() {
+               }
+
+               @Override
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
        }
 
 }
        }
 
 }
index ecb9ff781dbf0dd3eb8b21b0183ab0e57562834a..62e1a700a768356b444c35a42932c3cc5dcfc052 100644 (file)
@@ -18,10 +18,12 @@ import javax.jcr.nodetype.NodeType;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeUtils;
+import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.ui.AbstractCmsApp;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.AbstractCmsApp;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.MvcProvider;
 import org.argeo.cms.ui.dialogs.CmsFeedback;
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.dialogs.CmsFeedback;
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.cms.ui.util.CmsUiUtils;
@@ -54,9 +56,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
        private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
+//     private Map<String, RankedObject<MvcProvider<?, ?, ?>>> mvcProvidersByPid = Collections
+//                     .synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
 
+       private CmsUserManager cmsUserManager;
+
        // TODO make more optimal or via CmsSession/CmsView
        private Map<String, SuiteUi> managedUis = new HashMap<>();
 
        // TODO make more optimal or via CmsSession/CmsView
        private Map<String, SuiteUi> managedUis = new HashMap<>();
 
@@ -327,6 +333,25 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        }
 
 
        }
 
+//     public void addMvcProvider(MvcProvider<?, ?, ?> uiProvider, Map<String, Object> properties) {
+//             if (properties.containsKey(Constants.SERVICE_PID)) {
+//                     String pid = (String) properties.get(Constants.SERVICE_PID);
+//                     RankedObject.putIfHigherRank(mvcProvidersByPid, pid, uiProvider, properties);
+//             }
+//     }
+//
+//     public void removeMvcProvider(MvcProvider<?, ?, ?> uiProvider, Map<String, Object> properties) {
+//             if (properties.containsKey(Constants.SERVICE_PID)) {
+//                     String pid = (String) properties.get(Constants.SERVICE_PID);
+//                     if (mvcProvidersByPid.containsKey(pid)) {
+//                             if (mvcProvidersByPid.get(pid).equals(new RankedObject<MvcProvider<?, ?, ?>>(uiProvider, properties))) {
+//                                     mvcProvidersByPid.remove(pid);
+//                             }
+//                     }
+//             }
+//
+//     }
+
        public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
        public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
@@ -345,6 +370,10 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                }
        }
 
                }
        }
 
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
        @Override
        public void handleEvent(Event event) {
 
        @Override
        public void handleEvent(Event event) {
 
index 99e49880e1b6e7925cd184b8bd9a1d5dc6efab9a..a77dc7a87629c0b9294e1dee4ae00c3ea2c48f71 100644 (file)
@@ -7,6 +7,7 @@ import javax.jcr.Node;
 
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.jcr.Jcr;
 
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.jcr.Jcr;
+import org.osgi.service.useradmin.User;
 
 /** Events specific to Argeo Suite. */
 public enum SuiteEvent implements CmsEvent {
 
 /** Events specific to Argeo Suite. */
 public enum SuiteEvent implements CmsEvent {
@@ -14,6 +15,7 @@ public enum SuiteEvent implements CmsEvent {
 
        public final static String LAYER = "layer";
        public final static String NODE_ID = "nodeId";
 
        public final static String LAYER = "layer";
        public final static String NODE_ID = "nodeId";
+       public final static String USERNAME = "username";
        public final static String WORKSPACE = "workspace";
 
        public String getTopicBase() {
        public final static String WORKSPACE = "workspace";
 
        public String getTopicBase() {
@@ -26,4 +28,10 @@ public enum SuiteEvent implements CmsEvent {
                properties.put(WORKSPACE, Jcr.getWorkspaceName(node));
                return properties;
        }
                properties.put(WORKSPACE, Jcr.getWorkspaceName(node));
                return properties;
        }
+
+       public static Map<String, Object> eventProperties(User user) {
+               Map<String, Object> properties = new HashMap<>();
+               properties.put(USERNAME, user.getName());
+               return properties;
+       }
 }
 }
index 8320f7618e1ee5180fe85d48c0120ef6138ea235..3d1e938eaacd3bbd59e251c1ffe6c14ef09515d4 100644 (file)
@@ -106,10 +106,11 @@ class SuiteUi extends Composite {
                                context = userHome;
                }
                Composite toShow = getLayer(layer, context);
                                context = userHome;
                }
                Composite toShow = getLayer(layer, context);
-               getDisplay().syncExec(() -> {
-                       toShow.moveAbove(null);
-                       dynamicArea.layout(true, true);
-               });
+               if (!isDisposed())
+                       getDisplay().syncExec(() -> {
+                               toShow.moveAbove(null);
+                               dynamicArea.layout(true, true);
+                       });
                currentLayerId = layer;
                return toShow;
        }
                currentLayerId = layer;
                return toShow;
        }
index 4ec1bfc7ff1943d272a6b8824ffa40af29936977..0a351618f25d6843a2476e773cf97f2499af2f41 100644 (file)
@@ -3,16 +3,63 @@ package org.argeo.suite.ui;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
+import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.naming.LdapAttrs;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.service.useradmin.User;
 
 
+/** Edit a suite user. */
 public class SuiteUserUiProvider implements CmsUiProvider {
 public class SuiteUserUiProvider implements CmsUiProvider {
+       private CmsUserManager cmsUserManager;
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
-               // TODO Auto-generated method stub
-               return null;
+               Section main = new Section(parent, SWT.NONE, context);
+               main.setLayoutData(CmsUiUtils.fillAll());
+
+               String uid = context.getName();
+               User user = cmsUserManager.getUserFromLocalId(uid);
+
+               Text givenName = new Text(main, SWT.SINGLE);
+               givenName.setText(getUserProperty(user, LdapAttrs.givenName.name()));
+
+               Text sn = new Text(main, SWT.SINGLE);
+               sn.setText(getUserProperty(user, LdapAttrs.sn.name()));
+
+               Text email = new Text(main, SWT.SINGLE);
+               email.setText(getUserProperty(user, LdapAttrs.mail.name()));
+
+               Label lbl = new Label(main, SWT.NONE);
+               lbl.setText(uid);
+
+               Label dnL = new Label(main, SWT.NONE);
+               dnL.setText(user.getName());
+
+               // roles
+               Section rolesSection = new Section(main, SWT.NONE, context);
+               new Label(rolesSection, SWT.NONE).setText("Roles:");
+               String[] roles = cmsUserManager.getUserRoles(user.getName());
+               for (String role : roles) {
+                       new Label(rolesSection, SWT.NONE).setText(role);
+               }
+
+               return lbl;
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+       private String getUserProperty(Object element, String key) {
+               Object value = ((User) element).getProperties().get(key);
+               return value != null ? value.toString() : null;
        }
 
 }
        }
 
 }