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 mr...@apache.org on 2018/11/08 15:43:03 UTC
svn commit: r1846162 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java
test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java
Author: mreutegg
Date: Thu Nov 8 15:43:03 2018
New Revision: 1846162
URL: http://svn.apache.org/viewvc?rev=1846162&view=rev
Log:
OAK-7886: Re-registering node type may corrupt registry
Apply patch
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java?rev=1846162&r1=1846161&r2=1846162&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/TypeRegistration.java Thu Nov 8 15:43:03 2018
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.collect.Iterables.addAll;
import static com.google.common.collect.Iterables.contains;
+import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static com.google.common.collect.Sets.newLinkedHashSet;
@@ -143,6 +144,7 @@ class TypeRegistration extends DefaultNo
for (String name : types.getChildNodeNames()) {
mergeSupertypes(types, types.child(name));
+ ensureNtBase(types, types.child(name));
}
for (String name : types.getChildNodeNames()) {
@@ -221,7 +223,7 @@ class TypeRegistration extends DefaultNo
}
}
- if (!getBoolean(type, JCR_ISMIXIN)
+ if (!isMixin(type)
&& !contains(getNames(type, REP_SUPERTYPES), NT_BASE)
&& !NT_BASE.equals(type.getProperty(JCR_NODETYPENAME).getValue(NAME))) {
if (types.hasChildNode(NT_BASE)) {
@@ -237,7 +239,45 @@ class TypeRegistration extends DefaultNo
}
}
- private boolean getBoolean(NodeBuilder builder, String name) {
+ /**
+ * Ensures a primary node type definition that does not extend from any
+ * other primary node type has {@code nt:base} in the {@code jcr:supertypes}
+ * list. Listing {@code nt:base} in this case is not mandatory in a CND, but
+ * is required in {@code jcr:supertypes}.
+ *
+ * @param types the parent node for all node type definitions.
+ * @param type the node type definition to process.
+ */
+ private void ensureNtBase(NodeBuilder types, NodeBuilder type) {
+ if (isMixin(type) || NT_BASE.equals(type.getName(JCR_NODETYPENAME))) {
+ return;
+ }
+ // This is a primary node type.
+ // Make sure jcr:supertypes contains nt:base when needed.
+ Iterable<String> supertypes = getNames(type, JCR_SUPERTYPES);
+ if (isEmpty(supertypes)) {
+ addNameToList(type, JCR_SUPERTYPES, NT_BASE);
+ } else {
+ // is any of the supertypes a primary node type?
+ boolean addNtBase = true;
+ for (String name : supertypes) {
+ NodeBuilder supertype = types.getChildNode(name);
+ if (!isMixin(supertype)) {
+ addNtBase = false;
+ break;
+ }
+ }
+ if (addNtBase) {
+ addNameToList(type, JCR_SUPERTYPES, NT_BASE);
+ }
+ }
+ }
+
+ private static boolean isMixin(NodeBuilder type) {
+ return getBoolean(type, JCR_ISMIXIN);
+ }
+
+ private static boolean getBoolean(NodeBuilder builder, String name) {
PropertyState property = builder.getProperty(name);
return property != null && property.getValue(BOOLEAN);
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java?rev=1846162&r1=1846161&r2=1846162&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeRegistryTest.java Thu Nov 8 15:43:03 2018
@@ -80,7 +80,6 @@ import org.apache.jackrabbit.oak.plugins
import org.jetbrains.annotations.NotNull;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import static org.hamcrest.Matchers.hasItem;
@@ -233,7 +232,6 @@ public class NodeTypeRegistryTest {
}
// OAK-7886
- @Ignore("OAK-7886")
@Test
public void reRegisterNtResource() throws Exception {
NodeTypeManager ntMgr = new ReadWriteNodeTypeManager() {