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/04/26 17:20:55 UTC
svn commit: r1476253 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/
oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ oak-j...
Author: jukka
Date: Fri Apr 26 15:20:54 2013
New Revision: 1476253
URL: http://svn.apache.org/r1476253
Log:
OAK-702: Optimize access to node type information
Optimize checkProtected()
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java
jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeConstants.java Fri Apr 26 15:20:54 2013
@@ -65,6 +65,12 @@ public interface NodeTypeConstants exten
String OAK_MIXIN_SUBTYPES = "oak:mixinSubtypes";
String OAK_MANDATORY_PROPERTIES = "oak:mandatoryProperties";
String OAK_MANDATORY_CHILD_NODES = "oak:mandatoryChildNodes";
+ String OAK_PROTECTED_PROPERTIES = "oak:protectedProperties";
+ String OAK_PROTECTED_CHILD_NODES = "oak:protectedChildNodes";
+ String OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES =
+ "oak:hasProtectedResidualProperties";
+ String OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES =
+ "oak:hasProtectedResidualChildNodes";
String OAK_NAMED_SINGLE_VALUED_PROPERTIES =
"oak:namedSingleValuedProperties";
String OAK_RESIDUAL_CHILD_NODE_DEFINITIONS =
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/RegistrationEditor.java Fri Apr 26 15:20:54 2013
@@ -31,6 +31,7 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_NODETYPENAME;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.JcrConstants.JCR_PROPERTYDEFINITION;
+import static org.apache.jackrabbit.JcrConstants.JCR_PROTECTED;
import static org.apache.jackrabbit.JcrConstants.JCR_REQUIREDPRIMARYTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_REQUIREDTYPE;
import static org.apache.jackrabbit.JcrConstants.JCR_SUPERTYPES;
@@ -44,6 +45,8 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.api.Type.STRING;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_CHILD_NODE_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES;
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;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_SUBTYPES;
@@ -51,6 +54,8 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_SINGLE_VALUED_PROPERTIES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_PROPERTY_DEFINITIONS;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROPERTY_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_CHILD_NODES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_PROPERTIES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_CHILD_NODE_DEFINITIONS;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_PROPERTY_DEFINITIONS;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_SUBTYPES;
@@ -167,6 +172,14 @@ class RegistrationEditor extends Default
mergeNameList(type, supertype, OAK_SUPERTYPES);
mergeNameList(type, supertype, OAK_MANDATORY_PROPERTIES);
mergeNameList(type, supertype, OAK_MANDATORY_CHILD_NODES);
+ mergeNameList(type, supertype, OAK_PROTECTED_PROPERTIES);
+ mergeNameList(type, supertype, OAK_PROTECTED_CHILD_NODES);
+ if (supertype.getBoolean(OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES)) {
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES, true);
+ }
+ if (supertype.getBoolean(OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES)) {
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES, true);
+ }
mergeNameList(type, supertype, OAK_NAMED_SINGLE_VALUED_PROPERTIES);
mergeSubtree(type, supertype, OAK_NAMED_PROPERTY_DEFINITIONS, 2);
mergeSubtree(type, supertype, OAK_RESIDUAL_PROPERTY_DEFINITIONS, 1);
@@ -224,6 +237,11 @@ class RegistrationEditor extends Default
type.setProperty(OAK_PRIMARY_SUBTYPES, empty, NAMES);
type.setProperty(OAK_MANDATORY_PROPERTIES, empty, NAMES);
type.setProperty(OAK_MANDATORY_CHILD_NODES, empty, NAMES);
+ type.setProperty(OAK_PROTECTED_PROPERTIES, empty, NAMES);
+ type.setProperty(OAK_PROTECTED_CHILD_NODES, empty, NAMES);
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES, false, BOOLEAN);
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES, false, BOOLEAN);
+ type.setProperty(OAK_PROTECTED_CHILD_NODES, false, BOOLEAN);
type.setProperty(OAK_NAMED_SINGLE_VALUED_PROPERTIES, empty, NAMES);
type.removeChildNode(OAK_NAMED_PROPERTY_DEFINITIONS);
type.removeChildNode(OAK_RESIDUAL_PROPERTY_DEFINITIONS);
@@ -279,8 +297,17 @@ class RegistrationEditor extends Default
if (definition.getBoolean(JCR_MANDATORY)) {
addNameToList(type, OAK_MANDATORY_PROPERTIES, propertyName);
}
+ // - jcr:protected (BOOLEAN) protected mandatory
+ if (definition.getBoolean(JCR_PROTECTED)) {
+ addNameToList(type, OAK_PROTECTED_PROPERTIES, propertyName);
+ }
} else {
definitions = type.child(OAK_RESIDUAL_PROPERTY_DEFINITIONS);
+
+ // - jcr:protected (BOOLEAN) protected mandatory
+ if (definition.getBoolean(JCR_PROTECTED)) {
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES, true);
+ }
}
definitions.setProperty(
JCR_PRIMARYTYPE, OAK_PROPERTY_DEFINITIONS, NAME);
@@ -326,8 +353,17 @@ class RegistrationEditor extends Default
if (definition.getBoolean(JCR_MANDATORY)) {
addNameToList(type, OAK_MANDATORY_CHILD_NODES, childNodeName);
}
+ // - jcr:protected (BOOLEAN) protected mandatory
+ if (definition.getBoolean(JCR_PROTECTED)) {
+ addNameToList(type, OAK_PROTECTED_CHILD_NODES, childNodeName);
+ }
} else {
definitions = type.child(OAK_RESIDUAL_CHILD_NODE_DEFINITIONS);
+
+ // - jcr:protected (BOOLEAN) protected mandatory
+ if (definition.getBoolean(JCR_PROTECTED)) {
+ type.setProperty(OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES, true);
+ }
}
definitions.setProperty(
JCR_PRIMARYTYPE, OAK_CHILD_NODE_DEFINITIONS, NAME);
Modified: jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/resources/org/apache/jackrabbit/oak/plugins/nodetype/write/builtin_nodetypes.cnd Fri Apr 26 15:20:54 2013
@@ -431,6 +431,10 @@
- oak:mixinSubtypes (NAME) protected multiple autocreated
- oak:mandatoryProperties (NAME) protected multiple autocreated
- oak:mandatoryChildNodes (NAME) protected multiple autocreated
+ - oak:protectedProperties (NAME) protected multiple autocreated
+ - oak:protectedChildNodes (NAME) protected multiple autocreated
+ - oak:hasProtectedResidualProperties (BOOLEAN) protected autocreated
+ - oak:hasProtectedResidualChildNodes (BOOLEAN) protected autocreated
- oak:namedSingleValuedProperties (NAME) protected multiple autocreated
+ oak:namedPropertyDefinitions (oak:namedPropertyDefinitions) = oak:namedPropertyDefinitions protected mandatory
+ oak:residualPropertyDefinitions (oak:propertyDefinitions) = oak:propertyDefinitions protected mandatory
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java Fri Apr 26 15:20:54 2013
@@ -275,15 +275,9 @@ abstract class ItemImpl<T extends ItemDe
protected abstract ItemDefinition internalGetDefinition() throws RepositoryException;
void checkProtected() throws RepositoryException {
- ItemDefinition definition;
- try {
- definition = internalGetDefinition();
- } catch (RepositoryException ignore) {
- // FIXME: No definition -> not protected but a different error
- // which should be handled else where
- return;
+ if (dlg.isProtected()) {
+ throw new ConstraintViolationException("Item is protected.");
}
- checkProtected(definition);
}
void checkProtected(ItemDefinition definition) throws ConstraintViolationException {
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java Fri Apr 26 15:20:54 2013
@@ -43,6 +43,8 @@ public abstract class ItemDelegate {
this.location = checkNotNull(location);
}
+ public abstract boolean isProtected() throws InvalidItemStateException;
+
/**
* Get the name of this item
* @return oak name of this item
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java Fri Apr 26 15:20:54 2013
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.jcr.delegate;
+import static com.google.common.collect.Iterables.addAll;
import static com.google.common.collect.Iterables.contains;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
@@ -29,7 +30,9 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_LASTMODIFIED;
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_MULTIPLE;
+import static org.apache.jackrabbit.JcrConstants.JCR_NODETYPENAME;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.JCR_PROTECTED;
import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
import static org.apache.jackrabbit.oak.api.Type.BOOLEAN;
import static org.apache.jackrabbit.oak.api.Type.DATE;
@@ -40,11 +43,17 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_IS_ABSTRACT;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_LASTMODIFIEDBY;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_MIXIN_SUBTYPES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_CHILD_NODE_DEFINITIONS;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_NAMED_PROPERTY_DEFINITIONS;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PRIMARY_SUBTYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_CHILD_NODES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_PROTECTED_PROPERTIES;
import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_CHILD_NODE_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_RESIDUAL_PROPERTY_DEFINITIONS;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.OAK_SUPERTYPES;
import java.util.Calendar;
import java.util.Collections;
@@ -109,6 +118,89 @@ public class NodeDelegate extends ItemDe
return sessionDelegate.getIdManager().getIdentifier(getTree());
}
+ @Override
+ public boolean isProtected() throws InvalidItemStateException {
+ Tree tree = getTree();
+
+ Tree parent = tree.getParent();
+ if (parent != null) {
+ String name = tree.getName();
+ Tree typeRoot = sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);
+ List<Tree> types = getEffectiveType(parent, typeRoot);
+
+ boolean protectedResidual = false;
+ for (Tree type : types) {
+ if (contains(getNames(type, OAK_PROTECTED_CHILD_NODES), name)) {
+ return true;
+ } else if (!protectedResidual) {
+ protectedResidual = getBoolean(
+ type, OAK_HAS_PROTECTED_RESIDUAL_CHILD_NODES);
+ }
+ }
+
+ // Special case: There are one or more protected *residual*
+ // child node definitions. Iterate through them to check whether
+ // there's a matching, protected one.
+ if (protectedResidual) {
+ Set<String> typeNames = newHashSet();
+ for (Tree type : getEffectiveType(tree, typeRoot)) {
+ typeNames.add(getName(type, JCR_NODETYPENAME));
+ addAll(typeNames, getNames(type, OAK_SUPERTYPES));
+ }
+
+ for (Tree type : types) {
+ Tree definitions = type.getChild(OAK_RESIDUAL_CHILD_NODE_DEFINITIONS);
+ if (definitions != null) {
+ for (String typeName : typeNames) {
+ Tree definition = definitions.getChild(typeName);
+ if (definition != null
+ && getBoolean(definition, JCR_PROTECTED)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ boolean isProtected(String property) throws InvalidItemStateException {
+ Tree tree = getTree();
+ Tree typeRoot = sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);
+ List<Tree> types = getEffectiveType(tree, typeRoot);
+
+ boolean protectedResidual = false;
+ for (Tree type : types) {
+ if (contains(getNames(type, OAK_PROTECTED_PROPERTIES), property)) {
+ return true;
+ } else if (!protectedResidual) {
+ protectedResidual = getBoolean(
+ type, OAK_HAS_PROTECTED_RESIDUAL_PROPERTIES);
+ }
+ }
+
+ // Special case: There are one or more protected *residual*
+ // child node definitions. Iterate through them to check whether
+ // there's a matching, protected one.
+ if (protectedResidual) {
+ for (Tree type : types) {
+ Tree definitions = type.getChild(OAK_RESIDUAL_PROPERTY_DEFINITIONS);
+ if (definitions != null) {
+ for (Tree definition : definitions.getChildren()) {
+ // TODO: check for matching property type?
+ if (getBoolean(definition, JCR_PROTECTED)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
/**
* Determine whether this is the root node
*
@@ -473,22 +565,7 @@ public class NodeDelegate extends ItemDe
*/
private String getDefaultChildType(
Tree typeRoot, Tree parent, String childName) {
- List<Tree> types = newArrayList();
-
- String primary = getName(parent, JCR_PRIMARYTYPE);
- if (primary != null) {
- Tree type = typeRoot.getChild(primary);
- if (type != null) {
- types.add(type);
- }
- }
-
- for (String mixin : getNames(parent, JCR_MIXINTYPES)) {
- Tree type = typeRoot.getChild(mixin);
- if (type != null) {
- types.add(type);
- }
- }
+ List<Tree> types = getEffectiveType(parent, typeRoot);
// first look for named node definitions
for (Tree type : types) {
@@ -521,6 +598,30 @@ public class NodeDelegate extends ItemDe
return null;
}
+ /**
+ * Returns the effective node types of the given node.
+ */
+ private static List<Tree> getEffectiveType(Tree tree, Tree typeRoot) {
+ List<Tree> types = newArrayList();
+
+ String primary = getName(tree, JCR_PRIMARYTYPE);
+ if (primary != null) {
+ Tree type = typeRoot.getChild(primary);
+ if (type != null) {
+ types.add(type);
+ }
+ }
+
+ for (String mixin : getNames(tree, JCR_MIXINTYPES)) {
+ Tree type = typeRoot.getChild(mixin);
+ if (type != null) {
+ types.add(type);
+ }
+ }
+
+ return types;
+ }
+
private String findDefaultPrimaryType(Tree typeRoot, Tree definitions) {
for (Tree definition : definitions.getChildren()) {
String defaultName = getName(definition, JCR_DEFAULTPRIMARYTYPE);
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java?rev=1476253&r1=1476252&r2=1476253&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java Fri Apr 26 15:20:54 2013
@@ -36,6 +36,11 @@ public class PropertyDelegate extends It
super(sessionDelegate, location);
}
+ @Override
+ public boolean isProtected() throws InvalidItemStateException {
+ return getParent().isProtected(getName());
+ }
+
@Nonnull
public PropertyState getPropertyState() throws InvalidItemStateException {
PropertyState p = getLocation().getProperty();