Extends generic JCR UI components
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Apr 2011 16:48:58 +0000 (16:48 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Apr 2011 16:48:58 +0000 (16:48 +0000)
NEW - bug 17: Generalize agent management and registration beyond JMS
https://bugzilla.argeo.org/show_bug.cgi?id=17

git-svn-id: https://svn.argeo.org/commons/trunk@4448 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/AbstractNodeContentProvider.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java

index a8d07ad67211a6969ab38a2839d429792dba3f36..72a14baf850c8251b6ed04e64db89d04d736803a 100644 (file)
@@ -31,19 +31,43 @@ public abstract class AbstractNodeContentProvider extends
 
        @Override
        public Object[] getChildren(Object element) {
+               Object[] children;
                if (element instanceof Node) {
                        try {
-                               List<Node> nodes = new ArrayList<Node>();
-                               for (NodeIterator nit = ((Node) element).getNodes(); nit
-                                               .hasNext();)
-                                       nodes.add(nit.nextNode());
-                               return nodes.toArray();
+                               Node node = (Node) element;
+                               children = getChildren(node);
                        } catch (RepositoryException e) {
                                throw new ArgeoException("Cannot get children of " + element, e);
                        }
+               } else if (element instanceof WrappedNode) {
+                       WrappedNode wrappedNode = (WrappedNode) element;
+                       try {
+                               children = getChildren(wrappedNode.getNode());
+                       } catch (RepositoryException e) {
+                               throw new ArgeoException("Cannot get children of "
+                                               + wrappedNode, e);
+                       }
+               } else if (element instanceof NodesWrapper) {
+                       NodesWrapper node = (NodesWrapper) element;
+                       children = node.getChildren();
                } else {
-                       return super.getChildren(element);
+                       children = super.getChildren(element);
                }
+
+               children = sort(element, children);
+               return children;
+       }
+
+       /** Do not sort by default. To be overidden to provide custom sort. */
+       protected Object[] sort(Object parent, Object[] children) {
+               return children;
+       }
+
+       protected Object[] getChildren(Node node) throws RepositoryException {
+               List<Node> nodes = new ArrayList<Node>();
+               for (NodeIterator nit = node.getNodes(); nit.hasNext();)
+                       nodes.add(nit.nextNode());
+               return nodes.toArray();
        }
 
        @Override
@@ -59,20 +83,33 @@ public abstract class AbstractNodeContentProvider extends
                        } catch (RepositoryException e) {
                                throw new ArgeoException("Cannot get parent of " + element, e);
                        }
