Fix stack overflow after logout.
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteApp.java
index db8a8dc17e0d589d01d2ae0de04580bfe0e7744d..5f251d53bf74383400325ac6cf29b33d7c24d789 100644 (file)
@@ -136,7 +136,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                        Session adminSession = null;
                                        try {
                                                adminSession = NodeUtils.openDataAdminSession(getRepository(), null);
-                                               Node userDir = SuiteUtils.getOrCreateSessionDir(adminSession, cmsSession);
+                                               Node userDir = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
                                                ui.initSessions(getRepository(), userDir.getPath());
                                        } finally {
                                                Jcr.logout(adminSession);
@@ -172,6 +172,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        }
 
        private <T> T findByType(Map<String, RankedObject<T>> byType, Node context) {
+               if (context == null)
+                       throw new IllegalArgumentException("A node should be provided");
                try {
                        // mixins
                        Set<String> types = new TreeSet<>();
@@ -224,8 +226,22 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        @Override
        public void setState(Composite parent, String state) {
-               if (state == null || !state.startsWith("/"))
+               if (state == null || state.equals("~"))
                        return;
+               if (!state.startsWith("/") && !state.equals("~")) {
+                       if (parent instanceof SuiteUi) {
+                               SuiteUi ui = (SuiteUi) parent;
+                               String currentLayerId = ui.getCurrentLayerId();
+                               if (state.equals(currentLayerId))
+                                       return; // does nothing
+                               else {
+                                       Map<String, Object> properties = new HashMap<>();
+                                       properties.put(SuiteEvent.LAYER, state);
+                                       ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties);
+                               }
+                       }
+                       return;
+               }
                SuiteUi suiteUi = (SuiteUi) parent;
                Node node = stateToNode(suiteUi, state);
                if (node == null) {
@@ -234,45 +250,6 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                        suiteUi.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
                        suiteUi.getCmsView().sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
                }
-
-//             CmsView cmsView = CmsView.getCmsView(parent);
-//             if (cmsView.isAnonymous())
-//                     return;
-//             Session session = null;
-//             try {
-//                     if (state != null && state.startsWith("/")) {
-//                             String path = state.substring(1);
-//                             String workspace;
-//                             if (path.equals("")) {
-//                                     workspace = null;
-//                                     path = "/";
-//                             } else {
-//                                     int index = path.indexOf('/');
-//                                     if (index == 0) {
-//                                             log.error("Cannot interpret " + state);
-//                                             cmsView.navigateTo("~");
-//                                             return;
-//                                     } else if (index > 0) {
-//                                             workspace = path.substring(0, index);
-//                                             path = path.substring(index);
-//                                     } else {// index<0, assuming root node
-//                                             workspace = path;
-//                                             path = "/";
-//                                     }
-//                             }
-//                             session = cmsView.doAs(() -> Jcr.login(getRepository(), workspace));
-//
-//                             Node node = session.getNode(path);
-//
-//                             cmsView.sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
-//                             cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
-//                     }
-//             } catch (RepositoryException e) {
-//                     log.error("Cannot load state " + state, e);
-//                     cmsView.navigateTo("~");
-//             } finally {
-//                     JcrUtils.logoutQuietly(session);
-//             }
        }
 
        private String nodeToState(Node node) {
@@ -282,7 +259,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        private Node stateToNode(SuiteUi suiteUi, String state) {
                if (suiteUi == null)
                        return null;
-               if (state == null)
+               if (state == null || !state.startsWith("/"))
                        return null;
 
                String path = state.substring(1);
@@ -304,8 +281,6 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                path = "/";
                        }
                }
-//             session = cmsView.doAs(() -> Jcr.login(getRepository(), workspace));
-
                Session session = suiteUi.getSession(workspace);
                if (session == null)
                        return null;
@@ -323,27 +298,37 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                // Specific UI related events
                SuiteUi ui = getRelatedUi(event);
                try {
-                       String currentLayerId = ui.getCurrentLayerId();
-                       SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null;
+//                     String currentLayerId = ui.getCurrentLayerId();
+//                     SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null;
                        if (isTopic(event, SuiteEvent.refreshPart)) {
                                Node node = getNode(ui, event);
+                               if (node == null)
+                                       return;
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
-                               currentLayer.view(uiProvider, ui.getCurrentWorkArea(), node);
+                               SuiteLayer layer = findByType(layersByType, node);
+                               ui.switchToLayer(layer, node);
+                               ui.getCmsView().runAs(() -> layer.view(uiProvider, ui.getCurrentWorkArea(), node));
                                ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node));
                        } else if (isTopic(event, SuiteEvent.openNewPart)) {
                                Node node = getNode(ui, event);
+                               if (node == null)
+                                       return;
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
-                               currentLayer.open(uiProvider, ui.getCurrentWorkArea(), node);
+                               SuiteLayer layer = findByType(layersByType, node);
+                               ui.switchToLayer(layer, node);
+                               ui.getCmsView().runAs(() -> layer.open(uiProvider, ui.getCurrentWorkArea(), node));
                                ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node));
                        } else if (isTopic(event, SuiteEvent.switchLayer)) {
                                String layerId = get(event, SuiteEvent.LAYER);
                                if (layerId != null) {
-                                       ui.switchToLayer(layerId, Jcr.getRootNode(ui.getSession(null)));
+//                                     ui.switchToLayer(layerId, ui.getUserDir());
+                                       ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir()));
+                                       ui.getCmsView().navigateTo(layerId);
                                } else {
                                        Node node = getNode(ui, event);
                                        if (node != null) {
                                                SuiteLayer layer = findByType(layersByType, node);
-                                               ui.switchToLayer(layer, node);
+                                               ui.getCmsView().runAs(() -> ui.switchToLayer(layer, node));
                                        }
                                }
                        }