X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.ui%2Fsrc%2Forg%2Fargeo%2Fcms%2Fui%2Fwidgets%2FJcrComposite.java;h=5d3576f2719cc1edc05208cc6685053d2125eb94;hb=633a8acd189cc22f06944d278879601189be1bc8;hp=d47aba792019d6382fbaae83e5fb228c8383dd29;hpb=5b3108fe285bca50565b58b63fa4feddc96c0765;p=lgpl%2Fargeo-commons.git 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 d47aba792..5d3576f27 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,21 +1,21 @@ 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; @@ -28,46 +28,48 @@ public class JcrComposite extends Composite { 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); } } @@ -83,70 +85,107 @@ public class JcrComposite extends Composite { 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); } } @@ -155,8 +194,7 @@ public class JcrComposite extends Composite { } /** 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;