Author: jukka
Date: Wed Jul 24 12:23:41 2013
New Revision: 1506517

URL: http://svn.apache.org/r1506517
Log:
OAK-663: oak-jcr performance optimization

Move protectedness checks to the delegate level

Modified:
    
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/SessionImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.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
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java

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=1506517&r1=1506516&r2=1506517&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
 Wed Jul 24 12:23:41 2013
@@ -87,7 +87,9 @@ abstract class ItemImpl<T extends ItemDe
         @Override
         protected void checkPreconditions() throws RepositoryException {
             dlg.checkAlive();
-            checkProtected();
+            if (dlg.isProtected()) {
+                throw new ConstraintViolationException("Item is protected.");
+            }
         }
     }
 
@@ -271,12 +273,6 @@ abstract class ItemImpl<T extends ItemDe
 
     //-----------------------------------------------------------< internal 
>---
 
-    void checkProtected() throws RepositoryException {
-        if (dlg.isProtected()) {
-            throw new ConstraintViolationException("Item is protected.");
-        }
-    }
-
     void checkProtected(ItemDefinition definition) throws 
ConstraintViolationException {
         if (definition.isProtected()) {
             throw new ConstraintViolationException("Item is protected.");

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
 Wed Jul 24 12:23:41 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -37,6 +39,7 @@ import javax.jcr.UnsupportedRepositoryOp
 import javax.jcr.ValueFactory;
 import javax.jcr.Workspace;
 import javax.jcr.lock.LockManager;
+import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.retention.RetentionManager;
 import javax.jcr.security.AccessControlManager;
 
@@ -57,7 +60,6 @@ import org.apache.jackrabbit.oak.jcr.del
 import org.apache.jackrabbit.oak.jcr.xml.ImportHandler;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
 import org.apache.jackrabbit.oak.util.TODO;
-import org.apache.jackrabbit.util.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
@@ -77,13 +79,6 @@ public class SessionImpl implements Jack
         this.sd = sessionContext.getSessionDelegate();
     }
 
-    static void checkProtectedNodes(Session session, String... absJcrPaths) 
throws RepositoryException {
-        for (String absPath : absJcrPaths) {
-            NodeImpl<?> node = (NodeImpl<?>) session.getNode(absPath);
-            node.checkProtected();
-        }
-    }
-
     static void checkIndexOnName(SessionContext sessionContext, String path) 
throws RepositoryException {
         String oakPath = sessionContext.getOakPathKeepIndex(path);
         if (oakPath != null) {
@@ -337,22 +332,22 @@ public class SessionImpl implements Jack
     }
 
     @Override
-    public void move(final String srcAbsPath, final String destAbsPath) throws 
RepositoryException {
+    public void move(String srcAbsPath, final String destAbsPath) throws 
RepositoryException {
+        final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+        final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
         sd.perform(new WriteOperation<Void>() {
             @Override
             protected void checkPreconditions() throws RepositoryException {
                 super.checkPreconditions();
-                // FIXME getRelativeParent doesn't work for fully qualified 
names. See OAK-724
-                checkProtectedNodes(SessionImpl.this,
-                        Text.getRelativeParent(srcAbsPath, 1), 
Text.getRelativeParent(destAbsPath, 1));
+                sd.checkProtectedNode(getParentPath(srcOakPath));
+                sd.checkProtectedNode(getParentPath(destOakPath));
                 checkIndexOnName(sessionContext, destAbsPath);
             }
 
             @Override
             public Void perform() throws RepositoryException {
-                sd.move(
-                        getOakPathOrThrowNotFound(srcAbsPath),
-                        getOakPathOrThrowNotFound(destAbsPath), true, 
sessionContext.getAccessManager());
+                sd.move(srcOakPath, destOakPath, true,
+                        sessionContext.getAccessManager());
                 return null;
             }
         });
@@ -360,18 +355,22 @@ public class SessionImpl implements Jack
 
     @Override
     public void removeItem(final String absPath) throws RepositoryException {
+        final String oakPath = getOakPathOrThrowNotFound(absPath);
         perform(new WriteOperation<Void>() {
             @Override
             protected Void perform() throws RepositoryException {
-                String oakPath = getOakPathOrThrowNotFound(absPath);
-                ItemImpl<?> item = getItemInternal(oakPath);
+                ItemDelegate item = sd.getItem(oakPath);
                 if (item == null) {
                     throw new PathNotFoundException(absPath);
+                } else if (item.isProtected()) {
+                    throw new ConstraintViolationException(
+                            item.getPath() + " is protected");
+                } else if (item.remove()) {
+                    return null;
+                } else {
+                    throw new RepositoryException(
+                            item.getPath() + " could not be removed");
                 }
-
-                item.checkProtected();
-                item.remove();
-                return null;
             }
         });
     }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
 Wed Jul 24 12:23:41 2013
@@ -47,11 +47,11 @@ import org.apache.jackrabbit.oak.jcr.xml
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.name.ReadWriteNamespaceRegistry;
 import 
org.apache.jackrabbit.oak.plugins.nodetype.write.ReadWriteNodeTypeManager;
-import org.apache.jackrabbit.util.Text;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
 import static 
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
 
 /**
@@ -126,31 +126,35 @@ public class WorkspaceImpl implements Ja
 
     @Override
     public void copy(String srcWorkspace, String srcAbsPath, String 
destAbsPath) throws RepositoryException {
+        final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+        final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+        // TODO: use perform()
         ensureIsAlive();
 
         if (!getName().equals(srcWorkspace)) {
             throw new UnsupportedRepositoryOperationException("Not 
implemented.");
         }
 
-        // FIXME getRelativeParent doesn't work for fully qualified names. See 
OAK-724
-        SessionImpl.checkProtectedNodes(
-                getSession(), Text.getRelativeParent(srcAbsPath, 1), 
Text.getRelativeParent(destAbsPath, 1));
+        sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+        sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
 
         SessionImpl.checkIndexOnName(sessionContext, destAbsPath);
 
         sessionDelegate.copy(
-                getOakPathOrThrowNotFound(srcAbsPath),
-                getOakPathOrThrowNotFound(destAbsPath),
-                sessionContext.getAccessManager());
+                srcOakPath, destOakPath, sessionContext.getAccessManager());
     }
 
     @Override
     public void clone(String srcWorkspace, String srcAbsPath, String 
destAbsPath, boolean removeExisting) throws RepositoryException {
+        final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+        final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+        // TODO: use perform()
         ensureIsAlive();
 
-        // FIXME getRelativeParent doesn't work for fully qualified names. See 
OAK-724
-        SessionImpl.checkProtectedNodes(
-                getSession(), Text.getRelativeParent(srcAbsPath, 1), 
Text.getRelativeParent(destAbsPath, 1));
+        sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+        sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
 
         // TODO
         throw new UnsupportedRepositoryOperationException("Not implemented.");
@@ -158,18 +162,19 @@ public class WorkspaceImpl implements Ja
 
     @Override
     public void move(String srcAbsPath, String destAbsPath) throws 
RepositoryException {
+        final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+        final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+        // TODO: use perform()
         ensureIsAlive();
 
-        // FIXME getRelativeParent doesn't work for fully qualified names. See 
OAK-724
-        SessionImpl.checkProtectedNodes(
-                getSession(), Text.getRelativeParent(srcAbsPath, 1), 
Text.getRelativeParent(destAbsPath, 1));
+        sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+        sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
 
         SessionImpl.checkIndexOnName(sessionContext, destAbsPath);
 
         sessionDelegate.move(
-                getOakPathOrThrowNotFound(srcAbsPath),
-                getOakPathOrThrowNotFound(destAbsPath),
-                false, sessionContext.getAccessManager());
+                srcOakPath, destOakPath, false, 
sessionContext.getAccessManager());
     }
 
     @Override

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=1506517&r1=1506516&r2=1506517&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
 Wed Jul 24 12:23:41 2013
@@ -102,4 +102,12 @@ public abstract class ItemDelegate {
      */
     public abstract boolean exists();
 
+    /**
+     * Removes this item.
+     *
+     * @return {@code true} if this item was removed;
+     *         or {@code false} if this is the root node that can't be removed
+     */
+    public abstract boolean remove() throws InvalidItemStateException;
+
 }

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=1506517&r1=1506516&r2=1506517&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
 Wed Jul 24 12:23:41 2013
@@ -642,6 +642,7 @@ public class NodeDelegate extends ItemDe
      *
      * @return {@code true} if the node was removed; {@code false} otherwise.
      */
+    @Override
     public boolean remove() throws InvalidItemStateException {
         return getTree().remove();
     }

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=1506517&r1=1506516&r2=1506517&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
 Wed Jul 24 12:23:41 2013
@@ -143,8 +143,15 @@ public class PropertyDelegate extends It
     /**
      * Remove the property
      */
-    public void remove() {
-        parent.removeProperty(name);
+    @Override
+    public boolean remove() {
+        boolean exists = parent.hasProperty(name);
+        if (exists) {
+            parent.removeProperty(name);
+            return true;
+        } else {
+            return false;
+        }
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
 Wed Jul 24 12:23:41 2013
@@ -22,6 +22,7 @@ import javax.annotation.Nonnull;
 import javax.jcr.ItemExistsException;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
 
 import org.apache.jackrabbit.oak.api.AuthInfo;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -160,6 +161,17 @@ public class SessionDelegate {
         return updateCount;
     }
 
+    public void checkProtectedNode(String path) throws RepositoryException {
+        NodeDelegate node = getNode(path);
+        if (node == null) {
+            throw new PathNotFoundException(
+                    "Node " + path + " does not exist.");
+        } else if (node.isProtected()) {
+            throw new ConstraintViolationException(
+                    "Node " + path + " is protected.");
+        }
+    }
+
     @Nonnull
     public AuthInfo getAuthInfo() {
         return contentSession.getAuthInfo();


Reply via email to