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/05 18:38:16 UTC
svn commit: r1592567 - in /jackrabbit/oak/branches/1.0: ./
oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/
oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/
Author: jukka
Date: Mon May 5 16:38:16 2014
New Revision: 1592567
URL: http://svn.apache.org/r1592567
Log:
1.0: Merged revisions 1591704, 1591713, 1591715 and 1591723 (OAK-1789)
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1591704,1591713,1591715,1591723
Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java?rev=1592567&r1=1592566&r2=1592567&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java Mon May 5 16:38:16 2014
@@ -18,16 +18,26 @@ 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_BASE;
+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 +107,8 @@ class JackrabbitNodeState extends Abstra
private final TypePredicate isOrderable;
+ private final TypePredicate isFrozenNode;
+
/**
* Source namespace mappings (URI -< prefix).
*/
@@ -116,9 +128,12 @@ 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);
+ this.nodes = createNodes(bundle);
+ setChildOrder();
+ fixFrozenUuid();
this.useBinaryReferences = parent.useBinaryReferences;
logNewNode(this);
}
@@ -133,11 +148,13 @@ 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);
- this.nodes = createNodes(bundle);
this.properties = createProperties(bundle);
+ this.nodes = createNodes(bundle);
+ setChildOrder();
} catch (ItemStateException e) {
throw new IllegalStateException("Unable to access node " + id, e);
}
@@ -226,6 +243,13 @@ class JackrabbitNodeState extends Abstra
//-----------------------------------------------------------< private >--
+ private void setChildOrder() {
+ if (isOrderable.apply(this)) {
+ properties.put(OAK_CHILD_ORDER, PropertyStates.createProperty(
+ OAK_CHILD_ORDER, nodes.keySet(), Type.NAMES));
+ }
+ }
+
private Map<String, NodeId> createNodes(NodePropBundle bundle) {
Map<String, NodeId> children = newLinkedHashMap();
for (ChildNodeEntry entry : bundle.getChildNodeEntries()) {
@@ -239,7 +263,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;
@@ -269,11 +293,6 @@ class JackrabbitNodeState extends Abstra
JCR_UUID, bundle.getId().toString()));
}
- if (isOrderable.apply(primary, mixins)) {
- properties.put(OAK_CHILD_ORDER, PropertyStates.createProperty(
- OAK_CHILD_ORDER, nodes.keySet(), Type.NAMES));
- }
-
for (PropertyEntry property : bundle.getPropertyEntries()) {
String name = createName(property.getName());
try {
@@ -293,6 +312,36 @@ class JackrabbitNodeState extends Abstra
return properties;
}
+ private void fixFrozenUuid() {
+ // 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(this)) {
+ String frozenPrimary = NT_BASE;
+ Set<String> frozenMixins = newHashSet();
+
+ PropertyState property = properties.get(JCR_FROZENPRIMARYTYPE);
+ if (property != null && property.getType() == NAME) {
+ frozenPrimary = property.getValue(NAME);
+ }
+ property = properties.get(JCR_FROZENMIXINTYPES);
+ if (property != null && property.getType() == NAMES) {
+ addAll(frozenMixins, property.getValue(NAMES));
+ }
+
+ if (!isReferenceable.apply(frozenPrimary, frozenMixins)) {
+ String parentFrozenUuid = parent.getString(JCR_FROZENUUID);
+ if (parentFrozenUuid != null) {
+ frozenUuid = PropertyStates.createProperty(
+ JCR_FROZENUUID, parentFrozenUuid + "/" + name);
+ properties.put(JCR_FROZENUUID, frozenUuid);
+ }
+ }
+ }
+ }
+
private org.apache.jackrabbit.oak.api.PropertyState createProperty(
String name, int type, InternalValue value)
throws RepositoryException, IOException {
Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1592567&r1=1592566&r2=1592567&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java Mon May 5 16:38:16 2014
@@ -238,7 +238,8 @@ public class RepositoryUpgrade {
logger.info(
"Copying repository content from {} to Oak", config.getHomeDir());
try {
- NodeBuilder builder = target.getRoot().builder();
+ NodeState base = target.getRoot();
+ NodeBuilder builder = base.builder();
String workspace =
source.getRepositoryConfig().getDefaultWorkspaceName();
@@ -260,6 +261,11 @@ public class RepositoryUpgrade {
copyNodeTypes(builder, uriToPrefix.inverse());
copyPrivileges(builder);
+ // Triggers compilation of type information, which we need for
+ // the type predicates used by the bulk copy operations below.
+ new TypeEditorProvider(false).getRootEditor(
+ base, builder.getNodeState(), builder, null);
+
NodeState root = builder.getNodeState();
copyVersionStore(builder, root, uriToPrefix, idxToPrefix);
copyWorkspace(builder, root, workspace, uriToPrefix, idxToPrefix);
Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java?rev=1592567&r1=1592566&r2=1592567&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java Mon May 5 16:38:16 2014
@@ -22,6 +22,12 @@ 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 static org.apache.jackrabbit.JcrConstants.MIX_VERSIONABLE;
+import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -35,6 +41,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 +50,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 +70,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 {
@@ -99,16 +106,24 @@ public class RepositoryUpgradeTest exten
nodeTypeManager.registerNodeType(template, false);
+ template = nodeTypeManager.createNodeTypeTemplate();
+ template.setName("test:referenceable");
+ template.setDeclaredSuperTypeNames(
+ new String[] {"nt:unstructured", "mix:referenceable"});
+ nodeTypeManager.registerNodeType(template, false);
+
Node root = session.getRootNode();
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", NT_UNSTRUCTURED);
+ versionable.addMixin(MIX_VERSIONABLE);
+ Node child = versionable.addNode("child", "test:referenceable");
+ child.addNode("child2", NT_UNSTRUCTURED);
session.save();
- testNodeIdentifier = referenceable.getIdentifier();
+
+ session.getWorkspace().getVersionManager().checkin("/versionable");
Node properties = root.addNode("properties", "test:unstructured");
properties.setProperty("boolean", true);
@@ -125,8 +140,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 +331,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 +352,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 +370,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 +379,60 @@ 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");
+ assertTrue(child.hasNode("child2"));
+ Node child2 = child.getNode("child2");
+
+ assertFalse(versionable.isCheckedOut());
+ assertTrue(versionable.hasProperty(JCR_UUID));
+ assertFalse(child.isCheckedOut());
+ assertTrue(child.hasProperty(JCR_UUID));
+ assertFalse(child2.isCheckedOut());
+ assertFalse(child2.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());
+
+ Node frozenChild2 = frozenChild.getNode("child2");
+ assertEquals(
+ child2.getPrimaryNodeType().getName(),
+ frozenChild2.getProperty(JCR_FROZENPRIMARYTYPE).getString());
+ assertFalse(frozenChild2.hasProperty(JCR_FROZENMIXINTYPES));
+ assertEquals(
+ "OAK-1789",
+ child2.getIdentifier(),
+ frozenChild2.getProperty(JCR_FROZENUUID).getString());
+ } finally {
+ session.logout();
+ }
+ }
+
}