You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2014/05/01 18:32:42 UTC
svn commit: r1591704 - in /jackrabbit/oak/trunk/oak-upgrade/src:
main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
Author: jukka
Date: Thu May 1 16:32:42 2014
New Revision: 1591704
URL: http://svn.apache.org/r1591704
Log:
OAK-1789: Upgraded version history has UUIDs as jcr:frozenUuid of non-referenceable nodes
Automatically convert UUIDs to path identifiers where needed.
Modified:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java?rev=1591704&r1=1591703&r2=1591704&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java Thu May 1 16:32:42 2014
@@ -18,16 +18,25 @@ package org.apache.jackrabbit.oak.upgrad
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.addAll;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Maps.newLinkedHashMap;
+import static com.google.common.collect.Sets.newHashSet;
import static com.google.common.collect.Sets.newLinkedHashSet;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENMIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENPRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENUUID;
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
import static org.apache.jackrabbit.JcrConstants.MIX_REFERENCEABLE;
+import static org.apache.jackrabbit.JcrConstants.NT_FROZENNODE;
import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
+import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
+import static org.apache.jackrabbit.oak.api.Type.STRING;
import static org.apache.jackrabbit.oak.plugins.tree.TreeConstants.OAK_CHILD_ORDER;
import java.io.ByteArrayInputStream;
@@ -97,6 +106,8 @@ class JackrabbitNodeState extends Abstra
private final TypePredicate isOrderable;
+ private final TypePredicate isFrozenNode;
+
/**
* Source namespace mappings (URI -< prefix).
*/
@@ -116,6 +127,7 @@ class JackrabbitNodeState extends Abstra
this.loader = parent.loader;
this.isReferenceable = parent.isReferenceable;
this.isOrderable = parent.isOrderable;
+ this.isFrozenNode = parent.isFrozenNode;
this.uriToPrefix = parent.uriToPrefix;
this.nodes = createNodes(bundle);
this.properties = createProperties(bundle);
@@ -133,6 +145,7 @@ class JackrabbitNodeState extends Abstra
this.loader = new BundleLoader(source);
this.isReferenceable = new TypePredicate(root, MIX_REFERENCEABLE);
this.isOrderable = TypePredicate.isOrderable(root);
+ this.isFrozenNode = new TypePredicate(root, NT_FROZENNODE);
this.uriToPrefix = uriToPrefix;
try {
NodePropBundle bundle = loader.loadBundle(id);
@@ -239,7 +252,7 @@ class JackrabbitNodeState extends Abstra
return children;
}
- public Map<String, PropertyState> createProperties(NodePropBundle bundle) {
+ private Map<String, PropertyState> createProperties(NodePropBundle bundle) {
Map<String, PropertyState> properties = newHashMap();
String primary;
@@ -290,6 +303,32 @@ class JackrabbitNodeState extends Abstra
}
}
+ // OAK-1789: Convert the jcr:frozenUuid of a non-referenceable
+ // frozen node from UUID to a path identifier
+ PropertyState frozenUuid = properties.get(JCR_FROZENUUID);
+ if (frozenUuid != null
+ && frozenUuid.getType() == STRING
+ && isFrozenNode.apply(primary, mixins)) {
+ String frozenPrimary = NT_UNSTRUCTURED;
+ Set<String> frozenMixins = newHashSet();
+
+ PropertyState property = properties.get(JCR_FROZENPRIMARYTYPE);
+ if (property != null && property.getType() == NAME) {
+ primary = property.getValue(NAME);
+ }
+ property = properties.get(JCR_FROZENMIXINTYPES);
+ if (property != null && property.getType() == NAMES) {
+ addAll(frozenMixins, property.getValue(NAMES));
+ }
+
+ if (!isReferenceable.apply(frozenPrimary, frozenMixins)) {
+ frozenUuid = PropertyStates.createProperty(
+ JCR_FROZENUUID,
+ parent.getString(JCR_FROZENUUID) + "/" + name);
+ properties.put(JCR_FROZENUUID, frozenUuid);
+ }
+ }
+
return properties;
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java?rev=1591704&r1=1591703&r2=1591704&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java Thu May 1 16:32:42 2014
@@ -22,6 +22,10 @@ import static junit.framework.Assert.ass
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENMIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENPRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_FROZENUUID;
+import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -35,6 +39,7 @@ import javax.jcr.Node;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
@@ -43,6 +48,8 @@ import javax.jcr.nodetype.NodeTypeTempla
import javax.jcr.nodetype.PropertyDefinition;
import javax.jcr.nodetype.PropertyDefinitionTemplate;
import javax.jcr.security.Privilege;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.JackrabbitWorkspace;
@@ -61,9 +68,7 @@ public class RepositoryUpgradeTest exten
new Random().nextBytes(BINARY);
}
- // needs to be static because the content is created during the @BeforeClass phase
- private static String testNodeIdentifier;
-
+ @SuppressWarnings("unchecked")
protected void createSourceContent(Repository repository) throws Exception {
Session session = repository.login(CREDENTIALS);
try {
@@ -104,11 +109,13 @@ public class RepositoryUpgradeTest exten
Node referenceable =
root.addNode("referenceable", "test:unstructured");
referenceable.addMixin(NodeType.MIX_REFERENCEABLE);
- Node referenceable2 =
- root.addNode("referenceable2", "test:unstructured");
- referenceable2.addMixin(NodeType.MIX_REFERENCEABLE);
+ Node versionable =
+ root.addNode("versionable", "test:unstructured");
+ versionable.addMixin(NodeType.MIX_VERSIONABLE);
+ versionable.addNode("child", "test:unstructured");
session.save();
- testNodeIdentifier = referenceable.getIdentifier();
+
+ session.getWorkspace().getVersionManager().checkin("/versionable");
Node properties = root.addNode("properties", "test:unstructured");
properties.setProperty("boolean", true);
@@ -125,8 +132,8 @@ public class RepositoryUpgradeTest exten
properties.setProperty("long", 9876543210L);
properties.setProperty("reference", referenceable);
properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true));
- properties.setProperty("mv_reference", new Value[]{session.getValueFactory().createValue(referenceable2, false)});
- properties.setProperty("mv_weak_reference", new Value[]{session.getValueFactory().createValue(referenceable2, true)});
+ properties.setProperty("mv_reference", new Value[]{session.getValueFactory().createValue(versionable, false)});
+ properties.setProperty("mv_weak_reference", new Value[]{session.getValueFactory().createValue(versionable, true)});
properties.setProperty("string", "test");
properties.setProperty("multiple", "a,b,c".split(","));
session.save();
@@ -316,6 +323,10 @@ public class RepositoryUpgradeTest exten
public void verifyReferencePropertiesContent() throws Exception {
Session session = createAdminSession();
try {
+ assertTrue(session.nodeExists("/referenceable"));
+ String testNodeIdentifier =
+ session.getNode("/referenceable").getIdentifier();
+
assertTrue(session.nodeExists("/properties"));
Node properties = session.getNode("/properties");
@@ -333,7 +344,7 @@ public class RepositoryUpgradeTest exten
assertEquals(properties.getPath() + "/reference", refs.nextProperty().getPath());
assertFalse(refs.hasNext());
- PropertyIterator refs2 = session.getNode("/referenceable2").getReferences();
+ PropertyIterator refs2 = session.getNode("/versionable").getReferences();
assertTrue(refs2.hasNext());
assertEquals(properties.getPath() + "/mv_reference", refs2.nextProperty().getPath());
assertFalse(refs2.hasNext());
@@ -351,7 +362,7 @@ public class RepositoryUpgradeTest exten
assertTrue(weakRefs.hasNext());
assertEquals(properties.getPath() + "/weak_reference", weakRefs.nextProperty().getPath());
assertFalse(weakRefs.hasNext());
- PropertyIterator weakRefs2 = session.getNode("/referenceable2").getWeakReferences();
+ PropertyIterator weakRefs2 = session.getNode("/versionable").getWeakReferences();
assertTrue(weakRefs2.hasNext());
assertEquals(properties.getPath() + "/mv_weak_reference", weakRefs2.nextProperty().getPath());
assertFalse(weakRefs2.hasNext());
@@ -360,4 +371,46 @@ public class RepositoryUpgradeTest exten
}
}
+ @Test
+ public void verifyVersionHistory() throws RepositoryException {
+ Session session = createAdminSession();
+ try {
+ assertTrue(session.nodeExists("/versionable"));
+ Node versionable = session.getNode("/versionable");
+ assertTrue(versionable.hasNode("child"));
+ Node child = versionable.getNode("child");
+
+ assertFalse(versionable.isCheckedOut());
+ assertTrue(versionable.hasProperty(JCR_UUID));
+ assertFalse(versionable.getNode("child").isCheckedOut());
+ assertFalse(versionable.getNode("child").hasProperty(JCR_UUID));
+
+ VersionManager manager = session.getWorkspace().getVersionManager();
+ Version version = manager.getBaseVersion("/versionable");
+
+ Node frozen = version.getFrozenNode();
+ assertEquals(
+ versionable.getPrimaryNodeType().getName(),
+ frozen.getProperty(JCR_FROZENPRIMARYTYPE).getString());
+ assertEquals(
+ versionable.getMixinNodeTypes()[0].getName(),
+ frozen.getProperty(JCR_FROZENMIXINTYPES).getValues()[0].getString());
+ assertEquals(
+ versionable.getIdentifier(),
+ frozen.getProperty(JCR_FROZENUUID).getString());
+
+ Node frozenChild = frozen.getNode("child");
+ assertEquals(
+ child.getPrimaryNodeType().getName(),
+ frozenChild.getProperty(JCR_FROZENPRIMARYTYPE).getString());
+ assertFalse(frozenChild.hasProperty(JCR_FROZENMIXINTYPES));
+ assertEquals(
+ "OAK-1789",
+ child.getIdentifier(),
+ frozenChild.getProperty(JCR_FROZENUUID).getString());
+ } finally {
+ session.logout();
+ }
+ }
+
}