Implement lout at repository level in Data Explorer
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 6 Feb 2018 13:36:33 +0000 (14:36 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 6 Feb 2018 13:36:33 +0000 (14:36 +0100)
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/JcrDClickListener.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/NodeLabelProvider.java
org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/model/RepositoryElem.java

index 7c06db92292e3cf8b7ba1342f68fdcacae93c6f9..3cee13a2ccb0e211ee6d6f4271c35962128da7aa 100644 (file)
@@ -44,6 +44,7 @@ import org.argeo.cms.ui.workbench.util.CommandUtils;
 import org.argeo.eclipse.ui.EclipseUiException;
 import org.argeo.eclipse.ui.specific.OpenFile;
 import org.argeo.eclipse.ui.specific.SingleSourcingException;
+import org.argeo.jcr.JcrUtils;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
@@ -74,10 +75,12 @@ public class JcrDClickListener implements IDoubleClickListener {
                Object obj = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (obj instanceof RepositoryElem) {
                        RepositoryElem rpNode = (RepositoryElem) obj;
-                       if (!rpNode.isConnected()) {
+                       if (rpNode.isConnected()) {
+                               rpNode.logout();
+                       } else {
                                rpNode.login();
-                               nodeViewer.refresh(obj);
                        }
+                       nodeViewer.refresh(obj);
                } else if (obj instanceof WorkspaceElem) {
                        WorkspaceElem wn = (WorkspaceElem) obj;
                        if (wn.isConnected())
@@ -105,8 +108,8 @@ public class JcrDClickListener implements IDoubleClickListener {
                                        // we copy the node to a tmp file to be opened as a dirty
                                        // workaround
                                        File tmpFile = null;
-                                       OutputStream os = null;
-                                       InputStream is = null;
+                                       // OutputStream os = null;
+                                       // InputStream is = null;
                                        int i = name.lastIndexOf('.');
                                        String prefix, suffix;
                                        if (i == -1) {
@@ -116,18 +119,20 @@ public class JcrDClickListener implements IDoubleClickListener {
                                                prefix = name.substring(0, i);
                                                suffix = name.substring(i);
                                        }
-                                       try {
+                                       Binary binary = null;
+                                       try (OutputStream os = new FileOutputStream(tmpFile)) {
                                                tmpFile = File.createTempFile(prefix, suffix);
                                                tmpFile.deleteOnExit();
-                                               os = new FileOutputStream(tmpFile);
-                                               Binary binary = node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
-                                               is = binary.getStream();
-                                               IOUtils.copy(is, os);
+                                               binary = node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
+                                               try (InputStream is = binary.getStream();) {
+                                                       IOUtils.copy(is, os);
+                                               }
                                        } catch (IOException e) {
                                                throw new SingleSourcingException("Cannot open file " + prefix + "." + suffix, e);
                                        } finally {
-                                               IOUtils.closeQuietly(is);
-                                               IOUtils.closeQuietly(os);
+                                               // IOUtils.closeQuietly(is);
+                                               // IOUtils.closeQuietly(os);
+                                               JcrUtils.closeQuietly(binary);
                                        }
                                        Path path = Paths.get(tmpFile.getAbsolutePath());
                                        String uri = path.toUri().toString();
index 35c178250ea950e827dafa9bacba3e763c630e51..d409812e088fc41ac237ed27a4cf40572a65f22b 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.argeo.cms.ui.workbench.internal.jcr;
 
+import javax.jcr.NamespaceException;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
@@ -28,6 +29,7 @@ import org.argeo.cms.ui.workbench.internal.jcr.model.SingleJcrNodeElem;
 import org.argeo.cms.ui.workbench.internal.jcr.model.WorkspaceElem;
 import org.argeo.cms.ui.workbench.jcr.JcrImages;
 import org.argeo.eclipse.ui.EclipseUiException;
+import org.argeo.naming.LdapAttrs;
 import org.argeo.node.NodeTypes;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.swt.graphics.Image;
@@ -48,8 +50,7 @@ public class NodeLabelProvider extends ColumnLabelProvider {
                        } else
                                return super.getText(element);
                } catch (RepositoryException e) {
-                       throw new EclipseUiException(
-                                       "Unexpected JCR error while getting node name.");
+                       throw new EclipseUiException("Unexpected JCR error while getting node name.");
                }
        }
 
@@ -59,8 +60,7 @@ public class NodeLabelProvider extends ColumnLabelProvider {
                for (NodeType type : node.getMixinNodeTypes())
                        mixins.append(' ').append(type.getName());
 
-               return label + " [" + node.getPrimaryNodeType().getName() + mixins
-                               + "]";
+               return label + " [" + node.getPrimaryNodeType().getName() + mixins + "]";
        }
 
        @Override
@@ -110,13 +110,16 @@ public class NodeLabelProvider extends ColumnLabelProvider {
                                return JcrImages.FOLDER;
                        else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_RESOURCE))
                                return JcrImages.BINARY;
-                       else if (node.isNodeType(NodeTypes.NODE_USER_HOME))
-                               return JcrImages.HOME;
-                       else
-                               return JcrImages.NODE;
+                       try {
+                               // optimizes
+                               if (node.hasProperty(LdapAttrs.uid.property()) && node.isNodeType(NodeTypes.NODE_USER_HOME))
+                                       return JcrImages.HOME;
+                       } catch (NamespaceException e) {
+                               // node namespace is not registered in this repo
+                       }
+                       return JcrImages.NODE;
                } catch (RepositoryException e) {
-                       log.warn("Error while retrieving type for " + node
-                                       + " in order to display corresponding image");
+                       log.warn("Error while retrieving type for " + node + " in order to display corresponding image");
                        e.printStackTrace();
                        return null;
                }
index 118ab23febee05cbf0ddc3c03724eb71ae82400a..116aeeeb52bd4944224e0a6e5429a8ca417e5773 100644 (file)
@@ -21,11 +21,13 @@ import javax.jcr.Session;
 
 import org.argeo.eclipse.ui.EclipseUiException;
 import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.JcrUtils;
 
 /**
- * UI Tree component that wraps a JCR {@link Repository}. It also keeps a reference
- * to its parent Tree Ui component; typically the unique {@link RepositoriesElem}
- * object of the current view to enable bi-directionnal browsing in the tree.
+ * UI Tree component that wraps a JCR {@link Repository}. It also keeps a
+ * reference to its parent Tree Ui component; typically the unique
+ * {@link RepositoriesElem} object of the current view to enable bi-directionnal
+ * browsing in the tree.
  */
 
 public class RepositoryElem extends TreeParent {
@@ -44,8 +46,7 @@ public class RepositoryElem extends TreeParent {
        public void login() {
                try {
                        defaultSession = repositoryLogin("main");
-                       String[] wkpNames = defaultSession.getWorkspace()
-                                       .getAccessibleWorkspaceNames();
+                       String[] wkpNames = defaultSession.getWorkspace().getAccessibleWorkspaceNames();
                        for (String wkpName : wkpNames) {
                                if (wkpName.equals(defaultSession.getWorkspace().getName()))
                                        addChild(new WorkspaceElem(this, wkpName, defaultSession));
@@ -57,13 +58,21 @@ public class RepositoryElem extends TreeParent {
                }
        }
 
+       public synchronized void logout() {
+               for (Object child : getChildren()) {
+                       if (child instanceof WorkspaceElem)
+                               ((WorkspaceElem) child).logout();
+               }
+               clearChildren();
+               JcrUtils.logoutQuietly(defaultSession);
+               defaultSession = null;
+       }
+
        /**
-        * 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 {
+       protected Session repositoryLogin(String workspaceName) throws RepositoryException {
                return repository.login(workspaceName);
        }