Stabilize JCR explorer
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Aug 2012 14:35:29 +0000 (14:35 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Aug 2012 14:35:29 +0000 (14:35 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@5526 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeLabelProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/RepositoryNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/SingleJcrNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/model/WorkspaceNode.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/GenericNodeDoubleClickListener.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrUiUtils.java

index adbd56d68f3b08a7c5a0787373d3fc00a923480a..ce679dd96b28b636095fea94ecca62a01b1ffe73 100644 (file)
@@ -58,20 +58,20 @@ public class NodeLabelProvider extends DefaultNodeLabelProvider {
        @Override
        public Image getImage(Object element) {
                if (element instanceof RemoteRepositoryNode) {
-                       if (((RemoteRepositoryNode) element).getDefaultSession() == null)
-                               return JcrImages.REMOTE_DISCONNECTED;
-                       else
+                       if (((RemoteRepositoryNode) element).isConnected())
                                return JcrImages.REMOTE_CONNECTED;
-               } else if (element instanceof RepositoryNode) {
-                       if (((RepositoryNode) element).getDefaultSession() == null)
-                               return JcrImages.REPOSITORY_DISCONNECTED;
                        else
+                               return JcrImages.REMOTE_DISCONNECTED;
+               } else if (element instanceof RepositoryNode) {
+                       if (((RepositoryNode) element).isConnected())
                                return JcrImages.REPOSITORY_CONNECTED;
-               } else if (element instanceof WorkspaceNode) {
-                       if (((WorkspaceNode) element).getSession() == null)
-                               return JcrImages.WORKSPACE_DISCONNECTED;
                        else
+                               return JcrImages.REPOSITORY_DISCONNECTED;
+               } else if (element instanceof WorkspaceNode) {
+                       if (((WorkspaceNode) element).isConnected())
                                return JcrImages.WORKSPACE_CONNECTED;
+                       else
+                               return JcrImages.WORKSPACE_DISCONNECTED;
                } else if (element instanceof RepositoriesNode) {
                        return JcrImages.REPOSITORIES;
                } else if (element instanceof SingleJcrNode)
index 0b73254855b513064b043b0482dfb35e3245c2db..9d54647d7e77a59dc1d440b0657f6d1132c87189 100644 (file)
@@ -49,9 +49,6 @@ public class RepositoryNode extends TreeParent implements UiNode {
 
        public void login() {
                try {
-                       // SimpleCredentials sc = new SimpleCredentials("root",
-                       // "demo".toCharArray());
-                       // defaultSession = repository.login(sc);
                        defaultSession = repositoryLogin(null);
                        String[] wkpNames = defaultSession.getWorkspace()
                                        .getAccessibleWorkspaceNames();
@@ -66,14 +63,22 @@ public class RepositoryNode extends TreeParent implements UiNode {
                }
        }
 
-       /** Actual call to the {@link Repository#login(javax.jcr.Credentials, String)} method. To be overridden.*/
+       /**
+        * Actual call to the
+        * {@link Repository#login(javax.jcr.Credentials, String)} method. To be
+        * overridden.
+        */
        protected Session repositoryLogin(String workspaceName)
                        throws RepositoryException {
                return repository.login(workspaceName);
        }
 
-       public Session getDefaultSession() {
-               return defaultSession;
+       public String[] getAccessibleWorkspaceNames() {
+               try {
+                       return defaultSession.getWorkspace().getAccessibleWorkspaceNames();
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot retrieve workspace names", e);
+               }
        }
 
        /** returns the {@link Repository} referenced by the current UI Node */
@@ -85,4 +90,10 @@ public class RepositoryNode extends TreeParent implements UiNode {
                return alias;
        }
 
+       public Boolean isConnected() {
+               if (defaultSession != null && defaultSession.isLive())
+                       return true;
+               else
+                       return false;
+       }
 }
index e3bf2056606f1e8fc1b5458653cc40260283df0b..1da156a9ba2477f690cf4604fd5517f7ae9f8495 100644 (file)
@@ -107,7 +107,10 @@ public class SingleJcrNode extends TreeParent implements UiNode {
        @Override
        public boolean hasChildren() {
                try {
-                       return node.hasNodes();
+                       if (node.getSession().isLive())
+                               return node.hasNodes();
+                       else
+                               return false;
                } catch (RepositoryException re) {
                        throw new ArgeoException(
                                        "Unexpected error while checking children node existence",
index f73312d52ea3d7d664fd287684c0f7fe5d707ad5..38470332208bdc4b06887e87192867d77266e305 100644 (file)
@@ -20,18 +20,17 @@ import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Workspace;
-import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventListener;
 
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.JcrUtils;
 
 /**
  * UI Tree component. Wraps the root node of a JCR {@link Workspace}. It also
  * keeps a reference to its parent {@link RepositoryNode}, to be able to
  * retrieve alias of the current used repository
  */
-public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
+public class WorkspaceNode extends TreeParent implements UiNode {
        private Session session = null;
 
        public WorkspaceNode(RepositoryNode parent, String name) {
@@ -41,8 +40,6 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
        public WorkspaceNode(RepositoryNode parent, String name, Session session) {
                super(name);
                this.session = session;
-               if (session != null)
-                       processNewSession(session);
                setParent(parent);
        }
 
@@ -64,16 +61,20 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
 
        public void login() {
                try {
-                       logout();
                        session = ((RepositoryNode) getParent()).repositoryLogin(getName());
-                       processNewSession(session);
-
                } catch (RepositoryException e) {
                        throw new ArgeoException("Cannot connect to repository "
                                        + getName(), e);
                }
        }
 
+       public Boolean isConnected() {
+               if (session != null && session.isLive())
+                       return true;
+               else
+                       return false;
+       }
+
        @Override
        public synchronized void dispose() {
                logout();
@@ -82,16 +83,8 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
 
        /** Logouts the session, does not nothing if there is no live session. */
        public void logout() {
-               try {
-                       if (session != null && session.isLive()) {
-                               session.getWorkspace().getObservationManager()
-                                               .removeEventListener(this);
-                               session.logout();
-                       }
-               } catch (RepositoryException e) {
-                       throw new ArgeoException("Cannot connect to repository "
-                                       + getName(), e);
-               }
+               clearChildren();
+               JcrUtils.logoutQuietly(session);
        }
 
        /** Returns the alias of the parent Repository */
@@ -102,10 +95,10 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
        @Override
        public boolean hasChildren() {
                try {
-                       if (session == null)
-                               return false;
-                       else
+                       if (isConnected())
                                return session.getRootNode().hasNodes();
+                       else
+                               return false;
                } catch (RepositoryException re) {
                        throw new ArgeoException(
                                        "Unexpected error while checking children node existence",
@@ -139,49 +132,4 @@ public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
                        }
                }
        }
-
-       public void onEvent(final EventIterator events) {
-               // if (session == null)
-               // return;
-               // Display.getDefault().syncExec(new Runnable() {
-               // public void run() {
-               // while (events.hasNext()) {
-               // Event event = events.nextEvent();
-               // try {
-               // String path = event.getPath();
-               // String parentPath = path.substring(0,
-               // path.lastIndexOf('/'));
-               // final Object parent;
-               // if (parentPath.equals("/") || parentPath.equals(""))
-               // parent = this;
-               // else if (session.itemExists(parentPath)){
-               // parent = session.getItem(parentPath);
-               // ((Item)parent).refresh(false);
-               // }
-               // else
-               // parent = null;
-               // if (parent != null) {
-               // nodesViewer.refresh(parent);
-               // }
-               //
-               // } catch (RepositoryException e) {
-               // log.warn("Error processing event " + event, e);
-               // }
-               // }
-               // }
-               // });
-       }
-
-       protected void processNewSession(Session session) {
-               // try {
-               // ObservationManager observationManager = session.getWorkspace()
-               // .getObservationManager();
-               // observationManager.addEventListener(this, Event.NODE_ADDED
-               // | Event.NODE_REMOVED, "/", true, null, null, false);
-               // } catch (RepositoryException e) {
-               // throw new ArgeoException("Cannot process new session "
-               // + session, e);
-               // }
-       }
-
 }
index 65a009eefb2ea2f3478d6a21ec7c471566657580..2d700f707b3031c56a306db118583033c853bd2d 100644 (file)
@@ -59,13 +59,17 @@ public class GenericNodeDoubleClickListener implements IDoubleClickListener {
                                .getFirstElement();
                if (obj instanceof RepositoryNode) {
                        RepositoryNode rpNode = (RepositoryNode) obj;
-                       if (rpNode.getChildren().length == 0) {
+                       if (!rpNode.isConnected()) {
                                rpNode.login();
                                nodeViewer.refresh(obj);
                        }
                        // else do nothing
                } else if (obj instanceof WorkspaceNode) {
-                       ((WorkspaceNode) obj).login();
+                       WorkspaceNode wn = (WorkspaceNode) obj;
+                       if (wn.isConnected())
+                               wn.logout();
+                       else
+                               wn.login();
                        nodeViewer.refresh(obj);
                } else if (obj instanceof SingleJcrNode) {
                        SingleJcrNode sjn = (SingleJcrNode) obj;
index 414bd1a7b123974e22fb92a5c523c861d6d12ad4..af06ba22074a1e863dea1dc60a354367614bf164 100644 (file)
@@ -47,8 +47,7 @@ public class JcrUiUtils {
                                doRefresh = true;
                        else if (element instanceof RepositoryNode) {
                                RepositoryNode rn = (RepositoryNode) element;
-                               String[] wkpNames = rn.getDefaultSession().getWorkspace()
-                                               .getAccessibleWorkspaceNames();
+                               String[] wkpNames = rn.getAccessibleWorkspaceNames();
                                if (element.getChildren().length != wkpNames.length)
                                        doRefresh = true;
                        } else if (element instanceof RepositoriesNode) {