fix a few bugs
authorBruno Sinou <bsinou@argeo.org>
Fri, 14 Oct 2011 21:07:41 +0000 (21:07 +0000)
committerBruno Sinou <bsinou@argeo.org>
Fri, 14 Oct 2011 21:07:41 +0000 (21:07 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4843 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

16 files changed:
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/sort.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrImages.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrFileProvider.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrItemsComparator.java [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml
server/plugins/org.argeo.jcr.ui.explorer/icons/sort.gif [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/plugin.xml
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/ItemComparator.java [deleted file]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/PropertiesContentProvider.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/SortChildNodes.java [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/providers/SingleNodeAsTreeContentProvider.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/JcrFileProvider.java [deleted file]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/TreeObjectsComparator.java [new file with mode: 0644]
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java

diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/sort.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/sort.gif
new file mode 100644 (file)
index 0000000..23c5d0b
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/sort.gif differ
index b9566d7ea32956e9c79b387475a73df0248b6561..7d8abdb32314ccdaf4d8543ec7283be6afdfa2c0 100644 (file)
@@ -14,6 +14,8 @@ public class JcrImages {
                        "icons/binary.png").createImage();
        public final static Image HOME = JcrUiPlugin.getImageDescriptor(
                        "icons/home.gif").createImage();
+       public final static Image SORT = JcrUiPlugin.getImageDescriptor(
+                       "icons/sort.gif").createImage();
 
        public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor(
                        "icons/repositories.gif").createImage();
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrFileProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrFileProvider.java
new file mode 100644 (file)
index 0000000..a9ee640
--- /dev/null
@@ -0,0 +1,157 @@
+package org.argeo.eclipse.ui.jcr.utils;
+
+import java.io.InputStream;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.specific.FileProvider;
+
+/**
+ * Implements a FileProvider for UI purposes. Note that it might not be very
+ * reliable as long as we have not fixed login & multi repository issues that
+ * will be addressed in the next version.
+ * 
+ * NOTE: id used here is the real id of the JCR Node, not the JCR Path
+ * 
+ * Relies on common approach for JCR file handling implementation.
+ * 
+ */
+
+public class JcrFileProvider implements FileProvider {
+
+       // private Object[] rootNodes;
+       private Node refNode;
+
+       /**
+        * Must be set in order for the provider to be able to get current session
+        * and thus have the ability to get the file node corresponding to a given
+        * file ID
+        * 
+        * FIXME : this introduces some concurrences ISSUES.
+        * 
+        * @param repositoryNode
+        */
+       public void setReferenceNode(Node refNode) {
+               this.refNode = refNode;
+       }
+
+       /**
+        * Must be set in order for the provider to be able to search the repository
+        * Provided object might be either JCR Nodes or UI RepositoryNode for the
+        * time being.
+        * 
+        * @param repositoryNode
+        */
+       // public void setRootNodes(Object[] rootNodes) {
+       // List<Object> tmpNodes = new ArrayList<Object>();
+       // for (int i = 0; i < rootNodes.length; i++) {
+       // Object obj = rootNodes[i];
+       // if (obj instanceof Node) {
+       // tmpNodes.add(obj);
+       // } else if (obj instanceof RepositoryRegister) {
+       // RepositoryRegister repositoryRegister = (RepositoryRegister) obj;
+       // Map<String, Repository> repositories = repositoryRegister
+       // .getRepositories();
+       // for (String name : repositories.keySet()) {
+       // // tmpNodes.add(new RepositoryNode(name, repositories
+       // // .get(name)));
+       // }
+       //
+       // }
+       // }
+       // this.rootNodes = tmpNodes.toArray();
+       // }
+
+       public byte[] getByteArrayFileFromId(String fileId) {
+               InputStream fis = null;
+               byte[] ba = null;
+               Node child = getFileNodeFromId(fileId);
+               try {
+                       fis = (InputStream) child.getProperty(Property.JCR_DATA)
+                                       .getBinary().getStream();
+                       ba = IOUtils.toByteArray(fis);
+
+               } catch (Exception e) {
+                       throw new ArgeoException("Stream error while opening file", e);
+               } finally {
+                       IOUtils.closeQuietly(fis);
+               }
+               return ba;
+       }
+
+       public InputStream getInputStreamFromFileId(String fileId) {
+               try {
+                       InputStream fis = null;
+
+                       Node child = getFileNodeFromId(fileId);
+                       fis = (InputStream) child.getProperty(Property.JCR_DATA)
+                                       .getBinary().getStream();
+                       return fis;
+               } catch (RepositoryException re) {
+                       throw new ArgeoException("Cannot get stream from file node for Id "
+                                       + fileId, re);
+               }
+       }
+
+       /**
+        * Throws an exception if the node is not found in the current repository (a
+        * bit like a FileNotFoundException)
+        * 
+        * @param fileId
+        * @return Returns the child node of the nt:file node. It is the child node
+        *         that have the jcr:data property where actual file is stored.
+        *         never null
+        */
+       private Node getFileNodeFromId(String fileId) {
+               try {
+                       Node result = refNode.getSession().getNodeByIdentifier(fileId);
+
+                       // rootNodes: for (int j = 0; j < rootNodes.length; j++) {
+                       // // in case we have a classic JCR Node
+                       // if (rootNodes[j] instanceof Node) {
+                       // Node curNode = (Node) rootNodes[j];
+                       // if (result != null)
+                       // break rootNodes;
+                       // } // Case of a repository Node
+                       // else if (rootNodes[j] instanceof RepositoryNode) {
+                       // Object[] nodes = ((RepositoryNode) rootNodes[j])
+                       // .getChildren();
+                       // for (int i = 0; i < nodes.length; i++) {
+                       // Node node = (Node) nodes[i];
+                       // result = node.getSession().getNodeByIdentifier(fileId);
+                       // if (result != null)
+                       // break rootNodes;
+                       // }
+                       // }
+                       // }
+
+                       // Sanity checks
+                       if (result == null)
+                               throw new ArgeoException("File node not found for ID" + fileId);
+
+                       // Ensure that the node have the correct type.
+                       if (!result.isNodeType(NodeType.NT_FILE))
+                               throw new ArgeoException(
+                                               "Cannot open file children Node that are not of '"
+                                                               + NodeType.NT_RESOURCE + "' type.");
+
+                       // Get the usefull part of the Node
+                       Node child = result.getNodes().nextNode();
+                       if (child == null || !child.isNodeType(NodeType.NT_RESOURCE))
+                               throw new ArgeoException(
+                                               "ERROR: IN the current implemented model, '"
+                                                               + NodeType.NT_FILE
+                                                               + "' file node must have one and only one child of the nt:ressource, where actual data is stored");
+                       return child;
+
+               } catch (RepositoryException re) {
+                       throw new ArgeoException("Erreur while getting file node of ID "
+                                       + fileId, re);
+               }
+       }
+}
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrItemsComparator.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/utils/JcrItemsComparator.java
new file mode 100644 (file)
index 0000000..5e6f911
--- /dev/null
@@ -0,0 +1,20 @@
+package org.argeo.eclipse.ui.jcr.utils;
+
+import java.util.Comparator;
+
+import javax.jcr.Item;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+
+public class JcrItemsComparator implements Comparator<Item> {
+       public int compare(Item o1, Item o2) {
+               try {
+                       // TODO: put folder before files
+                       return o1.getName().compareTo(o2.getName());
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot compare " + o1 + " and " + o2, e);
+               }
+       }
+
+}
index 1e58d33e5afd62a3a0bfd5c28ae1316752220f95..96ad94dbd98d25eb98a42e7253ee761297d11d76 100644 (file)
@@ -5,10 +5,10 @@
         http://www.springframework.org/schema/beans/spring-beans.xsd">
 
        <bean id="openGenericJcrQueryEditor"
-               class="org.argeo.jcr.ui.explorer.commands.OpenGenericJcrQueryEditor"
+               class="org.argeo.eclipse.ui.jcr.commands.OpenGenericJcrQueryEditor"
                scope="prototype">
                <property name="editorId"
-                       value="org.argeo.slc.client.ui.dist.genericJcrQueryEditor" />
+                       value="org.argeo.jcr.ui.explorer.genericJcrQueryEditor" />
        </bean>
 
        <bean id="openGenericNodeEditor"
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/icons/sort.gif b/server/plugins/org.argeo.jcr.ui.explorer/icons/sort.gif
new file mode 100644 (file)
index 0000000..23c5d0b
Binary files /dev/null and b/server/plugins/org.argeo.jcr.ui.explorer/icons/sort.gif differ
index 7d220a04fe0cac3f5508bd2fe6795815e4b459e7..74c69707e5f8626e763f4f62472a7a79a029dd34 100644 (file)
                id="org.argeo.jcr.ui.explorer.openFile"
                name="Open current file">
          </command>
+         <command
+            defaultHandler="org.argeo.jcr.ui.explorer.commands.SortChildNodes"
+            id="org.argeo.jcr.ui.explorer.sortChildNodes"
+            name="Sort node tree">
+            <state 
+                               id="org.argeo.jcr.ui.explorer.sortChildNodes.toggleState">
+                               <class class="org.eclipse.jface.commands.ToggleState"> 
+                                       <parameter
+                                               name="default"
+                                       value="true" />
+                               </class>
+                       </state>
+     </command>
     </extension>
 
     <!-- Menus --> 
        <extension point="org.eclipse.ui.menus">
+               <!-- Browser view specific menu --> 
                <menuContribution
                        locationURI="menu:org.argeo.jcr.ui.explorer.browserView">
             <command
                commandId="org.argeo.jcr.ui.explorer.addRemoteRepository"
                 icon="icons/addRepo.gif"
                 style="push">
+            </command>
+             <command
+               commandId="org.argeo.jcr.ui.explorer.sortChildNodes"
+                icon="icons/sort.gif"
+                style="toggle" 
+                label="Sort child nodes"
+                tooltip="Warning: stopping to sort children nodes might enhance overall performances">
             </command>
                </menuContribution>
+               <!-- Browser view popup context menu --> 
                <menuContribution
                        locationURI="popup:org.argeo.jcr.ui.explorer.browserView">
                        <command
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/ItemComparator.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/ItemComparator.java
deleted file mode 100644 (file)
index 156aa7b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.argeo.jcr.ui.explorer.browser;
-
-import java.util.Comparator;
-
-import javax.jcr.Item;
-import javax.jcr.RepositoryException;
-
-import org.argeo.ArgeoException;
-
-public class ItemComparator implements Comparator<Item> {
-       public int compare(Item o1, Item o2) {
-               try {
-                       // TODO: put folder before files
-                       return o1.getName().compareTo(o2.getName());
-               } catch (RepositoryException e) {
-                       throw new ArgeoException("Cannot compare " + o1 + " and " + o2, e);
-               }
-       }
-
-}
index c0ae9c42256ccfa9c64edebf557dae378106411b..99a169e6d455e15ae104f6a894a8f2d3c2f3ace5 100644 (file)
@@ -1,11 +1,14 @@
 package org.argeo.jcr.ui.explorer.browser;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.Session;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.eclipse.ui.TreeParent;
 import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.JcrUtils;
@@ -13,6 +16,7 @@ import org.argeo.jcr.RepositoryRegister;
 import org.argeo.jcr.security.JcrKeyring;
 import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
 import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
+import org.argeo.jcr.ui.explorer.utils.TreeObjectsComparator;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
@@ -22,8 +26,7 @@ import org.eclipse.jface.viewers.Viewer;
  * 
  */
 public class NodeContentProvider implements ITreeContentProvider {
-       // private final static Log log =
-       // LogFactory.getLog(NodeContentProvider.class);
+       private final static Log log = LogFactory.getLog(NodeContentProvider.class);
 
        // Business Objects
        private RepositoryRegister repositoryRegister;
@@ -31,7 +34,8 @@ public class NodeContentProvider implements ITreeContentProvider {
        private JcrKeyring jcrKeyring;
 
        // Utils
-       // private ItemComparator itemComparator = new ItemComparator();
+       private boolean sortChildren = true;
+       private TreeObjectsComparator itemComparator = new TreeObjectsComparator();
 
        public NodeContentProvider(JcrKeyring jcrKeyring,
                        RepositoryRegister repositoryRegister) {
@@ -60,35 +64,22 @@ public class NodeContentProvider implements ITreeContentProvider {
        }
 
        public Object[] getChildren(Object parentElement) {
-               // if (parentElement instanceof Node) {
-               // return childrenNodes((Node) parentElement);
-               // } else if (parentElement instanceof RepositoryNode) {
-               // return ((RepositoryNode) parentElement).getChildren();
-               // } else if (parentElement instanceof WorkspaceNode) {
-               // Session session = ((WorkspaceNode) parentElement).getSession();
-               // if (session == null)
-               // return new Object[0];
-               //
-               // try {
-               // return childrenNodes(session.getRootNode());
-               // } catch (RepositoryException e) {
-               // throw new ArgeoException("Cannot retrieve root node of "
-               // + session, e);
-               // }
-               // } else if (parentElement instanceof RepositoryRegister) {
-               // RepositoryRegister repositoryRegister = (RepositoryRegister)
-               // parentElement;
-               // List<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
-               // Map<String, Repository> repositories = repositoryRegister
-               // .getRepositories();
-               // for (String name : repositories.keySet()) {
-               // nodes.add(new RepositoryNode(name, repositories.get(name)));
-               // }
-               // return nodes.toArray();
-
-               if (parentElement instanceof TreeParent)
-                       return ((TreeParent) parentElement).getChildren();
-               else {
+               if (parentElement instanceof TreeParent) {
+                       if (sortChildren) {
+                               // TreeParent[] arr = (TreeParent[]) ((TreeParent)
+                               // parentElement)
+                               // .getChildren();
+                               Object[] tmpArr = ((TreeParent) parentElement).getChildren();
+                               TreeParent[] arr = new TreeParent[tmpArr.length];
+                               for (int i = 0; i < tmpArr.length; i++)
+                                       arr[i] = (TreeParent) tmpArr[i];
+
+                               Arrays.sort(arr, itemComparator);
+                               return arr;
+                       } else
+                               return ((TreeParent) parentElement).getChildren();
+
+               } else {
                        return new Object[0];
                }
        }
@@ -108,15 +99,8 @@ public class NodeContentProvider implements ITreeContentProvider {
                } else if (element instanceof TreeParent) {
                        TreeParent tp = (TreeParent) element;
                        return tp.hasChildren();
-                       // } else if (element instanceof RepositoryNode) {
-                       // return ((RepositoryNode) element).hasChildren();
-                       // } else if (element instanceof WorkspaceNode) {
-                       // return ((WorkspaceNode) element).getSession() != null;
                }
                return false;
-               // } catch (RepositoryException e) {
-               // throw new ArgeoException("Cannot check children of " + element, e);
-               // }
        }
 
        public void dispose() {
@@ -124,21 +108,4 @@ public class NodeContentProvider implements ITreeContentProvider {
 
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
-
-       // protected Object[] childrenNodes(Node parentNode) {
-       // try {
-       // List<Node> children = new ArrayList<Node>();
-       // NodeIterator nit = parentNode.getNodes();
-       // while (nit.hasNext()) {
-       // Node node = nit.nextNode();
-       // children.add(node);
-       // }
-       // Node[] arr = children.toArray(new Node[children.size()]);
-       // Arrays.sort(arr, itemComparator);
-       // return arr;
-       // } catch (RepositoryException e) {
-       // throw new ArgeoException("Cannot list children of " + parentNode, e);
-       // }
-       // }
-
 }
index 04cd699a77d4d3084078aca990cad5e8a389f24f..4d606aaedb399b520bf4007a14561ecfee1f6d4c 100644 (file)
@@ -9,11 +9,12 @@ import javax.jcr.PropertyIterator;
 import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.utils.JcrItemsComparator;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
 public class PropertiesContentProvider implements IStructuredContentProvider {
-       private ItemComparator itemComparator = new ItemComparator();
+       private JcrItemsComparator itemComparator = new JcrItemsComparator();
 
        public void dispose() {
        }
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/SortChildNodes.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/commands/SortChildNodes.java
new file mode 100644 (file)
index 0000000..5b53bad
--- /dev/null
@@ -0,0 +1,35 @@
+package org.argeo.jcr.ui.explorer.commands;
+
+import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
+import org.argeo.jcr.ui.explorer.views.GenericJcrBrowser;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.State;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Change isSorted state of the JcrExplorer Browser
+ */
+public class SortChildNodes extends AbstractHandler {
+       public final static String ID = JcrExplorerPlugin.ID + ".sortChildNodes";
+
+       public Object execute(ExecutionEvent event) throws ExecutionException {
+               GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil
+                               .getActiveWorkbenchWindow(event).getActivePage()
+                               .findView(GenericJcrBrowser.ID);
+
+               ICommandService service = (ICommandService) PlatformUI.getWorkbench()
+                               .getService(ICommandService.class);
+               Command command = service.getCommand(ID);
+               State state = command.getState(ID + ".toggleState");
+
+               boolean wasSorted = (Boolean) state.getValue();
+               view.setSortChildNodes(!wasSorted);
+               state.setValue(!wasSorted);
+               return null;
+       }
+}
index d329427756440fa85078ed0bf7a7265a5d4655d6..87e19a27bbd0980af4e4193873ad945894812846 100644 (file)
@@ -9,7 +9,7 @@ import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
-import org.argeo.jcr.ui.explorer.browser.ItemComparator;
+import org.argeo.eclipse.ui.jcr.utils.JcrItemsComparator;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
@@ -20,7 +20,7 @@ import org.eclipse.jface.viewers.Viewer;
  */
 public class SingleNodeAsTreeContentProvider implements ITreeContentProvider {
        // private Node rootNode;
-       private ItemComparator itemComparator = new ItemComparator();
+       private JcrItemsComparator itemComparator = new JcrItemsComparator();
 
        /**
         * Sends back the first level of the Tree. input element must be a single
index f97e1b57971475e39e1cd393f6f076a60b06e021..da13a236602abe0e10b427804a650a1f01d0d9a5 100644 (file)
@@ -5,6 +5,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
 import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
 import org.argeo.eclipse.ui.specific.FileHandler;
 import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
 import org.argeo.jcr.ui.explorer.editors.GenericNodeEditor;
@@ -67,7 +68,7 @@ public class GenericNodeDoubleClickListener implements IDoubleClickListener {
                                        // ITreeContentProvider itcp = (ITreeContentProvider)
                                        // nodeViewer
                                        // .getContentProvider();
-                                       // jfp.setRootNodes((Object[]) itcp.getElements(null));
+                                       jfp.setReferenceNode(node);
                                        fileHandler.openFile(name, id);
                                }
                                GenericNodeEditorInput gnei = new GenericNodeEditorInput(node);
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrFileProvider.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrFileProvider.java
deleted file mode 100644 (file)
index 568c751..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.argeo.jcr.ui.explorer.utils;
-
-import java.io.InputStream;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-
-import org.apache.commons.io.IOUtils;
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.specific.FileProvider;
-import org.argeo.jcr.ui.explorer.model.RepositoryNode;
-
-/**
- * Implements a FileProvider for UI purposes. Note that it might not be very
- * reliable as long as we have not fixed login & multi repository issues that
- * will be addressed in the next version.
- * 
- * NOTE: id used here is the real id of the JCR Node, not the JCR Path
- * 
- * Relies on common approach for JCR file handling implementation.
- * 
- */
-
-public class JcrFileProvider implements FileProvider {
-
-       private Object[] rootNodes;
-
-       /**
-        * Must be set in order for the provider to be able to search the repository
-        * Provided object might be either JCR Nodes or UI RepositoryNode for the
-        * time being.
-        * 
-        * @param repositoryNode
-        */
-       // public void setRootNodes(Object[] rootNodes) {
-       // List<Object> tmpNodes = new ArrayList<Object>();
-       // for (int i = 0; i < rootNodes.length; i++) {
-       // Object obj = rootNodes[i];
-       // if (obj instanceof Node) {
-       // tmpNodes.add(obj);
-       // } else if (obj instanceof RepositoryRegister) {
-       // RepositoryRegister repositoryRegister = (RepositoryRegister) obj;
-       // Map<String, Repository> repositories = repositoryRegister
-       // .getRepositories();
-       // for (String name : repositories.keySet()) {
-       // tmpNodes.add(new RepositoryNode(name, repositories
-       // .get(name)));
-       // }
-       //
-       // }
-       // }
-       // this.rootNodes = tmpNodes.toArray();
-       // }
-
-       public byte[] getByteArrayFileFromId(String fileId) {
-               InputStream fis = null;
-               byte[] ba = null;
-               Node child = getFileNodeFromId(fileId);
-               try {
-                       fis = (InputStream) child.getProperty(Property.JCR_DATA)
-                                       .getBinary().getStream();
-                       ba = IOUtils.toByteArray(fis);
-
-               } catch (Exception e) {
-                       throw new ArgeoException("Stream error while opening file", e);
-               } finally {
-                       IOUtils.closeQuietly(fis);
-               }
-               return ba;
-       }
-
-       public InputStream getInputStreamFromFileId(String fileId) {
-               try {
-                       InputStream fis = null;
-
-                       Node child = getFileNodeFromId(fileId);
-                       fis = (InputStream) child.getProperty(Property.JCR_DATA)
-                                       .getBinary().getStream();
-                       return fis;
-               } catch (RepositoryException re) {
-                       throw new ArgeoException("Cannot get stream from file node for Id "
-                                       + fileId, re);
-               }
-       }
-
-       /**
-        * Throws an exception if the node is not found in the current repository (a
-        * bit like a FileNotFoundException)
-        * 
-        * @param fileId
-        * @return Returns the child node of the nt:file node. It is the child node
-        *         that have the jcr:data property where actual file is stored.
-        *         never null
-        */
-       private Node getFileNodeFromId(String fileId) {
-               try {
-                       Node result = null;
-
-                       rootNodes: for (int j = 0; j < rootNodes.length; j++) {
-                               // in case we have a classic JCR Node
-                               if (rootNodes[j] instanceof Node) {
-                                       Node curNode = (Node) rootNodes[j];
-                                       result = curNode.getSession().getNodeByIdentifier(fileId);
-                                       if (result != null)
-                                               break rootNodes;
-                               } // Case of a repository Node
-                               else if (rootNodes[j] instanceof RepositoryNode) {
-                                       Object[] nodes = ((RepositoryNode) rootNodes[j])
-                                                       .getChildren();
-                                       for (int i = 0; i < nodes.length; i++) {
-                                               Node node = (Node) nodes[i];
-                                               result = node.getSession().getNodeByIdentifier(fileId);
-                                               if (result != null)
-                                                       break rootNodes;
-                                       }
-                               }
-                       }
-
-                       // Sanity checks
-                       if (result == null)
-                               throw new ArgeoException("File node not found for ID" + fileId);
-
-                       // Ensure that the node have the correct type.
-                       if (!result.isNodeType(NodeType.NT_FILE))
-                               throw new ArgeoException(
-                                               "Cannot open file children Node that are not of '"
-                                                               + NodeType.NT_RESOURCE + "' type.");
-
-                       // Get the usefull part of the Node
-                       Node child = result.getNodes().nextNode();
-                       if (child == null || !child.isNodeType(NodeType.NT_RESOURCE))
-                               throw new ArgeoException(
-                                               "ERROR: IN the current implemented model, '"
-                                                               + NodeType.NT_FILE
-                                                               + "' file node must have one and only one child of the nt:ressource, where actual data is stored");
-                       return child;
-
-               } catch (RepositoryException re) {
-                       throw new ArgeoException("Erreur while getting file node of ID "
-                                       + fileId, re);
-               }
-       }
-}
diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/TreeObjectsComparator.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/TreeObjectsComparator.java
new file mode 100644 (file)
index 0000000..a799708
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.jcr.ui.explorer.utils;
+
+import java.util.Comparator;
+
+import org.argeo.eclipse.ui.TreeParent;
+
+public class TreeObjectsComparator implements Comparator<TreeParent> {
+       public int compare(TreeParent o1, TreeParent o2) {
+               return o1.getName().compareTo(o2.getName());
+       }
+}
\ No newline at end of file
index 2274644d9d9d9b2fc4eb2c922250e9966219317c..3af60844c907be7d5be60de784f354f30b5dfbce 100644 (file)
@@ -18,6 +18,7 @@ import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
 import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser;
 import org.argeo.jcr.RepositoryRegister;
 import org.argeo.jcr.security.JcrKeyring;
+import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
 import org.argeo.jcr.ui.explorer.browser.NodeContentProvider;
 import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider;
 import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider;
@@ -51,6 +52,8 @@ import org.eclipse.swt.widgets.Menu;
 public class GenericJcrBrowser extends AbstractJcrBrowser {
        // private final static Log log =
        // LogFactory.getLog(GenericJcrBrowser.class);
+       public final static String ID = JcrExplorerPlugin.ID + ".browserView";
+       private boolean sortChildNodes = false;
 
        /* DEPENDENCY INJECTION */
        private JcrKeyring jcrKeyring;
@@ -284,6 +287,14 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
 
        }
 
+       public void setSortChildNodes(boolean sortChildNodes) {
+               this.sortChildNodes = sortChildNodes;
+       }
+
+       public boolean getSortChildNodes() {
+               return sortChildNodes;
+       }
+
        /* DEPENDENCY INJECTION */
        public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
                this.repositoryRegister = repositoryRegister;