Suite user administration.
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteApp.java
index 44e7d3db4678abe9360949f9305ea1b54dd7919d..62e1a700a768356b444c35a42932c3cc5dcfc052 100644 (file)
@@ -18,14 +18,18 @@ import javax.jcr.nodetype.NodeType;
 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.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.entity.EntityConstants;
+import org.argeo.entity.EntityNames;
+import org.argeo.entity.EntityType;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.suite.RankedObject;
@@ -43,7 +47,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        public final static String HEADER_PID = PID_PREFIX + "header";
        public final static String LEAD_PANE_PID = PID_PREFIX + "leadPane";
        public final static String LOGIN_SCREEN_PID = PID_PREFIX + "loginScreen";
-       public final static String DASHBOARD_LAYER_PID = PID_PREFIX + "dashboardLayer";
+       // public final static String DASHBOARD_LAYER_PID = PID_PREFIX +
+       // "dashboardLayer";
        public final static String DASHBOARD_PID = PID_PREFIX + "dashboard";
        public final static String RECENT_ITEMS_PID = PID_PREFIX + "recentItems";
 
@@ -51,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 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 CmsUserManager cmsUserManager;
+
        // TODO make more optimal or via CmsSession/CmsView
        private Map<String, SuiteUi> managedUis = new HashMap<>();
 
@@ -137,7 +146,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 //                             ui.addLayer("documents");
 //                             ui.addLayer("locations");
 //                             ui.addLayer("people");
-                               ui.switchToLayer(DASHBOARD_LAYER_PID, context);
+                               // ui.switchToLayer(DASHBOARD_LAYER_PID, context);
 
 //                             refreshPart(findUiProvider(DASHBOARD_PID), ui.getTabbedArea().getCurrent(), context);
                                refreshPart(findUiProvider(LEAD_PANE_PID), ui.getLeadPane(), context);
@@ -162,6 +171,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        private CmsUiProvider findUiProvider(Node context) {
                try {
+                       // mixins
                        Set<String> types = new TreeSet<>();
                        for (NodeType nodeType : context.getMixinNodeTypes()) {
                                String typeName = nodeType.getName();
@@ -169,15 +179,33 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                        types.add(typeName);
                                }
                        }
-                       NodeType nodeType = context.getPrimaryNodeType();
-                       String typeName = nodeType.getName();
-                       if (uiProvidersByType.containsKey(typeName)) {
-                               types.add(typeName);
+                       // primary node type
+                       {
+                               NodeType nodeType = context.getPrimaryNodeType();
+                               String typeName = nodeType.getName();
+                               if (uiProvidersByType.containsKey(typeName)) {
+                                       types.add(typeName);
+                               }
+                               for (NodeType mixin : nodeType.getDeclaredSupertypes()) {
+                                       if (uiProvidersByType.containsKey(mixin.getName())) {
+                                               types.add(mixin.getName());
+                                       }
+                               }
+                       }
+                       // entity type
+                       if (context.isNodeType(EntityType.entity.get())) {
+                               if (context.hasProperty(EntityNames.ENTITY_TYPE)) {
+                                       String typeName = context.getProperty(EntityNames.ENTITY_TYPE).getString();
+                                       if (uiProvidersByType.containsKey(typeName)) {
+                                               types.add(typeName);
+                                       }
+                               }
                        }
+
 //                     if (context.getPath().equals("/")) {// root node
 //                             types.add("nt:folder");
 //                     }
-                       if (NodeUtils.isUserHome(context)) {// home node
+                       if (NodeUtils.isUserHome(context) && uiProvidersByType.containsKey("nt:folder")) {// home node
                                types.add("nt:folder");
                        }
 
@@ -305,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);
@@ -323,32 +370,37 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                }
        }
 
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
        @Override
        public void handleEvent(Event event) {
 
                // Specific UI related events
                SuiteUi ui = getRelatedUi(event);
-               String currentLayerId = ui.getCurrentLayerId();
-               SuiteLayer layer = layers.get(currentLayerId).get();
-               if (isTopic(event, SuiteEvent.refreshPart)) {
-                       String nodeId = get(event, SuiteEvent.NODE_ID);
-                       String workspace = get(event, SuiteEvent.WORKSPACE);
-                       Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
-                       CmsUiProvider uiProvider = findUiProvider(node);
-                       layer.view(uiProvider, ui.getCurrentWorkArea(), node);
-                       // ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID), node);
-//                     ui.layout(true, true);
-               } else if (isTopic(event, SuiteEvent.openNewPart)) {
-                       String nodeId = get(event, SuiteEvent.NODE_ID);
-                       String workspace = get(event, SuiteEvent.WORKSPACE);
-                       Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
-                       CmsUiProvider uiProvider = findUiProvider(node);
-                       layer.open(uiProvider, ui.getCurrentWorkArea(), node);
-//                     ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID), node);
-//                     ui.layout(true, true);
-               } else if (isTopic(event, SuiteEvent.switchLayer)) {
-                       String layerId = get(event, SuiteEvent.LAYER);
-                       ui.switchToLayer(layerId, null);
+               try {
+                       String currentLayerId = ui.getCurrentLayerId();
+                       SuiteLayer layer = currentLayerId != null ? layers.get(currentLayerId).get() : null;
+                       if (isTopic(event, SuiteEvent.refreshPart)) {
+                               String nodeId = get(event, SuiteEvent.NODE_ID);
+                               String workspace = get(event, SuiteEvent.WORKSPACE);
+                               Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+                               CmsUiProvider uiProvider = findUiProvider(node);
+                               layer.view(uiProvider, ui.getCurrentWorkArea(), node);
+                       } else if (isTopic(event, SuiteEvent.openNewPart)) {
+                               String nodeId = get(event, SuiteEvent.NODE_ID);
+                               String workspace = get(event, SuiteEvent.WORKSPACE);
+                               Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+                               CmsUiProvider uiProvider = findUiProvider(node);
+                               layer.open(uiProvider, ui.getCurrentWorkArea(), node);
+                       } else if (isTopic(event, SuiteEvent.switchLayer)) {
+                               String layerId = get(event, SuiteEvent.LAYER);
+                               ui.switchToLayer(layerId, Jcr.getRootNode(ui.getSession(null)));
+                       }
+               } catch (Exception e) {
+                       log.error("Cannot handle event " + event, e);
+//                     CmsView.getCmsView(ui).exception(e);
                }
 
        }