Better deal with missing layer when anonymous.
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteUi.java
index c2c3c8943d37678d67d8c75e564c18da203f2e7c..d93c3a8b38eb54de555474f13853e6d72646b28b 100644 (file)
@@ -8,8 +8,9 @@ import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeConstants;
-import org.argeo.api.NodeUtils;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.jcr.Jcr;
@@ -17,18 +18,18 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Composite;
 
-/** The {@link CmsView} for the work ergonomics of Argeo Suite. */
+/** The view for the default ergonomics of Argeo Suite. */
 class SuiteUi extends Composite {
        private static final long serialVersionUID = 6207018859086689108L;
-
+       private final static Log log = LogFactory.getLog(SuiteUi.class);
        private Composite header;
        private Composite belowHeader;
        private Composite leadPane;
        private Composite dynamicArea;
 
        private Session sysSession;
-       private Session homeSession;
-       private Node userHome;
+//     private Session homeSession;
+       private Node userDir;
 
        private Map<String, SuiteLayer> layers = new HashMap<>();
        private Map<String, Composite> workAreas = new HashMap<>();
@@ -89,29 +90,49 @@ class SuiteUi extends Composite {
 
        private Composite getLayer(String id, Node context) {
                if (!layers.containsKey(id))
-                       throw new IllegalArgumentException("No layer " + id + " is available.");
+                       return null;
                if (!workAreas.containsKey(id))
                        initLayer(id, layers.get(id), context);
                return workAreas.get(id);
        }
 
-       Composite switchToLayer(String layer, Node context) {
+       Composite switchToLayer(String layerId, Node context) {
+               Composite current = null;
                if (currentLayerId != null) {
-                       Composite current = getCurrentWorkArea();
-                       if (currentLayerId.equals(layer))
+                       current = getCurrentWorkArea();
+                       if (currentLayerId.equals(layerId))
                                return current;
                }
                if (context == null) {
                        if (!cmsView.isAnonymous())
-                               context = userHome;
+                               context = userDir;
                }
-               Composite toShow = getLayer(layer, context);
-               getDisplay().syncExec(() -> {
-                       toShow.moveAbove(null);
-                       dynamicArea.layout(true, true);
-               });
-               currentLayerId = layer;
-               return toShow;
+               Composite toShow = getLayer(layerId, context);
+               if (toShow != null) {
+                       currentLayerId = layerId;
+                       if (!isDisposed())
+                               getDisplay().syncExec(() -> {
+                                       if (!toShow.isDisposed())
+                                               toShow.moveAbove(null);
+                                       else
+                                               log.warn("Cannot show work area because it is disposed.");
+                                       dynamicArea.layout(true, true);
+                               });
+                       return toShow;
+               } else {
+                       return current;
+               }
+       }
+
+       Composite switchToLayer(SuiteLayer layer, Node context) {
+               // TODO make it more robust
+               for (String layerId : layers.keySet()) {
+                       SuiteLayer l = layers.get(layerId);
+                       if (layer == l) {
+                               return switchToLayer(layerId, context);
+                       }
+               }
+               throw new IllegalArgumentException("Layer is not registered.");
        }
 
        void addLayer(String id, SuiteLayer layer) {
@@ -134,6 +155,14 @@ class SuiteUi extends Composite {
                return workArea;
        }
 
+       synchronized void logout() {
+               userDir = null;
+               Jcr.logout(sysSession);
+//             Jcr.logout(homeSession);
+               currentLayerId = null;
+               workAreas.clear();
+       }
+
        /*
         * GETTERS / SETTERS
         */
@@ -154,22 +183,37 @@ class SuiteUi extends Composite {
 //             return sysSession;
 //     }
 //
-       void initSessions(Repository repository) throws RepositoryException {
+       synchronized void initSessions(Repository repository, String userDirPath) throws RepositoryException {
                this.sysSession = repository.login();
-               this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
-               userHome = NodeUtils.getUserHome(homeSession);
+//             this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
+               userDir = sysSession.getNode(userDirPath);
                addDisposeListener((e) -> {
                        Jcr.logout(sysSession);
-                       Jcr.logout(homeSession);
+//                     Jcr.logout(homeSession);
                });
        }
 
-       Node getUserHome() {
-               return userHome;
+       Node getUserDir() {
+               return userDir;
        }
 
        Session getSysSession() {
                return sysSession;
        }
 
+       Session getSession(String workspaceName) {
+               if (workspaceName == null)
+                       return sysSession;
+               if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
+                       return sysSession;
+//             else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
+//                     return homeSession;
+               else
+                       throw new IllegalArgumentException("Unknown workspace " + workspaceName);
+       }
+
+       public CmsView getCmsView() {
+               return cmsView;
+       }
+
 }