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 15:45:54 UTC

svn commit: r1476203 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: NodeImpl.java delegate/NodeDelegate.java

Author: jukka
Date: Fri Apr 26 13:45:54 2013
New Revision: 1476203

URL: http://svn.apache.org/r1476203
Log:
OAK-702: Optimize access to node type information

Streamline canAddMixin()

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1476203&r1=1476202&r2=1476203&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Fri Apr 26 13:45:54 2013
@@ -19,7 +19,6 @@ package org.apache.jackrabbit.oak.jcr;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Calendar;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
 import javax.annotation.Nonnull;
@@ -82,10 +81,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.singleton;
 import static javax.jcr.Property.JCR_LOCK_IS_DEEP;
 import static javax.jcr.Property.JCR_LOCK_OWNER;
 import static javax.jcr.PropertyType.UNDEFINED;
+import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
 
 /**
  * TODO document
@@ -860,11 +863,11 @@ public class NodeImpl<T extends NodeDele
 
     @Override
     public void addMixin(String mixinName) throws RepositoryException {
-        final String oakMixinName = getOakName(mixinName);
+        final String oakTypeName = getOakName(checkNotNull(mixinName));
         perform(new ItemWriteOperation<Void>() {
             @Override
             public Void perform() throws RepositoryException {
-                dlg.addMixin(oakMixinName);
+                dlg.addMixin(oakTypeName);
                 return null;
             }
         });
@@ -888,23 +891,13 @@ public class NodeImpl<T extends NodeDele
     }
 
     @Override
-    public boolean canAddMixin(final String mixinName) throws RepositoryException {
+    public boolean canAddMixin(String mixinName) throws RepositoryException {
+        final String oakTypeName = getOakName(mixinName);
         return perform(new ItemReadOperation<Boolean>() {
             @Override
             public Boolean perform() throws RepositoryException {
-
-                // TODO: figure out the right place for this check
-                NodeType nt = getNodeTypeManager().getNodeType(mixinName); // throws on not found
-                if (!nt.isMixin()) {
-                    return false;
-                }
-                // TODO: END
-
-                if (!hasNtMgtPermission(JcrConstants.JCR_MIXINTYPES, mixinName)) {
-                    return false;
-                }
-
-                return getEffectiveNodeType().supportsMixin(mixinName);
+                return hasNtMgtPermission(JCR_MIXINTYPES, oakTypeName)
+                        && dlg.canAddMixin(oakTypeName);
             }
         });
     }
@@ -1387,14 +1380,20 @@ public class NodeImpl<T extends NodeDele
         });
     }
 
-    private boolean hasNtMgtPermission(String propertyName, String ntName) throws RepositoryException {
+    // TODO: Move to NodeDelegate?
+    private boolean hasNtMgtPermission(
+            String oakPropertyName, String oakTypeName)
+            throws RepositoryException {
         PropertyState property;
-        if (JcrConstants.JCR_MIXINTYPES.equals(propertyName)) {
-            property = PropertyStates.createProperty(propertyName, Collections.singleton(getOakName(ntName)), Type.NAMES);
+        if (JCR_MIXINTYPES.equals(oakPropertyName)) {
+            property = PropertyStates.createProperty(
+                    oakPropertyName, singleton(oakTypeName), NAMES);
         } else {
-            property = PropertyStates.createProperty(propertyName, getOakName(ntName), Type.NAME);
+            property = PropertyStates.createProperty(
+                    oakPropertyName, oakTypeName, NAME);
         }
-        return sessionContext.getPermissionProvider().isGranted(dlg.getTree(), property, Permissions.NODE_TYPE_MANAGEMENT);
+        return sessionContext.getPermissionProvider().isGranted(
+                dlg.getTree(), property, Permissions.NODE_TYPE_MANAGEMENT);
     }
 
 }

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=1476203&r1=1476202&r2=1476203&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 13:45:54 2013
@@ -229,6 +229,18 @@ public class NodeDelegate extends ItemDe
         }
     }
 
+    public boolean canAddMixin(String typeName) throws RepositoryException {
+        Tree typeRoot = sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);
+        Tree type = typeRoot.getChild(typeName);
+        if (type != null) {
+            return !getBoolean(type, JCR_IS_ABSTRACT)
+                    && getBoolean(type, JCR_ISMIXIN);
+        } else {
+            throw new NoSuchNodeTypeException(
+                    "Node type " + typeName + " does not exist");
+        }
+    }
+
     public void addMixin(String typeName) throws RepositoryException {
         Tree typeRoot = sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);