From 3da826131490e5f3ae2d67ffdc80c1b3e19f38fa Mon Sep 17 00:00:00 2001
From: Jukka Zitting <jukka@apache.org>
Date: Wed, 24 Aug 2011 18:15:14 +0200
Subject: [PATCH 2/2] JCR-3060: Add utility methods for path creation

Use the extended getOrAddNode to implement getOrCreate.
---
 .../org/apache/jackrabbit/commons/JcrUtils.java    |   65 ++-----------------
 1 files changed, 7 insertions(+), 58 deletions(-)

diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
index 22cb261..68c107a 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
@@ -1226,65 +1226,14 @@ public class JcrUtils {
                                   String nodeType,
                                   boolean autoSave)
             throws RepositoryException {
-
-        if (!createUniqueLeaf && baseNode.hasNode(path)) {
-            // node at path already exists, quicker way
-            return baseNode.getNode(path);
+        if (createUniqueLeaf) {
+            path = path + "*";
         }
-
-        Node node = baseNode;
-        int pos = path.lastIndexOf('/');
-
-        // intermediate path elements
-        if (pos != -1) {
-            final StringTokenizer st = new StringTokenizer(path.substring(0, pos), "/");
-            while (st.hasMoreTokens()) {
-                final String token = st.nextToken();
-                if (!node.hasNode(token)) {
-                    try {
-                        if ( intermediateNodeType != null ) {
-                            node.addNode(token, intermediateNodeType);
-                        } else {
-                            node.addNode(token);
-                        }
-                        if (autoSave) node.getSession().save();
-                    } catch (RepositoryException e) {
-                        // we ignore this as this folder might be created from a different task
-                        node.refresh(false);
-                    }
-                }
-                node = node.getNode(token);
-            }
-            path = path.substring(pos + 1);
+        Node node = getOrAddNode(
+                baseNode, path, intermediateNodeType, nodeType);
+        if (autoSave) {
+           baseNode.getSession().save();
         }
-
-        // last path element (path = leaf node name)
-        if (!node.hasNode(path)) {
-            if ( nodeType != null ) {
-                node.addNode(path, nodeType);
-            } else {
-                node.addNode(path);
-            }
-            if (autoSave) node.getSession().save();
-        } else if (createUniqueLeaf) {
-            // leaf node already exists, create new unique name
-            String leafNodeName;
-            int i = 0;
-            do {
-                leafNodeName = path + String.valueOf(i);
-                i++;
-            } while (node.hasNode(leafNodeName));
-
-            Node leaf;
-            if ( nodeType != null ) {
-                leaf = node.addNode(leafNodeName, nodeType);
-            } else {
-                leaf = node.addNode(leafNodeName);
-            }
-            if (autoSave) node.getSession().save();
-            return leaf;
-        }
-
-        return node.getNode(path);
+        return node;
     }
 }
-- 
1.7.4.4