+               } else if (element instanceof WrappedNode) {
+                       WrappedNode wrappedNode = (WrappedNode) element;
+                       return wrappedNode.getParent();
+               } else if (element instanceof NodesWrapper) {
+                       NodesWrapper nodesWrapper = (NodesWrapper) element;
+                       return this.getParent(nodesWrapper.getNode());
                }
                return super.getParent(element);
        }
 
        @Override
        public boolean hasChildren(Object element) {
-               if (element instanceof Node) {
-                       Node node = (Node) element;
-                       try {
+               try {
+                       if (element instanceof Node) {
+                               Node node = (Node) element;
                                return node.hasNodes();
-                       } catch (RepositoryException e) {
-                               throw new ArgeoException("Cannot check whether " + element
-                                               + " has children", e);
+                       } else if (element instanceof WrappedNode) {
+                               WrappedNode wrappedNode = (WrappedNode) element;
+                               return wrappedNode.getNode().hasNodes();
+                       } else if (element instanceof NodesWrapper) {
+                               NodesWrapper nodesWrapper = (NodesWrapper) element;
+                               return nodesWrapper.hasChildren();
                        }
+
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot check whether " + element
+                                       + " has children", e);
                }
                return super.hasChildren(element);
        }
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/DefaultNodeLabelProvider.java
new file mode 100644 (file)
index 0000000..648079e
--- /dev/null
@@ -0,0 +1,80 @@
+package org.argeo.eclipse.ui.jcr;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.ArgeoException;
+import org.argeo.jcr.ArgeoTypes;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/** Provides reasonable overridable defaults for know JCR types. */
+public class DefaultNodeLabelProvider extends LabelProvider {
+       // Images
+       public final static Image NODE = JcrUiPlugin.getImageDescriptor(
+                       "icons/node.gif").createImage();
+       public final static Image FOLDER = JcrUiPlugin.getImageDescriptor(
+                       "icons/folder.gif").createImage();
+       public final static Image FILE = JcrUiPlugin.getImageDescriptor(
+                       "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 String getText(Object element) {
+               try {
+                       if (element instanceof Node) {
+                               return getText((Node) element);
+                       } else if (element instanceof WrappedNode) {
+                               return getText(((WrappedNode) element).getNode());
+                       } else if (element instanceof NodesWrapper) {
+                               return getText(((NodesWrapper) element).getNode());
+                       }
+                       return super.getText(element);
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot get text for of " + element, e);
+               }
+       }
+
+       protected String getText(Node node) throws RepositoryException {
+               if (node.isNodeType(NodeType.MIX_TITLE)
+                               && node.hasProperty(Property.JCR_TITLE))
+                       return node.getProperty(Property.JCR_TITLE).getString();
+               else
+                       return node.getName();
+       }
+
+       @Override
+       public Image getImage(Object element) {
+               try {
+                       if (element instanceof Node) {
+                               return getImage((Node) element);
+                       } else if (element instanceof WrappedNode) {
+                               return getImage(((WrappedNode) element).getNode());
+                       } else if (element instanceof NodesWrapper) {
+                               return getImage(((NodesWrapper) element).getNode());
+                       }
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot retrieve image for " + element, e);
+               }
+               return super.getImage(element);
+       }
+
+       protected Image getImage(Node node) throws RepositoryException {
+               // 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;
+               else
+                       return NODE;
+       }
+
+}
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/NodesWrapper.java
new file mode 100644 (file)
index 0000000..5765a38
--- /dev/null
@@ -0,0 +1,67 @@
+package org.argeo.eclipse.ui.jcr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+
+/**
+ * Element of tree which is based on a node, but whose children are not
+ * necessarily this node children.
+ */
+public class NodesWrapper {
+       private final Node node;
+
+       public NodesWrapper(Node node) {
+               super();
+               this.node = node;
+       }
+
+       protected List<WrappedNode> getWrappedNodes() throws RepositoryException {
+               List<WrappedNode> nodes = new ArrayList<WrappedNode>();
+               for (NodeIterator nit = node.getNodes(); nit.hasNext();)
+                       nodes.add(new WrappedNode(this, nit.nextNode()));
+               return nodes;
+       }
+
+       public Object[] getChildren() {
+               try {
+                       return getWrappedNodes().toArray();
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot get wrapped children", e);
+               }
+       }
+
+       /**
+        * @return true by default because we don't want to compute the wrapped
+        *         nodes twice
+        */
+       public Boolean hasChildren() {
+               return true;
+       }
+
+       public Node getNode() {
+               return node;
+       }
+
+       @Override
+       public int hashCode() {
+               return node.hashCode();
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (obj instanceof NodesWrapper)
+                       return node.equals(((NodesWrapper) obj).getNode());
+               else
+                       return false;
+       }
+
+       public String toString() {
+               return "nodes wrapper based on " + node;
+       }
+}
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/WrappedNode.java
new file mode 100644 (file)
index 0000000..f24a25a
--- /dev/null
@@ -0,0 +1,41 @@
+package org.argeo.eclipse.ui.jcr;
+
+import javax.jcr.Node;
+
+/** Wraps a node (created from a {@link NodesWrapper}) */
+public class WrappedNode {
+       private final NodesWrapper parent;
+       private final Node node;
+
+       public WrappedNode(NodesWrapper parent, Node node) {
+               super();
+               this.parent = parent;
+               this.node = node;
+       }
+
+       public NodesWrapper getParent() {
+               return parent;
+       }
+
+       public Node getNode() {
+               return node;
+       }
+
+       public String toString() {
+               return "wrapped " + node;
+       }
+
+       @Override
+       public int hashCode() {
+               return node.hashCode();
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (obj instanceof WrappedNode)
+                       return node.equals(((WrappedNode) obj).getNode());
+               else
+                       return false;
+       }
+
+}
index a3ff38fc0e103f5ac106b92b5bf3921af4e1390d..09923199539371b5d712f28090360d3ec12a43ae 100644 (file)
@@ -4,69 +4,36 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
 
-import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider;
 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;
 
-public class NodeLabelProvider extends LabelProvider {
+public class NodeLabelProvider extends DefaultNodeLabelProvider {
        // Images
-       public final static Image NODE = JcrUiPlugin.getImageDescriptor(
-                       "icons/node.gif").createImage();
-       public final static Image FOLDER = JcrUiPlugin.getImageDescriptor(
-                       "icons/folder.gif").createImage();
-       public final static Image FILE = JcrUiPlugin.getImageDescriptor(
-                       "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();
-                               StringBuffer mixins = new StringBuffer("");
-                               for (NodeType type : node.getMixinNodeTypes())
-                                       mixins.append(' ').append(type.getName());
-
-                               return label + " [" + node.getPrimaryNodeType().getName()
-                                               + mixins + "]";
-                       } else if (element instanceof RepositoryRegister) {
-                               return "Repositories";
-                       }
-                       return element.toString();
-               } catch (RepositoryException e) {
-                       throw new ArgeoException("Cannot get text for of " + element, e);
+               if (element instanceof RepositoryRegister) {
+                       return "Repositories";
                }
+               return super.getText(element);
+       }
+
+       protected String getText(Node node) throws RepositoryException {
+               String label = node.getName();
+               StringBuffer mixins = new StringBuffer("");
+               for (NodeType type : node.getMixinNodeTypes())
+                       mixins.append(' ').append(type.getName());
+
+               return label + " [" + node.getPrimaryNodeType().getName() + mixins
+                               + "]";
        }
 
        @Override
        public Image getImage(Object element) {
-               if (element instanceof Node) {
-                       Node node = (Node) element;
-                       try {
-                               // 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
-                       }
-                       return NODE;
-               } else if (element instanceof RepositoryNode) {
+               if (element instanceof RepositoryNode) {
                        if (((RepositoryNode) element).getDefaultSession() == null)
                                return RepositoryNode.REPOSITORY_DISCONNECTED;
                        else