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/03/22 15:01:30 UTC
svn commit: r1459782 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype:
EffectiveNodeType.java ReadOnlyNodeTypeManager.java
Author: jukka
Date: Fri Mar 22 14:01:29 2013
New Revision: 1459782
URL: http://svn.apache.org/r1459782
Log:
OAK-702: Optimize access to node type information
Move the static get{Property,Node}Definition methods to EffectiveNodeType, i.e. replacing static m(o, ...) calls with o.m(...)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java?rev=1459782&r1=1459781&r2=1459782&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeType.java Fri Mar 22 14:01:29 2013
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.oak.plugins.nodetype;
+import static javax.jcr.PropertyType.UNDEFINED;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -332,6 +334,75 @@ public class EffectiveNodeType {
throw new UnsupportedRepositoryOperationException("Child node ordering is not supported on this node");
}
+ /**
+ *
+ * @param propertyName The internal oak name of the property.
+ * @param isMultiple
+ * @param type
+ * @param exactTypeMatch
+ * @return
+ * @throws ConstraintViolationException
+ */
+ public PropertyDefinition getPropertyDefinition(
+ String propertyName, boolean isMultiple,
+ int type, boolean exactTypeMatch)
+ throws ConstraintViolationException {
+ // TODO: This may need to be optimized
+ for (PropertyDefinition def : getNamedPropertyDefinitions(propertyName)) {
+ int defType = def.getRequiredType();
+ if (isMultiple == def.isMultiple()
+ &&(!exactTypeMatch || (type == defType || UNDEFINED == type || UNDEFINED == defType))) {
+ return def;
+ }
+ }
+
+ // try if there is a residual definition
+ for (PropertyDefinition def : getResidualPropertyDefinitions()) {
+ int defType = def.getRequiredType();
+ if (isMultiple == def.isMultiple()
+ && (!exactTypeMatch || (type == defType || UNDEFINED == type || UNDEFINED == defType))) {
+ return def;
+ }
+ }
+
+ throw new ConstraintViolationException(
+ "No matching property definition found for " + propertyName);
+ }
+
+ /**
+ *
+ * @param childName The internal oak name of the target node.
+ * @param childEffective
+ * @return
+ * @throws ConstraintViolationException
+ */
+ public NodeDefinition getNodeDefinition(
+ String childName, EffectiveNodeType childEffective)
+ throws ConstraintViolationException {
+ for (NodeDefinition def : getNamedNodeDefinitions(childName)) {
+ boolean match = true;
+ if (childEffective != null && !childEffective.includesNodeTypes(def.getRequiredPrimaryTypeNames())) {
+ match = false;
+ }
+ if (match) {
+ return def;
+ }
+ }
+
+ for (NodeDefinition def : getResidualNodeDefinitions()) {
+ boolean match = true;
+ if (childEffective != null && !childEffective.includesNodeTypes(def.getRequiredPrimaryTypeNames())) {
+ match = false;
+ }
+ if (match) {
+ return def;
+ }
+ }
+
+ throw new ConstraintViolationException(
+ "No matching node definition found for " + childName);
+ }
+
//------------------------------------------------------------< private >---
private PropertyDefinition getDefinition(PropertyState property) throws RepositoryException {
@@ -339,7 +410,7 @@ public class EffectiveNodeType {
int propertyType = property.getType().tag();
boolean isMultiple = property.isArray();
- return ntMgr.getDefinition(nodeTypes, propertyName, isMultiple, propertyType, true);
+ return getPropertyDefinition(propertyName, isMultiple, propertyType, true);
}
private NodeDefinition getDefinition(String nodeName, NodeType nodeType) throws ConstraintViolationException {
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=1459782&r1=1459781&r2=1459782&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 Fri Mar 22 14:01:29 2013
@@ -399,8 +399,8 @@ public abstract class ReadOnlyNodeTypeMa
throws RepositoryException {
checkNotNull(parent);
checkNotNull(nodeName);
-
- return getNodeDefinition(getEffectiveNodeType(parent), nodeName, null);
+ EffectiveNodeType effective = getEffectiveNodeType(parent);
+ return effective.getNodeDefinition(nodeName, null);
}
@Override
@@ -411,7 +411,7 @@ public abstract class ReadOnlyNodeTypeMa
String name = targetNode.getName();
EffectiveNodeType eff = getEffectiveNodeType(parent);
- return getNodeDefinition(eff, name, getEffectiveNodeType(targetNode));
+ return eff.getNodeDefinition(name, getEffectiveNodeType(targetNode));
}
@Override
@@ -419,7 +419,7 @@ public abstract class ReadOnlyNodeTypeMa
String nodeName, NodeType nodeType)
throws ConstraintViolationException {
EffectiveNodeType eff = getEffectiveNodeType(Queues.newArrayDeque(parentNodeTypes));
- return getNodeDefinition(eff, nodeName, getEffectiveNodeType(Queues.newArrayDeque(Collections.singleton(nodeType))));
+ return eff.getNodeDefinition(nodeName, getEffectiveNodeType(Queues.newArrayDeque(Collections.singleton(nodeType))));
}
@Override
@@ -436,7 +436,8 @@ public abstract class ReadOnlyNodeTypeMa
type = targetProperty.getValue().getType();
}
- return getPropertyDefinition(getEffectiveNodeType(parent), name, isMultiple, type, true);
+ EffectiveNodeType effective = getEffectiveNodeType(parent);
+ return effective.getPropertyDefinition(name, isMultiple, type, true);
}
@Nonnull
@@ -448,13 +449,15 @@ public abstract class ReadOnlyNodeTypeMa
@Nonnull
@Override
public PropertyDefinition getDefinition(Node parent, String propertyName, boolean isMultiple, int type, boolean exactTypeMatch) throws RepositoryException {
- return getPropertyDefinition(getEffectiveNodeType(parent), propertyName, isMultiple, type, exactTypeMatch);
+ EffectiveNodeType effective = getEffectiveNodeType(parent);
+ return effective.getPropertyDefinition(propertyName, isMultiple, type, exactTypeMatch);
}
@Nonnull
@Override
public PropertyDefinition getDefinition(Tree parent, String propertyName, boolean isMultiple, int type, boolean exactTypeMatch) throws RepositoryException {
- return getPropertyDefinition(getEffectiveNodeType(parent), propertyName, isMultiple, type, exactTypeMatch);
+ EffectiveNodeType effective = getEffectiveNodeType(parent);
+ return effective.getPropertyDefinition(propertyName, isMultiple, type, exactTypeMatch);
}
@Nonnull
@@ -462,7 +465,8 @@ public abstract class ReadOnlyNodeTypeMa
public PropertyDefinition getDefinition(Iterable<NodeType> nodeTypes, String propertyName, boolean isMultiple,
int type, boolean exactTypeMatch) throws RepositoryException {
Queue<NodeType> queue = Queues.newArrayDeque(nodeTypes);
- return getPropertyDefinition(getEffectiveNodeType(queue), propertyName, isMultiple, type, exactTypeMatch);
+ EffectiveNodeType effective = getEffectiveNodeType(queue);
+ return effective.getPropertyDefinition(propertyName, isMultiple, type, exactTypeMatch);
}
//-----------------------------------------------------------< internal >---
@@ -493,70 +497,4 @@ public abstract class ReadOnlyNodeTypeMa
return EffectiveNodeType.create(types.values(), this);
}
- /**
- *
- * @param effectiveNodeType
- * @param propertyName The internal oak name of the property.
- * @param isMultiple
- * @param type
- * @param exactTypeMatch
- * @return
- * @throws ConstraintViolationException
- */
- private static PropertyDefinition getPropertyDefinition(EffectiveNodeType effectiveNodeType,
- String propertyName, boolean isMultiple,
- int type, boolean exactTypeMatch) throws ConstraintViolationException {
- // TODO: This may need to be optimized
- for (PropertyDefinition def : effectiveNodeType.getNamedPropertyDefinitions(propertyName)) {
- int defType = def.getRequiredType();
- if (isMultiple == def.isMultiple()
- &&(!exactTypeMatch || (type == defType || UNDEFINED == type || UNDEFINED == defType))) {
- return def;
- }
- }
-
- // try if there is a residual definition
- for (PropertyDefinition def : effectiveNodeType.getResidualPropertyDefinitions()) {
- int defType = def.getRequiredType();
- if (isMultiple == def.isMultiple()
- && (!exactTypeMatch || (type == defType || UNDEFINED == type || UNDEFINED == defType))) {
- return def;
- }
- }
-
- throw new ConstraintViolationException("No matching property definition found for " + propertyName);
- }
-
- /**
- *
- * @param effectiveNodeType
- * @param childName The internal oak name of the target node.
- * @param childEffective
- * @return
- * @throws ConstraintViolationException
- */
- private static NodeDefinition getNodeDefinition(EffectiveNodeType effectiveNodeType,
- String childName,
- EffectiveNodeType childEffective) throws ConstraintViolationException {
- for (NodeDefinition def : effectiveNodeType.getNamedNodeDefinitions(childName)) {
- boolean match = true;
- if (childEffective != null && !childEffective.includesNodeTypes(def.getRequiredPrimaryTypeNames())) {
- match = false;
- }
- if (match) {
- return def;
- }
- }
-
- for (NodeDefinition def : effectiveNodeType.getResidualNodeDefinitions()) {
- boolean match = true;
- if (childEffective != null && !childEffective.includesNodeTypes(def.getRequiredPrimaryTypeNames())) {
- match = false;
- }
- if (match) {
- return def;
- }
- }
- throw new ConstraintViolationException("No matching node definition found for " + childName);
- }
}