From 95215042df996ee0658c04a38fa6099c1e03cc56 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 6 Feb 2018 14:36:33 +0100 Subject: [PATCH] Implement lout at repository level in Data Explorer --- .../internal/jcr/JcrDClickListener.java | 27 ++++++++++------- .../internal/jcr/NodeLabelProvider.java | 23 ++++++++------- .../internal/jcr/model/RepositoryElem.java | 29 ++++++++++++------- 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/JcrDClickListener.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/JcrDClickListener.java index 7c06db922..3cee13a2c 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/JcrDClickListener.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/JcrDClickListener.java @@ -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(); diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/NodeLabelProvider.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/NodeLabelProvider.java index 35c178250..d409812e0 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/NodeLabelProvider.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/NodeLabelProvider.java @@ -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; } diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/model/RepositoryElem.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/model/RepositoryElem.java index 118ab23fe..116aeeeb5 100644 --- a/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/model/RepositoryElem.java +++ b/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/model/RepositoryElem.java @@ -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); } -- 2.30.2