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. */
// // 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) {
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);
}
}
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;
// 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;
/** 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;
}
}
+ /**
+ * 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)