You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2008/08/25 09:55:26 UTC

svn commit: r688640 - /incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java

Author: cziegeler
Date: Mon Aug 25 00:55:25 2008
New Revision: 688640

URL: http://svn.apache.org/viewvc?rev=688640&view=rev
Log:
Improve createPath methods to allow relativ paths.

Modified:
    incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java

Modified: incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java?rev=688640&r1=688639&r2=688640&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java (original)
+++ incubator/sling/trunk/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceUtil.java Mon Aug 25 00:55:25 2008
@@ -265,11 +265,43 @@
         if (path == null || path.length() == 0 || "/".equals(path)) {
             return session.getRootNode();
         } else if (!session.itemExists(path)) {
-            Node node = session.getRootNode();
-            path = path.substring(1);
-            int pos = path.lastIndexOf('/');
+            return createPath(session.getRootNode(),
+                    path.substring(1),
+                    intermediateNodeType,
+                    nodeType,
+                    autoSave);
+        } else {
+            return (Node) session.getItem(path);
+        }
+    }
+
+    /**
+     * Creates or gets the {@link javax.jcr.Node Node} at the given Path.
+     * In case it has to create the Node all non-existent intermediate path-elements
+     * will be create with the given intermediate node type and the returned node
+     * will be created with the given nodeType
+     *
+     * @param parentNode starting node
+     * @param relativePath to create
+     * @param intermediateNodeType to use for creation of intermediate nodes (or null)
+     * @param nodeType to use for creation of the final node (or null)
+     * @param autoSave Should save be called when a new node is created?
+     * @return the Node at path
+     * @throws RepositoryException in case of exception accessing the Repository
+     */
+    public static Node createPath(Node   parentNode,
+                                  String relativePath,
+                                  String intermediateNodeType,
+                                  String nodeType,
+                                  boolean autoSave)
+    throws RepositoryException {
+        if (relativePath == null || relativePath.length() == 0 || "/".equals(relativePath)) {
+            return parentNode;
+        } else if (!parentNode.hasNode(relativePath)) {
+            Node node = parentNode;
+            int pos = relativePath.lastIndexOf('/');
             if ( pos != -1 ) {
-                final StringTokenizer st = new StringTokenizer(path.substring(0, pos), "/");
+                final StringTokenizer st = new StringTokenizer(relativePath.substring(0, pos), "/");
                 while ( st.hasMoreTokens() ) {
                     final String token = st.nextToken();
                     if ( !node.hasNode(token) ) {
@@ -281,25 +313,26 @@
                             }
                             if ( autoSave ) node.save();
                         } catch (RepositoryException re) {
+                            re.printStackTrace();
                             // 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);
+                relativePath = relativePath.substring(pos + 1);
             }
-            if ( !node.hasNode(path) ) {
+            if ( !node.hasNode(relativePath) ) {
                 if ( nodeType != null ) {
-                    node.addNode(path, nodeType);
+                    node.addNode(relativePath, nodeType);
                 } else {
-                    node.addNode(path);
+                    node.addNode(relativePath);
                 }
                 if ( autoSave ) node.save();
             }
-            return node.getNode(path);
+            return node.getNode(relativePath);
         } else {
-            return (Node) session.getItem(path);
+            return parentNode.getNode(relativePath);
         }
     }
 }