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 2013/05/21 10:17:25 UTC
svn commit: r1484689 - in /jackrabbit/oak/trunk:
oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/
Author: jukka
Date: Tue May 21 08:17:24 2013
New Revision: 1484689
URL: http://svn.apache.org/r1484689
Log:
OAK-829: ConstraintViolationException while retrieving definition for all nodes with name jcr:childNodeDefinition
Drop the possible SNS index from a node name when accessing the node definition
Modified:
jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java?rev=1484689&r1=1484688&r2=1484689&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/PathUtils.java Tue May 21 08:17:24 2013
@@ -18,6 +18,9 @@ package org.apache.jackrabbit.oak.common
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
import javax.annotation.Nonnull;
/**
@@ -30,6 +33,9 @@ import javax.annotation.Nonnull;
*/
public final class PathUtils {
+ private static final Pattern SNS_PATTERN =
+ Pattern.compile("(.+)\\[[1-9][0-9]*\\]$");
+
private PathUtils() {
// utility class
}
@@ -153,6 +159,23 @@ public final class PathUtils {
}
/**
+ * Returns the given name without the possible SNS index suffix. If the
+ * name does not contain an SNS index, then it is returned as-is.
+ *
+ * @param name name with a possible SNS index suffix
+ * @return name without the SNS index suffix
+ */
+ @Nonnull
+ public static String dropIndexFromName(@Nonnull String name) {
+ Matcher matcher = SNS_PATTERN.matcher(name);
+ if (matcher.matches()) {
+ return matcher.group(1);
+ } else {
+ return name;
+ }
+ }
+
+ /**
* Calculate the number of elements in the path. The root path has zero
* elements.
*
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java?rev=1484689&r1=1484688&r2=1484689&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java Tue May 21 08:17:24 2013
@@ -28,10 +28,12 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_NODETYPENAME;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_SAMENAMESIBLINGS;
import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT;
import static org.apache.jackrabbit.oak.api.Type.UNDEFINED;
import static org.apache.jackrabbit.oak.api.Type.UNDEFINEDS;
+import static org.apache.jackrabbit.oak.commons.PathUtils.dropIndexFromName;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_IS_ABSTRACT;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MANDATORY_CHILD_NODES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MANDATORY_PROPERTIES;
@@ -187,18 +189,20 @@ class EffectiveType {
* {@code false} otherwise
*/
boolean isValidChildNode(String nameWithIndex, EffectiveType effective) {
- String nodeName = getNameWithoutIndex(nameWithIndex);
+ String name = dropIndexFromName(nameWithIndex);
+ boolean sns = !name.equals(nameWithIndex);
Set<String> typeNames = effective.getTypeNames();
// Find matching named child node definition
for (NodeState type : types) {
NodeState definitions = type
.getChildNode(OAK_NAMED_CHILD_NODE_DEFINITIONS)
- .getChildNode(nodeName);
+ .getChildNode(name);
for (String typeName : typeNames) {
NodeState definition = definitions.getChildNode(typeName);
- if (definition.exists()) {
+ if (definition.exists()
+ && sns == definition.getBoolean(JCR_SAMENAMESIBLINGS)) {
return true;
}
}
@@ -223,7 +227,8 @@ class EffectiveType {
type.getChildNode(OAK_RESIDUAL_CHILD_NODE_DEFINITIONS);
for (String typeName : typeNames) {
NodeState definition = residual.getChildNode(typeName);
- if (definition.exists()) {
+ if (definition.exists()
+ && sns == definition.getBoolean(JCR_SAMENAMESIBLINGS)) {
return true;
}
}
@@ -240,7 +245,8 @@ class EffectiveType {
*/
@CheckForNull
String getDefaultType(String nameWithIndex) {
- String name = getNameWithoutIndex(nameWithIndex);
+ String name = dropIndexFromName(nameWithIndex);
+ boolean sns = !name.equals(nameWithIndex);
for (NodeState type : types) {
NodeState named = type
@@ -254,7 +260,8 @@ class EffectiveType {
residual.getChildNodeEntries())) {
NodeState definition = entry.getNodeState();
String defaultType = definition.getName(JCR_DEFAULTPRIMARYTYPE);
- if (defaultType != null) {
+ if (defaultType != null
+ && sns == definition.getBoolean(JCR_SAMENAMESIBLINGS)) {
return defaultType;
}
}
@@ -341,22 +348,6 @@ class EffectiveType {
return names.toString();
}
- //-----------------------------------------------------------< private >--
-
- private static String getNameWithoutIndex(String name) {
- int n = name.length();
- if (n > 3 && name.charAt(n - 1) == ']') {
- int i = n - 2;
- while (i > 1 && Character.isDigit(name.charAt(i))) {
- i--;
- }
- if (name.charAt(i) == '[') {
- return name.substring(0, i);
- }
- }
- return name;
- }
-
private boolean nameSetContains(String set, String name) {
for (NodeState type : types) {
if (contains(type.getNames(set), name)) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java?rev=1484689&r1=1484688&r2=1484689&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java Tue May 21 08:17:24 2013
@@ -21,6 +21,7 @@ import static com.google.common.collect.
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.apache.jackrabbit.oak.commons.PathUtils.dropIndexFromName;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_SUPERTYPES;
@@ -390,7 +391,7 @@ public abstract class ReadOnlyNodeTypeMa
checkNotNull(parent);
checkNotNull(targetNode);
- String name = targetNode.getName();
+ String name = dropIndexFromName(targetNode.getName());
EffectiveNodeType eff = getEffectiveNodeType(parent);
return eff.getNodeDefinition(name, getEffectiveNodeType(targetNode));
}