Improve JCR based UI.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jan 2021 08:31:14 +0000 (09:31 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jan 2021 08:31:14 +0000 (09:31 +0100)
org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/JcrComposite.java
org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/ScrolledPage.java
org.argeo.jcr/src/org/argeo/jcr/Jcr.java

index 0708365bda6f33d25957251df1fafbc060fa0bfd..eb43438a0f90c76a2442f84f423352f04137c738 100644 (file)
@@ -1,14 +1,14 @@
 package org.argeo.cms.ui.widgets;
 
 import javax.jcr.Item;
+import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
-import org.argeo.cms.CmsException;
 import org.argeo.cms.ui.util.CmsUiUtils;
-import org.eclipse.swt.SWT;
+import org.argeo.jcr.JcrException;
 import org.eclipse.swt.widgets.Composite;
 
 /** A composite which can (optionally) manage a JCR Item. */
@@ -42,20 +42,20 @@ public class JcrComposite extends Composite {
 //                                     // not even a reference to the item
 //                                     this.nodeId = null;
 //                             } else {
-                                       Node node;
-                                       Property property = null;
-                                       if (item instanceof Node) {
-                                               node = (Node) item;
-                                       } else {// Property
-                                               property = (Property) item;
-                                               if (property.isMultiple())// TODO manage property index
-                                                       throw new CmsException("Multiple properties not supported yet.");
-                                               this.property = property.getName();
-                                               node = property.getParent();
-                                       }
-                                       this.nodeId = node.getIdentifier();
-                                       if (cacheImmediately)
-                                               this.cache = node;
+                               Node node;
+                               Property property = null;
+                               if (item instanceof Node) {
+                                       node = (Node) item;
+                               } else {// Property
+                                       property = (Property) item;
+                                       if (property.isMultiple())// TODO manage property index
+                                               throw new UnsupportedOperationException("Multiple properties not supported yet.");
+                                       this.property = property.getName();
+                                       node = property.getParent();
+                               }
+                               this.nodeId = node.getIdentifier();
+                               if (cacheImmediately)
+                                       this.cache = node;
 //                             }
                                setLayout(CmsUiUtils.noSpaceGridLayout());
                        } catch (RepositoryException e) {
@@ -66,10 +66,10 @@ public class JcrComposite extends Composite {
        public synchronized Node getNode() {
                try {
                        if (!itemIsNode())
-                               throw new CmsException("Item is not a Node");
+                               throw new IllegalStateException("Item is not a Node");
                        return getNodeInternal();
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get node " + nodeId, e);
+                       throw new JcrException("Cannot get node " + nodeId, e);
                }
        }
 
@@ -88,24 +88,40 @@ public class JcrComposite extends Composite {
        public synchronized Property getProperty() {
                try {
                        if (itemIsNode())
-                               throw new CmsException("Item is not a Property");
+                               throw new IllegalStateException("Item is not a Property");
                        Node node = getNodeInternal();
                        if (!node.hasProperty(property))
-                               throw new CmsException("Property " + property + " is not set on " + node);
+                               throw new IllegalStateException("Property " + property + " is not set on " + node);
                        return node.getProperty(property);
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get property " + property + " from node " + nodeId, e);
+                       throw new JcrException("Cannot get property " + property + " from node " + nodeId, e);
                }
        }
 
-       public synchronized Boolean itemIsNode() {
+       public synchronized boolean itemIsNode() {
                return property == null;
        }
 
+       public synchronized boolean itemExists() {
+               if (session == null)
+                       return false;
+               try {
+                       Node n = session.getNodeByIdentifier(nodeId);
+                       if (!itemIsNode())
+                               return n.hasProperty(property);
+                       else
+                               return true;
+               } catch (ItemNotFoundException e) {
+                       return false;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot check whether node exists", e);
+               }
+       }
+
        /** Set/update the cache or change the node */
        public synchronized void setNode(Node node) {
                if (!itemIsNode())
-                       throw new CmsException("Cannot set a Node on a Property");
+                       throw new IllegalArgumentException("Cannot set a Node on a Property");
 
                if (node == null) {// clear cache
                        this.cache = null;
@@ -116,7 +132,7 @@ public class JcrComposite extends Composite {
 //                     if (session != null || session != node.getSession())// check session
 //                             throw new IllegalArgumentException("Uncompatible session");
 //                     if (session == null)
-                               session = node.getSession();
+                       session = node.getSession();
                        if (nodeId == null || !nodeId.equals(node.getIdentifier())) {
                                nodeId = node.getIdentifier();
                                cache = node;
@@ -132,7 +148,7 @@ public class JcrComposite extends Composite {
        /** Set/update the cache or change the property */
        public synchronized void setProperty(Property prop) {
                if (itemIsNode())
-                       throw new CmsException("Cannot set a Property on a Node");
+                       throw new IllegalArgumentException("Cannot set a Property on a Node");
 
                if (prop == null) {// clear cache
                        this.cache = null;
index 7e38a2b093bdfe85acb9ced27277cc332b0be116..517e796e944ccead7b930823eff203558f5bb13f 100644 (file)
@@ -6,6 +6,7 @@ import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 
 /**
  * A composite that can be scrolled vertically. It wraps a
@@ -43,6 +44,10 @@ public class ScrolledPage extends Composite {
                super.layout(changed, all);
        }
 
+       public void showControl(Control control) {
+               scrolledComposite.showControl(control);
+       }
+
        protected void updateScroll() {
                Rectangle r = scrolledComposite.getClientArea();
                Point preferredSize = computeSize(r.width, SWT.DEFAULT);
index 229d2e87a95d19b6adcdefa9f7c2e6dcee5c9ce8..4b8bfc3eae5761bcfd3d04f8cd188706ba99c242 100644 (file)
@@ -278,6 +278,85 @@ public class Jcr {
                }
        }
 
+       /**
+        * Add a node to this parent, setting its primary type and its mixins.
+        * 
+        * @param parent      the parent node
+        * @param name        the name of the node, if <code>null</code>, the primary
+        *                    type will be used (typically for XML structures)
+        * @param primaryType the primary type, if <code>null</code>
+        *                    {@link NodeType#NT_UNSTRUCTURED} will be used.
+        * @param mixins      the mixins
+        * @return the created node
+        * @see Node#addNode(String, String)
+        * @see Node#addMixin(String)
+        */
+       public static Node addNode(Node parent, String name, String primaryType, String... mixins) {
+               if (name == null && primaryType == null)
+                       throw new IllegalArgumentException("Both node name and primary type cannot be null");
+               try {
+                       Node newNode = parent.addNode(name == null ? primaryType : name,
+                                       primaryType == null ? NodeType.NT_UNSTRUCTURED : primaryType);
+                       for (String mixin : mixins) {
+                               newNode.addMixin(mixin);
+                       }
+                       return newNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add node " + name + " to " + parent, e);
+               }
+       }
+
+       /**
+        * Add an {@link NodeType#NT_BASE} node to this parent.
+        * 
+        * @param parent the parent node
+        * @param name   the name of the node, cannot be <code>null</code>
+        * @return the created node
+        * 
+        * @see Node#addNode(String)
+        */
+       public static Node addNode(Node parent, String name) {
+               if (name == null)
+                       throw new IllegalArgumentException("Node name cannot be null");
+               try {
+                       Node newNode = parent.addNode(name);
+                       return newNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add node " + name + " to " + parent, e);
+               }
+       }
+
+       /**
+        * Add mixins to a node.
+        * 
+        * @param node   the node
+        * @param mixins the mixins
+        * @return the created node
+        * @see Node#addMixin(String)
+        */
+       public static void addMixin(Node node, String... mixins) {
+               try {
+                       for (String mixin : mixins) {
+                               node.addMixin(mixin);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add mixins " + Arrays.asList(mixins) + " to " + node, e);
+               }
+       }
+
+       /**
+        * Removes this node.
+        * 
+        * @see Node#remove()
+        */
+       public static void remove(Node node) {
+               try {
+                       node.remove();
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot remove node " + node, e);
+               }
+       }
+
        /**
         * @return the node with htis id or <code>null</node> if not found
         * @see Session#getNodeByIdentifier(String)