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.cms.swt.CmsSwtUtils;
+import org.argeo.jcr.JcrException;
import org.eclipse.swt.widgets.Composite;
/** A composite which can (optionally) manage a JCR Item. */
public class JcrComposite extends Composite {
private static final long serialVersionUID = -1447009015451153367L;
- private final Session session;
+ private Session session;
private String nodeId;
private String property = null;
nodeId = null;
}
- public JcrComposite(Composite parent, int style, Item item)
- throws RepositoryException {
+ public JcrComposite(Composite parent, int style, Item item) {
this(parent, style, item, false);
}
- public JcrComposite(Composite parent, int style, Item item,
- boolean cacheImmediately) throws RepositoryException {
+ public JcrComposite(Composite parent, int style, Item item, boolean cacheImmediately) {
super(parent, style);
- this.session = item.getSession();
- if (!cacheImmediately && (SWT.READ_ONLY == (style & SWT.READ_ONLY))) {
- // (useless?) optimization: we only save a pointer to the session,
- // 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();
+ if (item != null)
+ try {
+ this.session = item.getSession();
+// if (!cacheImmediately && (SWT.READ_ONLY == (style & SWT.READ_ONLY))) {
+// // (useless?) optimization: we only save a pointer to the session,
+// // 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 UnsupportedOperationException("Multiple properties not supported yet.");
+ this.property = property.getName();
+ node = property.getParent();
+ }
+ this.nodeId = node.getIdentifier();
+ if (cacheImmediately)
+ this.cache = node;
+// }
+ setLayout(CmsSwtUtils.noSpaceGridLayout());
+ } catch (RepositoryException e) {
+ throw new IllegalStateException("Cannot create composite from " + item, e);
}
- this.nodeId = node.getIdentifier();
- if (cacheImmediately)
- this.cache = node;
- }
- setLayout(CmsUiUtils.noSpaceGridLayout());
}
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);
}
}
return null;
}
+ public synchronized String getPropertyName() {
+ try {
+ return getProperty().getName();
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot get property name", e);
+ }
+ }
+
+ public synchronized Node getPropertyNode() {
+ try {
+ return getProperty().getNode();
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot get property name", 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) throws RepositoryException {
+ 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;
return;
}
- if (session == null || session != node.getSession())// check session
- throw new CmsException("Uncompatible session");
-
- if (nodeId == null || !nodeId.equals(node.getIdentifier())) {
- nodeId = node.getIdentifier();
- cache = node;
- itemUpdated();
- } else {
- cache = node;// set/update cache
+ try {
+// if (session != null || session != node.getSession())// check session
+// throw new IllegalArgumentException("Uncompatible session");
+// if (session == null)
+ session = node.getSession();
+ if (nodeId == null || !nodeId.equals(node.getIdentifier())) {
+ nodeId = node.getIdentifier();
+ cache = node;
+ itemUpdated();
+ } else {
+ cache = node;// set/update cache
+ }
+ } catch (RepositoryException e) {
+ throw new IllegalStateException(e);
}
}
/** Set/update the cache or change the property */
- public synchronized void setProperty(Property prop)
- throws RepositoryException {
+ 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;
return;
}
- if (session == null || session != prop.getSession())// check session
- throw new CmsException("Uncompatible session");
-
- Node node = prop.getNode();
- if (nodeId == null || !nodeId.equals(node.getIdentifier())
- || !property.equals(prop.getName())) {
- nodeId = node.getIdentifier();
- property = prop.getName();
- cache = node;
- itemUpdated();
- } else {
- cache = node;// set/update cache
+ try {
+ if (session == null || session != prop.getSession())// check session
+ throw new IllegalArgumentException("Uncompatible session");
+
+ Node node = prop.getNode();
+ if (nodeId == null || !nodeId.equals(node.getIdentifier()) || !property.equals(prop.getName())) {
+ nodeId = node.getIdentifier();
+ property = prop.getName();
+ cache = node;
+ itemUpdated();
+ } else {
+ cache = node;// set/update cache
+ }
+ } catch (RepositoryException e) {
+ throw new IllegalStateException(e);
}
}
}
/** Change the node, does nothing if same. */
- public synchronized void setNodeId(String nodeId)
- throws RepositoryException {
+ public synchronized void setNodeId(String nodeId) throws RepositoryException {
if (this.nodeId != null && this.nodeId.equals(nodeId))
return;
this.nodeId = nodeId;