From: Mathieu Baudier Date: Sun, 27 Mar 2011 14:52:26 +0000 (+0000) Subject: Improve JCR explorer X-Git-Tag: argeo-commons-2.1.30~1301 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=c813b98b8339977ff0fb5f6209b54e5852d3ff6e;p=lgpl%2Fargeo-commons.git Improve JCR explorer git-svn-id: https://svn.argeo.org/commons/trunk@4384 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java index f8a5de98f..6a3967de6 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java @@ -12,6 +12,7 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; import org.argeo.ArgeoException; +import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; @@ -19,8 +20,22 @@ import org.eclipse.jface.viewers.Viewer; public class NodeContentProvider implements ITreeContentProvider { private ItemComparator itemComparator = new ItemComparator(); + private RepositoryRegister repositoryRegister; + private Session userSession; + + public NodeContentProvider(Session userSession, + RepositoryRegister repositoryRegister) { + this.userSession = userSession; + this.repositoryRegister = repositoryRegister; + } + public Object[] getElements(Object inputElement) { - return getChildren(inputElement); + List objs = new ArrayList(); + if (userSession != null) + objs.add(JcrUtils.getUserHome(userSession)); + if (repositoryRegister != null) + objs.add(repositoryRegister); + return objs.toArray(); } public Object[] getChildren(Object parentElement) { @@ -57,7 +72,10 @@ public class NodeContentProvider implements ITreeContentProvider { try { if (element instanceof Node) { Node node = (Node) element; + if(!node.getPath().equals("/")) return node.getParent(); + else + return null; } return null; } catch (RepositoryException e) { @@ -73,6 +91,8 @@ public class NodeContentProvider implements ITreeContentProvider { return ((RepositoryNode) element).hasChildren(); } else if (element instanceof WorkspaceNode) { return ((WorkspaceNode) element).getSession() != null; + } else if (element instanceof RepositoryRegister) { + return ((RepositoryRegister) element).getRepositories().size() > 0; } return false; } catch (RepositoryException e) { diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java index 71157aae1..a3ff38fc0 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java @@ -6,6 +6,8 @@ import javax.jcr.nodetype.NodeType; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.jcr.JcrUiPlugin; +import org.argeo.jcr.ArgeoTypes; +import org.argeo.jcr.RepositoryRegister; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; @@ -19,33 +21,24 @@ public class NodeLabelProvider extends LabelProvider { "icons/file.gif").createImage(); public final static Image BINARY = JcrUiPlugin.getImageDescriptor( "icons/binary.png").createImage(); + public final static Image HOME = JcrUiPlugin.getImageDescriptor( + "icons/home.gif").createImage(); + public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor( + "icons/repositories.gif").createImage(); public String getText(Object element) { try { if (element instanceof Node) { Node node = (Node) element; String label = node.getName(); - // try { - // Item primaryItem = node.getPrimaryItem(); - // label = primaryItem instanceof Property ? ((Property) - // primaryItem) - // .getValue().getString() - // + " (" - // + node.getName() - // + ")" : node.getName(); - // } catch (RepositoryException e) { - // label = node.getName(); - // } StringBuffer mixins = new StringBuffer(""); for (NodeType type : node.getMixinNodeTypes()) mixins.append(' ').append(type.getName()); - // System.out.println("URL : " - // + createDownloadHtml("test.pdf", "Downlad")); - return label + " [" + node.getPrimaryNodeType().getName() + mixins + "]"; - // + createDownloadHtml("test.pdf", "Downlad"); + } else if (element instanceof RepositoryRegister) { + return "Repositories"; } return element.toString(); } catch (RepositoryException e) { @@ -58,13 +51,17 @@ public class NodeLabelProvider extends LabelProvider { if (element instanceof Node) { Node node = (Node) element; try { - if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) - return FOLDER; - else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE)) + // optimized order + if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE)) return FILE; + else if (node.getPrimaryNodeType().isNodeType( + NodeType.NT_FOLDER)) + return FOLDER; else if (node.getPrimaryNodeType().isNodeType( NodeType.NT_RESOURCE)) return BINARY; + else if (node.isNodeType(ArgeoTypes.ARGEO_USER_HOME)) + return HOME; } catch (RepositoryException e) { // silent } @@ -79,6 +76,8 @@ public class NodeLabelProvider extends LabelProvider { return WorkspaceNode.WORKSPACE_DISCONNECTED; else return WorkspaceNode.WORKSPACE_CONNECTED; + } else if (element instanceof RepositoryRegister) { + return REPOSITORIES; } return super.getImage(element); } diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java index 4685fbb21..a9eba799a 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java @@ -5,7 +5,9 @@ import java.util.Arrays; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyType; +import javax.jcr.Repository; import javax.jcr.RepositoryException; +import javax.jcr.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -18,6 +20,8 @@ import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode; import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider; import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer; import org.argeo.eclipse.ui.specific.FileHandler; +import org.argeo.jcr.ArgeoJcrConstants; +import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; @@ -42,6 +46,8 @@ import org.eclipse.ui.part.ViewPart; public class GenericJcrBrowser extends ViewPart { private final static Log log = LogFactory.getLog(GenericJcrBrowser.class); + private Session session; + private TreeViewer nodesViewer; private TableViewer propertiesViewer; @@ -74,7 +80,21 @@ public class GenericJcrBrowser extends ViewPart { | SWT.V_SCROLL); nodesViewer.getTree().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); - nodesViewer.setContentProvider(new NodeContentProvider()); + + // look for session + Session nodeSession = session; + if (nodeSession == null) { + Repository nodeRepository = JcrUtils.getRepositoryByAlias( + repositoryRegister, ArgeoJcrConstants.ALIAS_NODE); + if (nodeRepository != null) + try { + nodeSession = nodeRepository.login(); + } catch (RepositoryException e1) { + throw new ArgeoException("Cannot login to node repository"); + } + } + nodesViewer.setContentProvider(new NodeContentProvider(nodeSession, + repositoryRegister)); nodesViewer.setLabelProvider(new NodeLabelProvider()); nodesViewer .addSelectionChangedListener(new ISelectionChangedListener() { @@ -110,7 +130,7 @@ public class GenericJcrBrowser extends ViewPart { nodesViewer.refresh(obj); } else if (obj instanceof Node) { Node node = (Node) obj; - + // double clic on a file node triggers its opening try { if (node.isNodeType("nt:file")) { @@ -134,7 +154,7 @@ public class GenericJcrBrowser extends ViewPart { getSite().registerContextMenu(menuManager, nodesViewer); getSite().setSelectionProvider(nodesViewer); - nodesViewer.setInput(repositoryRegister); + nodesViewer.setInput(getViewSite()); Composite bottom = new Composite(sashForm, SWT.NONE); bottom.setLayout(new GridLayout(1, false)); @@ -241,4 +261,8 @@ public class GenericJcrBrowser extends ViewPart { this.repositoryRegister = repositoryRegister; } + public void setSession(Session session) { + this.session = session; + } + } diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/UserCentricJcrBrowser.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/UserCentricJcrBrowser.java deleted file mode 100644 index c121f599c..000000000 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/UserCentricJcrBrowser.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.argeo.eclipse.ui.jcr.views; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.jcr.Session; - -import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider; -import org.argeo.eclipse.ui.jcr.browser.HomeContentProvider; -import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider; -import org.argeo.eclipse.ui.jcr.browser.RepositoryNode; -import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode; -import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider; -import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer; -import org.argeo.eclipse.ui.specific.FileHandler; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.ui.part.ViewPart; - -/** JCR browser organized around a user home node. */ -public class UserCentricJcrBrowser extends ViewPart { - // private final static Log log = LogFactory.getLog(UserBrowser.class); - - private TreeViewer nodesViewer; - - private Session session; - - @Override - public void createPartControl(Composite parent) { - - // Instantiate the generic object that fits for - // both RCP & RAP, must be final to be accessed in the double click - // listener. - // Not that in RAP, it registers a service handler that provide the - // access to the files. - - final JcrFileProvider jfp = new JcrFileProvider(); - final FileHandler fh = new FileHandler(jfp); - - parent.setLayout(new FillLayout()); - - Composite top = new Composite(parent, SWT.NONE); - GridLayout gl = new GridLayout(1, false); - top.setLayout(gl); - - // nodes viewer - nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL - | SWT.V_SCROLL); - nodesViewer.getTree().setLayoutData( - new GridData(SWT.FILL, SWT.FILL, true, true)); - - SimpleNodeContentProvider contentProvider = new HomeContentProvider( - session); - nodesViewer.setContentProvider(contentProvider); - nodesViewer.setLabelProvider(new NodeLabelProvider()); - - nodesViewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - if (event.getSelection() == null - || event.getSelection().isEmpty()) - return; - Object obj = ((IStructuredSelection) event.getSelection()) - .getFirstElement(); - if (obj instanceof RepositoryNode) { - RepositoryNode rpNode = (RepositoryNode) obj; - rpNode.login(); - // For the file provider to be able to browse the various - // repository. - // TODO : enhanced that. - jfp.setRepositoryNode(rpNode); - nodesViewer.refresh(obj); - - } else if (obj instanceof WorkspaceNode) { - ((WorkspaceNode) obj).login(); - nodesViewer.refresh(obj); - } else if (obj instanceof Node) { - Node node = (Node) obj; - - // double clic on a file node triggers its opening - try { - if (node.isNodeType("nt:file")) { - String name = node.getName(); - String id = node.getIdentifier(); - fh.openFile(name, id); - } - } catch (RepositoryException re) { - throw new ArgeoException( - "Repository error while getting Node file info", - re); - } - } - } - }); - - // context menu - MenuManager menuManager = new MenuManager(); - Menu menu = menuManager.createContextMenu(nodesViewer.getTree()); - nodesViewer.getTree().setMenu(menu); - getSite().registerContextMenu(menuManager, nodesViewer); - getSite().setSelectionProvider(nodesViewer); - - nodesViewer.setInput(session); - - nodesViewer.setComparer(new NodeViewerComparer()); - - } - - @Override - public void setFocus() { - nodesViewer.getTree().setFocus(); - } - - /** - * To be overidden to adapt size of form and result frames. - * - * @return - */ - protected int[] getWeights() { - return new int[] { 70, 30 }; - } - - /* - * NOTIFICATION - */ - public void refresh(Object obj) { - nodesViewer.refresh(obj); - } - - public void nodeAdded(Node parentNode, Node newNode) { - nodesViewer.refresh(parentNode); - nodesViewer.expandToLevel(newNode, 0); - } - - public void nodeRemoved(Node parentNode) { - - IStructuredSelection newSel = new StructuredSelection(parentNode); - nodesViewer.setSelection(newSel, true); - // Force refresh - IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer - .getSelection(); - nodesViewer.refresh(tmpSel.getFirstElement()); - } - - public void setSession(Session session) { - this.session = session; - } - -} diff --git a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java index ce0521bda..ebabae130 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java +++ b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java @@ -18,6 +18,7 @@ package org.argeo.eclipse.spring; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; @@ -45,6 +46,9 @@ public class SpringCommandHandler implements IHandler { // TODO: make it more flexible and robust ApplicationContext applicationContext = ApplicationContextTracker .getApplicationContext(bundleSymbolicName); + if (applicationContext == null) + throw new ArgeoException("No application context found for " + + bundleSymbolicName); // retrieve the command via its id String beanName = event.getCommand().getId(); diff --git a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java index dc47fa383..2eadf5669 100644 --- a/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java +++ b/security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java @@ -32,8 +32,9 @@ public class OsJcrAuthenticationProvider extends OsAuthenticationProvider { final Repository repository = getRepositoryBlocking(); systemExecutor.execute(new Runnable() { public void run() { + Session session = null; try { - Session session = repository.login(workspace); + session = repository.login(workspace); // WARNING: at this stage we assume that teh java properties // will have the same value String userName = System.getProperty("user.name"); @@ -41,11 +42,13 @@ public class OsJcrAuthenticationProvider extends OsAuthenticationProvider { if (userHome == null) userHome = JcrUtils.createUserHome(session, homeBasePath, userName); - //authen.setDetails(getUserDetails(userHome, authen)); + // authen.setDetails(getUserDetails(userHome, authen)); } catch (RepositoryException e) { throw new ArgeoException( "Unexpected exception when synchronizing OS and JCR security ", e); + } finally { + JcrUtils.logoutQuietly(session); } } }); diff --git a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF index 1e08b1e54..aa233494c 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF +++ b/server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF @@ -16,3 +16,4 @@ Import-Package: javax.jcr;version="2.0.0", org.argeo.eclipse.ui.jcr.editors, org.argeo.eclipse.ui.jcr.views, org.argeo.jcr +Export-Package: org.argeo.eclipse.ui.jcr.explorer diff --git a/server/plugins/org.argeo.jcr.ui.explorer/plugin.xml b/server/plugins/org.argeo.jcr.ui.explorer/plugin.xml index ad403464d..f52a81730 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/plugin.xml +++ b/server/plugins/org.argeo.jcr.ui.explorer/plugin.xml @@ -36,31 +36,33 @@ id="org.argeo.jcr.ui.explorer.openGenericJcrQueryEditor" name="New generic JCR query"> - - - - - - - - - - + + + + + + + + + +