From 4f6cfbd6862813e917883ea93e13ee95edc1c024 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 18 Jan 2021 09:31:14 +0100 Subject: [PATCH] Improve JCR based UI. --- .../argeo/cms/ui/widgets/JcrComposite.java | 66 ++++++++++------ .../argeo/cms/ui/widgets/ScrolledPage.java | 5 ++ org.argeo.jcr/src/org/argeo/jcr/Jcr.java | 79 +++++++++++++++++++ 3 files changed, 125 insertions(+), 25 deletions(-) diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/JcrComposite.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/JcrComposite.java index 0708365bd..eb43438a0 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/JcrComposite.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/JcrComposite.java @@ -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; diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/ScrolledPage.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/ScrolledPage.java index 7e38a2b09..517e796e9 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/ScrolledPage.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/ScrolledPage.java @@ -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); diff --git a/org.argeo.jcr/src/org/argeo/jcr/Jcr.java b/org.argeo.jcr/src/org/argeo/jcr/Jcr.java index 229d2e87a..4b8bfc3ea 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/Jcr.java +++ b/org.argeo.jcr/src/org/argeo/jcr/Jcr.java @@ -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 null, the primary + * type will be used (typically for XML structures) + * @param primaryType the primary type, if null + * {@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 null + * @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 null if not found * @see Session#getNodeByIdentifier(String) -- 2.30.2