Improve JCR explorer
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 27 Mar 2011 14:52:26 +0000 (14:52 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 27 Mar 2011 14:52:26 +0000 (14:52 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4384 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/UserCentricJcrBrowser.java [deleted file]
eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/SpringCommandHandler.java
security/runtime/org.argeo.security.core/src/main/java/org/argeo/security/jcr/OsJcrAuthenticationProvider.java
server/plugins/org.argeo.jcr.ui.explorer/META-INF/MANIFEST.MF
server/plugins/org.argeo.jcr.ui.explorer/plugin.xml
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerView.java [new file with mode: 0644]

index f8a5de98f17a4f1eedb7787cbb84de0417961410..6a3967de6dd0dc43509f5bf8bfd2687a46c75774 100644 (file)
@@ -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<Object> objs = new ArrayList<Object>();
+               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) {
index 71157aae14015ee393770b496203e1ef52a01fa9..a3ff38fc0e103f5ac106b92b5bf3921af4e1390d 100644 (file)
@@ -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);
        }
index 4685fbb2131fc7af0d40645e5e2d7af6edc19d60..a9eba799aeb78974663af2ead5806b02b9012ac6 100644 (file)
@@ -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 (file)
index c121f59..0000000
+++ /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;
-       }
-
-}
index ce0521bda6b0033d7e6fb0e2c8f5b66d8703ae1c..ebabae1308e0b44de059adc31f482c6fe7bde516 100644 (file)
@@ -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();
index dc47fa3831b3afc6b6f26b177e22665f017a49b4..2eadf5669724e5f7cb6000e2819f766f929e72c5 100644 (file)
@@ -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);
                                }
                        }
                });
index 1e08b1e54fbe558453ea5c8fdfd02fc6a5f32b14..aa233494cca777ef2f6831d24cd5bbfad6b104d7 100644 (file)
@@ -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
index ad403464d15a33ccd990613cd0c24a311e600b2f..f52a8173032394d39dfbc85fe6c6587b2578c554 100644 (file)
             id="org.argeo.jcr.ui.explorer.openGenericJcrQueryEditor"
             name="New generic JCR query">
        </command>
-  <command
-        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-        id="org.argeo.jcr.ui.explorer.addFileFolder"
-        name="Add file folder...">
-  </command>
-  <command
-        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-        id="org.argeo.jcr.ui.explorer.refresh"
-        name="Refresh">
-  </command>
-  <command
-        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-        id="org.argeo.jcr.ui.explorer.deleteNode"
-        name="Delete node">
-  </command>
-  <command
-        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-        id="org.argeo.jcr.ui.explorer.importFileSystem"
-        name="Import files...">
-  </command>
-  <command
-        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
-        id="org.argeo.jcr.ui.explorer.openFile"
-        name="Open current file">
-  </command>
+         <command
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+               id="org.argeo.jcr.ui.explorer.addFileFolder"
+           icon="icons/add.gif"
+               name="Add file folder...">
+         </command>
+         <command
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+               id="org.argeo.jcr.ui.explorer.refresh"
+               icon="icons/refresh.png"
+               name="Refresh">
+         </command>
+         <command
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+               id="org.argeo.jcr.ui.explorer.deleteNode"
+               name="Delete node">
+         </command>
+         <command
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+               id="org.argeo.jcr.ui.explorer.importFileSystem"
+               name="Import files...">
+         </command>
+         <command
+               defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+               id="org.argeo.jcr.ui.explorer.openFile"
+               name="Open current file">
+         </command>
     </extension>
        <extension point="org.eclipse.ui.menus">
                <menuContribution
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerView.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerView.java
new file mode 100644 (file)
index 0000000..1a923c5
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.eclipse.ui.jcr.explorer;
+
+import org.argeo.eclipse.ui.jcr.views.GenericJcrBrowser;
+
+public class JcrExplorerView extends GenericJcrBrowser {
+
+}