You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/12/15 16:22:52 UTC

svn commit: r890824 - /jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java

Author: jukka
Date: Tue Dec 15 15:22:51 2009
New Revision: 890824

URL: http://svn.apache.org/viewvc?rev=890824&view=rev
Log:
JCR-2439: More utility methods in JcrUtils

Make the getOrAddNode(parent, name, type) method ensure that the returned node matches the given type.

Modified:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java?rev=890824&r1=890823&r2=890824&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java Tue Dec 15 15:22:51 2009
@@ -23,6 +23,7 @@
 import javax.imageio.spi.ServiceRegistry;
 import javax.jcr.Binary;
 import javax.jcr.Item;
+import javax.jcr.ItemExistsException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.Property;
@@ -374,21 +375,38 @@
      * it does not already exist. If the child node gets added, then it
      * is created with the given node type. The caller is expected to take
      * care of saving or discarding any transient changes.
+     * <p>
+     * This method ensures not only that the named child node exists but
+     * also that it matches the given node type.  If the child node already
+     * exists but does not match the given node type, then an
+     * {@link ItemExistsException} is thrown to indicate that a node of the
+     * given type can only be added if the previous node is first removed.
      *
      * @see Node#getNode(String)
-     * @see Node#addNode(String)
+     * @see Node#addNode(String, String)
+     * @see Node#isNodeType(String)
      * @param parent parent node
      * @param name name of the child node
-     * @param type the node type to use for the child node in case
-     *             it needs to be created, ignored otherwise
+     * @param type type of the child node
      * @return child node
+     * @throws ItemExistsException if the child node already exists but
+     *                             has a different type than specified
      * @throws RepositoryException if the child node can not be
      *                             accessed or created
      */
     public static Node getOrAddNode(Node parent, String name, String type)
             throws RepositoryException {
         if (parent.hasNode(name)) {
-            return parent.getNode(name);
+            Node node = parent.getNode(name);
+            if (node.isNodeType(type)) {
+                return node;
+            } else {
+                throw new ItemExistsException(
+                        "Unable to add a node of type " + type
+                        + " at path " + node.getPath()
+                        + " since it already exists with the different type "
+                        + node.getPrimaryNodeType().getName());
+            }
         } else {
             return parent.addNode(name, type);
         }