Author: mreutegg
Date: Mon Jan  6 17:00:59 2014
New Revision: 1555917

URL: http://svn.apache.org/r1555917
Log:
OAK-1009: Use identifier for jcr:frozenUuid when node is not referenceable

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java?rev=1555917&r1=1555916&r2=1555917&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
 Mon Jan  6 17:00:59 2014
@@ -134,8 +134,10 @@ class VersionableState {
                                         @Nonnull NodeBuilder versionable,
                                         @Nonnull ReadWriteVersionManager vMgr,
                                         @Nonnull ReadOnlyNodeTypeManager 
ntMgr) {
-        VersionableState state = new VersionableState(version, history, 
versionable, vMgr, ntMgr);
-        return state.initFrozen(version.child(JCR_FROZENNODE), versionable);
+        VersionableState state = new VersionableState(
+                version, history, versionable, vMgr, ntMgr);
+        return state.initFrozen(version.child(JCR_FROZENNODE),
+                versionable, uuidFromNode(versionable));
     }
 
     /**
@@ -164,7 +166,8 @@ class VersionableState {
      * @return this versionable state.
      */
     private VersionableState initFrozen(NodeBuilder frozen,
-                                        NodeBuilder node) {
+                                        NodeBuilder node,
+                                        String nodeId) {
         // initialize jcr:frozenNode
         frozen.setProperty(JCR_UUID, IdentifierManager.generateUUID(), 
Type.STRING);
         frozen.setProperty(JCR_PRIMARYTYPE, NT_FROZENNODE, Type.NAME);
@@ -174,14 +177,7 @@ class VersionableState {
         } else {
             mixinTypes = Collections.emptyList();
         }
-        String id;
-        if (node.hasProperty(JCR_UUID)) {
-            id = uuidFromNode(node);
-        } else {
-            // TODO: use identifier
-            id = "";
-        }
-        frozen.setProperty(JCR_FROZENUUID, id, Type.STRING);
+        frozen.setProperty(JCR_FROZENUUID, nodeId, Type.STRING);
         frozen.setProperty(JCR_FROZENPRIMARYTYPE, primaryTypeOf(node), 
Type.NAME);
         if (mixinTypes.isEmpty()) {
             frozen.removeProperty(JCR_FROZENMIXINTYPES);
@@ -200,7 +196,7 @@ class VersionableState {
      */
     NodeBuilder create() throws CommitFailedException {
         try {
-            createFrozen(versionable, frozenNode);
+            createFrozen(versionable, uuidFromNode(versionable), frozenNode);
             return frozenNode;
         } catch (RepositoryException e) {
             throw new CommitFailedException(CommitFailedException.VERSION,
@@ -444,9 +440,9 @@ class VersionableState {
         }
     }
 
-    private void createFrozen(NodeBuilder src, NodeBuilder dest)
+    private void createFrozen(NodeBuilder src, String srcId, NodeBuilder dest)
             throws CommitFailedException, RepositoryException {
-        initFrozen(dest, src);
+        initFrozen(dest, src, srcId);
         copyProperties(src, dest, new OPVProvider() {
             @Override
             public int getAction(NodeBuilder src,
@@ -464,6 +460,7 @@ class VersionableState {
         // add the frozen children and histories
         for (String name : src.getChildNodeNames()) {
             NodeBuilder child = src.getChildNode(name);
+            String childId = getChildId(srcId, child, name);
             int opv = getOPV(src, child, name);
 
             if (opv == OnParentVersionAction.ABORT) {
@@ -477,10 +474,10 @@ class VersionableState {
                     versionedChild(child, dest.child(name));
                 } else {
                     // else copy
-                    copy(child, dest.child(name));
+                    copy(child, childId, dest.child(name));
                 }
             } else if (opv == COPY) {
-                copy(child, dest.child(name));
+                copy(child, childId, dest.child(name));
             }
         }
     }
@@ -492,13 +489,32 @@ class VersionableState {
     }
 
     private void copy(NodeBuilder src,
+                      String srcId,
                       NodeBuilder dest)
             throws RepositoryException, CommitFailedException {
-        initFrozen(dest, src);
+        initFrozen(dest, src, srcId);
         copyProperties(src, dest, OPVForceCopy.INSTANCE, true);
         for (String name : src.getChildNodeNames()) {
             NodeBuilder child = src.getChildNode(name);
-            copy(child, dest.child(name));
+            copy(child, getChildId(srcId, child, name), dest.child(name));
+        }
+    }
+
+    /**
+     * Returns the id of the {@code child} node. The id is the value of the
+     * jcr:uuid property of the child node if present, or the concatenation of
+     * the {@code parentId} and the {@code name} of the child node.
+     *
+     * @param parentId the parentId.
+     * @param child the child node.
+     * @param name the name of the child node.
+     * @return the identifier of the child node.
+     */
+    private String getChildId(String parentId, NodeBuilder child, String name) 
{
+        if (child.hasProperty(JCR_UUID)) {
+            return uuidFromNode(child);
+        } else {
+            return parentId + "/" + name;
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java?rev=1555917&r1=1555916&r2=1555917&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
 Mon Jan  6 17:00:59 2014
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.jcr.ve
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
@@ -84,4 +85,18 @@ public class VersionTest extends Abstrac
         Node frozenChild = v.getFrozenNode().getNode(child.getName());
         assertEquals(ntFrozenNode, frozenChild.getPrimaryNodeType().getName());
     }
+
+    // OAK-1009
+    public void testFrozenUUID() throws RepositoryException {
+        Node n = testRootNode.addNode(nodeName1, testNodeType);
+        n.addMixin(mixVersionable);
+        Node child = n.addNode(nodeName2, ntUnstructured);
+        superuser.save();
+        VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+        vMgr.checkpoint(n.getPath());
+        Version v = vMgr.getBaseVersion(n.getPath());
+        Node frozenChild = v.getFrozenNode().getNode(child.getName());
+        assertEquals(child.getIdentifier(),
+                frozenChild.getProperty(Property.JCR_FROZEN_UUID).getString());
+    }
 }


Reply via email to