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 md...@apache.org on 2013/04/11 14:29:01 UTC

svn commit: r1466846 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core: PurgeRebaseDiff.java RootImpl.java

Author: mduerig
Date: Thu Apr 11 12:29:01 2013
New Revision: 1466846

URL: http://svn.apache.org/r1466846
Log:
OAK-709: Consider moving permission evaluation to the node state level
Move PurgeRebaseDiff to top level class

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java?rev=1466846&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java Thu Apr 11 12:29:01 2013
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.core;
+
+import javax.jcr.UnsupportedRepositoryOperationException;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.spi.state.AbstractRebaseDiff;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.util.TODO;
+
+/**
+ * FIXME rename, document
+ */
+class PurgeRebaseDiff extends AbstractRebaseDiff {
+    private PurgeRebaseDiff(NodeBuilder builder) {
+        super(builder);
+    }
+
+    public static NodeState rebase(NodeState before, NodeState after, NodeBuilder builder) {
+        after.compareAgainstBaseState(before, new PurgeRebaseDiff(builder));
+        return builder.getNodeState();
+    }
+
+    @Override
+    protected PurgeRebaseDiff createDiff(NodeBuilder builder, String name) {
+        return new PurgeRebaseDiff(builder.child(name));
+    }
+
+    @Override
+    protected void addExistingProperty(NodeBuilder builder, PropertyState after) {
+        conflict();
+    }
+
+    @Override
+    protected void changeDeletedProperty(NodeBuilder builder, PropertyState after) {
+        conflict();
+    }
+
+    @Override
+    protected void changeChangedProperty(NodeBuilder builder, PropertyState before, PropertyState after) {
+        conflict();
+    }
+
+    @Override
+    protected void deleteDeletedProperty(NodeBuilder builder, PropertyState before) {
+        conflict();
+    }
+
+    @Override
+    protected void deleteChangedProperty(NodeBuilder builder, PropertyState before) {
+        conflict();
+    }
+
+    @Override
+    protected void addExistingNode(NodeBuilder builder, String name, NodeState after) {
+        conflict();
+    }
+
+    @Override
+    protected void changeDeletedNode(NodeBuilder builder, String name, NodeState after) {
+        conflict();
+    }
+
+    @Override
+    protected void deleteDeletedNode(NodeBuilder builder, String name, NodeState before) {
+        conflict();
+    }
+
+    @Override
+    protected void deleteChangedNode(NodeBuilder builder, String name, NodeState before) {
+        conflict();
+    }
+
+    private static void conflict() {
+        // FIXME correctly handle conflict cases
+        try {
+            TODO.unimplemented().doNothing();
+        }
+        catch (UnsupportedRepositoryOperationException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/PurgeRebaseDiff.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java?rev=1466846&r1=1466845&r2=1466846&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java Thu Apr 11 12:29:01 2013
@@ -18,21 +18,26 @@
  */
 package org.apache.jackrabbit.oak.core;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getName;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+
 import javax.annotation.Nonnull;
-import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.security.auth.Subject;
 
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.BlobFactory;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.QueryEngine;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -55,19 +60,11 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
-import org.apache.jackrabbit.oak.spi.state.AbstractRebaseDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
-import org.apache.jackrabbit.oak.util.TODO;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
-import static org.apache.jackrabbit.oak.commons.PathUtils.getName;
-import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
 
 public class RootImpl implements Root {
 
@@ -101,6 +98,9 @@ public class RootImpl implements Root {
      */
     private NodeStoreBranch branch;
 
+    /**
+     * Secure view of the head of the branch underlying this root.
+     */
     private NodeState secureHead;
 
     /** Sentinel for the next move operation to take place on the this root */
@@ -321,7 +321,7 @@ public class RootImpl implements Root {
     @Override
     public boolean hasPendingChanges() {
         checkLive();
-        return !getSecureBase().equals(getRootState());
+        return !getSecureBase().equals(getSecureRootState());
     }
 
     @Nonnull
@@ -416,6 +416,29 @@ public class RootImpl implements Root {
 
     //------------------------------------------------------------< private >---
 
+    /**
+     * Root node state of the tree including all transient changes at the time of
+     * this call.
+     *
+     * @return root node state
+     */
+    @Nonnull
+    private NodeState getRootState() {
+        NodeBuilder builder = branch.getHead().builder();
+        return PurgeRebaseDiff.rebase(secureHead, getSecureRootState(), builder);
+    }
+
+    /**
+     * Secure view of the root node state of the tree including all transient changes
+     * at the time of this call.
+     *
+     * @return secure root node state
+     */
+    @Nonnull
+    private NodeState getSecureRootState() {
+        return rootTree.getNodeState();
+    }
+
     @Nonnull
     private PermissionProvider getPermissionProvider() {
         if (permissionProvider == null) {
@@ -428,11 +451,7 @@ public class RootImpl implements Root {
      * Purge all pending changes to the underlying {@link NodeStoreBranch}.
      */
     private void purgePendingChanges() {
-        NodeState before = secureHead;
-        NodeState after = getRootState();
-        NodeBuilder builder = branch.getHead().builder();
-        after.compareAgainstBaseState(before, new PurgeRebaseDiff(builder));
-        branch.setRoot(builder.getNodeState());
+        branch.setRoot(getRootState());
         reset();
     }
 
@@ -447,7 +466,7 @@ public class RootImpl implements Root {
 
     @Nonnull
     private PermissionProvider createPermissionProvider() {
-        return  securityProvider.getAccessControlConfiguration().getPermissionProvider(this, subject.getPrincipals());
+        return securityProvider.getAccessControlConfiguration().getPermissionProvider(this, subject.getPrincipals());
     }
 
     @Nonnull
@@ -455,79 +474,6 @@ public class RootImpl implements Root {
         return new TreeTypeProviderImpl(securityProvider.getAccessControlConfiguration().getContext());
     }
 
-    @Nonnull
-    private NodeState getRootState() {
-        return rootTree.getNodeState();
-    }
-
-    //------------------------------------------------------------< PurgeRebaseDiff >---
-
-    private static class PurgeRebaseDiff extends AbstractRebaseDiff {
-        public PurgeRebaseDiff(NodeBuilder builder) {
-            super(builder);
-        }
-
-        @Override
-        protected PurgeRebaseDiff createDiff(NodeBuilder builder, String name) {
-            return new PurgeRebaseDiff(builder.child(name));
-        }
-
-        @Override
-        protected void addExistingProperty(NodeBuilder builder, PropertyState after) {
-            conflict();
-        }
-
-        @Override
-        protected void changeDeletedProperty(NodeBuilder builder, PropertyState after) {
-            conflict();
-        }
-
-        @Override
-        protected void changeChangedProperty(NodeBuilder builder, PropertyState before, PropertyState after) {
-            conflict();
-        }
-
-        @Override
-        protected void deleteDeletedProperty(NodeBuilder builder, PropertyState before) {
-            conflict();
-        }
-
-        @Override
-        protected void deleteChangedProperty(NodeBuilder builder, PropertyState before) {
-            conflict();
-        }
-
-        @Override
-        protected void addExistingNode(NodeBuilder builder, String name, NodeState after) {
-            conflict();
-        }
-
-        @Override
-        protected void changeDeletedNode(NodeBuilder builder, String name, NodeState after) {
-            conflict();
-        }
-
-        @Override
-        protected void deleteDeletedNode(NodeBuilder builder, String name, NodeState before) {
-            conflict();
-        }
-
-        @Override
-        protected void deleteChangedNode(NodeBuilder builder, String name, NodeState before) {
-            conflict();
-        }
-
-        private static void conflict() {
-            // FIXME correctly handle conflict cases
-            try {
-                TODO.unimplemented().doNothing();
-            }
-            catch (UnsupportedRepositoryOperationException e) {
-                throw new IllegalStateException(e);
-            }
-        }
-    }
-
     //---------------------------------------------------------< MoveRecord >---
 
     /**