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 2014/02/20 14:19:27 UTC

svn commit: r1570184 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/ oak-core/src/main/java/org/apache/jackrabbit/oak/core/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ oak-core/src/test/java/org/apac...

Author: mduerig
Date: Thu Feb 20 13:19:27 2014
New Revision: 1570184

URL: http://svn.apache.org/r1570184
Log:
OAK-1441: o.a.j.o.api.Tree/Root allows access to hidden nodes
Introduce the HiddenTree class for representing tree instances of "hidden" nodes.

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/HiddenTree.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTree.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ImmutableTree.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/MutableTreeTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/TreeTest.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Tree.java Thu Feb 20 13:19:27 2014
@@ -92,9 +92,9 @@ public interface Tree {
      */
     enum Status {
         /**
-         * Item is persisted
+         * Item is unchanged
          */
-        EXISTING,
+        UNCHANGED,
 
         /**
          * Item is new

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/HiddenTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/HiddenTree.java?rev=1570184&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/HiddenTree.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/HiddenTree.java Thu Feb 20 13:19:27 2014
@@ -0,0 +1,177 @@
+/*
+ * 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 static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collections;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+
+/**
+ * Instances of this class represent trees that are inaccessible because
+ * of the respective content would potentially be internal (hidden).
+ * <p>
+ * Calls to any of the mutator methods on this class throws an
+ * {@code IllegalStateException}.
+ */
+public class HiddenTree implements Tree {
+    private final Tree parent;
+    private final String name;
+
+    public HiddenTree(Tree parent, String name) {
+        this.parent = parent;
+        this.name = name;
+    }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean isRoot() {
+        return false;
+    }
+
+    @Nonnull
+    @Override
+    public String getPath() {
+        return PathUtils.concat(parent.getPath(), name);
+    }
+
+    @Nonnull
+    @Override
+    public Status getStatus() {
+        return Status.UNCHANGED;
+    }
+
+    @Override
+    public boolean exists() {
+        return false;
+    }
+
+    @Nonnull
+    @Override
+    public Tree getParent() {
+        return parent;
+    }
+
+    @Override
+    public PropertyState getProperty(@Nonnull String name) {
+        return null;
+    }
+
+    @Override
+    public Status getPropertyStatus(@Nonnull String name) {
+        return null;
+    }
+
+    @Override
+    public boolean hasProperty(@Nonnull String name) {
+        return false;
+    }
+
+    @Override
+    public long getPropertyCount() {
+        return 0;
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends PropertyState> getProperties() {
+        return Collections.emptyList();
+    }
+
+    @Nonnull
+    @Override
+    public Tree getChild(@Nonnull String name) {
+        return new HiddenTree(this, checkNotNull(name));
+    }
+
+    @Override
+    public boolean hasChild(@Nonnull String name) {
+        return false;
+    }
+
+    @Override
+    public long getChildrenCount(long max) {
+        return 0;
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<Tree> getChildren() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public boolean remove() {
+        return false;
+    }
+
+    @Nonnull
+    @Override
+    public Tree addChild(@Nonnull String name) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public void setOrderableChildren(boolean enable) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public boolean orderBefore(@Nullable String name) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public void setProperty(@Nonnull PropertyState property) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public <T> void setProperty(@Nonnull String name, @Nonnull T value) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public <T> void setProperty(@Nonnull String name, @Nonnull T value, Type<T> type) {
+        throw nonExistingTree();
+    }
+
+    @Override
+    public void removeProperty(@Nonnull String name) {
+        throw nonExistingTree();
+    }
+
+    private static IllegalStateException nonExistingTree() {
+        return new IllegalStateException("This tree does not exist");
+    }
+
+}

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MutableTree.java Thu Feb 20 13:19:27 2014
@@ -78,8 +78,7 @@ class MutableTree extends AbstractTree {
     //-----------------------------------------------------< AbstractTree >---
 
     @Override
-    protected MutableTree createChild(String name)
-            throws IllegalArgumentException {
+    protected MutableTree createChild(String name) throws IllegalArgumentException {
         return new MutableTree(root, this, name, pendingMoves);
     }
 
@@ -149,7 +148,11 @@ class MutableTree extends AbstractTree {
     @Override
     public Tree getChild(String name) {
         beforeRead();
-        return createChild(name);
+        if (super.hasChild(name)) {
+            return createChild(name);
+        } else {
+            return new HiddenTree(this, name);
+        }
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTree.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTree.java Thu Feb 20 13:19:27 2014
@@ -24,7 +24,7 @@ import static com.google.common.base.Pre
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.size;
 import static com.google.common.collect.Iterables.transform;
-import static org.apache.jackrabbit.oak.api.Tree.Status.EXISTING;
+import static org.apache.jackrabbit.oak.api.Tree.Status.UNCHANGED;
 import static org.apache.jackrabbit.oak.api.Tree.Status.MODIFIED;
 import static org.apache.jackrabbit.oak.api.Tree.Status.NEW;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
@@ -195,7 +195,7 @@ public abstract class AbstractTree imple
         } else if (nodeBuilder.isModified()) {
             return MODIFIED;
         } else {
-            return EXISTING;
+            return UNCHANGED;
         }
     }
 
@@ -233,7 +233,7 @@ public abstract class AbstractTree imple
         } else if (nodeBuilder.isReplaced(name)) {
             return MODIFIED;
         } else {
-            return EXISTING;
+            return UNCHANGED;
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ImmutableTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ImmutableTree.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ImmutableTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/ImmutableTree.java Thu Feb 20 13:19:27 2014
@@ -114,7 +114,7 @@ public final class ImmutableTree extends
 
     @Override
     public Status getStatus() {
-        return Status.EXISTING;
+        return Status.UNCHANGED;
     }
 
     @Override
@@ -135,7 +135,7 @@ public final class ImmutableTree extends
     @Override
     public Status getPropertyStatus(String name) {
         if (hasProperty(name)) {
-            return Status.EXISTING;
+            return Status.UNCHANGED;
         } else {
             return null;
         }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/MutableTreeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/MutableTreeTest.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/MutableTreeTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/MutableTreeTest.java Thu Feb 20 13:19:27 2014
@@ -290,18 +290,18 @@ public class MutableTreeTest extends Oak
         assertEquals(Tree.Status.NEW, tree.getChild("new").getStatus());
         root.commit();
 
-        assertEquals(Tree.Status.EXISTING, tree.getChild("new").getStatus());
+        assertEquals(Tree.Status.UNCHANGED, tree.getChild("new").getStatus());
         Tree added = tree.getChild("new");
         added.addChild("another");
         assertEquals(Tree.Status.MODIFIED, tree.getChild("new").getStatus());
         root.commit();
 
-        assertEquals(Tree.Status.EXISTING, tree.getChild("new").getStatus());
+        assertEquals(Tree.Status.UNCHANGED, tree.getChild("new").getStatus());
         tree.getChild("new").getChild("another").remove();
         assertEquals(Tree.Status.MODIFIED, tree.getChild("new").getStatus());
         root.commit();
 
-        assertEquals(Tree.Status.EXISTING, tree.getChild("new").getStatus());
+        assertEquals(Tree.Status.UNCHANGED, tree.getChild("new").getStatus());
         assertFalse(tree.getChild("new").getChild("another").exists());
 
         Tree x = root.getTree("/x");
@@ -331,12 +331,12 @@ public class MutableTreeTest extends Oak
         assertEquals(Tree.Status.NEW, tree.getPropertyStatus("new"));
         root.commit();
 
-        assertEquals(Tree.Status.EXISTING, tree.getPropertyStatus("new"));
+        assertEquals(Tree.Status.UNCHANGED, tree.getPropertyStatus("new"));
         tree.setProperty("new", "value2");
         assertEquals(Tree.Status.MODIFIED, tree.getPropertyStatus("new"));
         root.commit();
 
-        assertEquals(Tree.Status.EXISTING, tree.getPropertyStatus("new"));
+        assertEquals(Tree.Status.UNCHANGED, tree.getPropertyStatus("new"));
         tree.removeProperty("new");
         assertNull(tree.getPropertyStatus("new"));
         root.commit();
@@ -355,7 +355,7 @@ public class MutableTreeTest extends Oak
         root.commit();
 
         tree.getChild("one").getChild("two").addChild("three");
-        assertEquals(Tree.Status.EXISTING, tree.getChild("one").getStatus());
+        assertEquals(Tree.Status.UNCHANGED, tree.getChild("one").getStatus());
         assertEquals(Tree.Status.MODIFIED, tree.getChild("one").getChild("two").getStatus());
     }
 
@@ -430,7 +430,7 @@ public class MutableTreeTest extends Oak
 
         root.refresh();
 
-        assertEquals(Status.EXISTING, x.getStatus());
+        assertEquals(Status.UNCHANGED, x.getStatus());
         assertNull(x.getPropertyStatus("p"));
         assertFalse(xx.exists());
     }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/TreeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/TreeTest.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/TreeTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/TreeTest.java Thu Feb 20 13:19:27 2014
@@ -16,6 +16,13 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.evaluation;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import java.util.List;
 
 import com.google.common.collect.ImmutableList;
@@ -28,17 +35,11 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 public class TreeTest extends AbstractOakCoreTest {
 
     private Root testRoot;
 
+    @Override
     @Before
     public void before() throws Exception {
         super.before();
@@ -161,7 +162,7 @@ public class TreeTest extends AbstractOa
 
         PropertyState p = a.getProperty(JcrConstants.JCR_PRIMARYTYPE);
         assertNotNull(p);
-        assertEquals(Tree.Status.EXISTING, a.getPropertyStatus(JcrConstants.JCR_PRIMARYTYPE));
+        assertEquals(Tree.Status.UNCHANGED, a.getPropertyStatus(JcrConstants.JCR_PRIMARYTYPE));
 
     }
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java Thu Feb 20 13:19:27 2014
@@ -143,7 +143,7 @@ public class LockManagerImpl implements 
                     @Override
                     protected NodeDelegate perform(NodeDelegate node)
                             throws RepositoryException {
-                        if (node.getStatus() != Status.EXISTING) {
+                        if (node.getStatus() != Status.UNCHANGED) {
                             throw new InvalidItemStateException(
                                     "Unable to lock a node with pending changes");
                         }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1570184&r1=1570183&r2=1570184&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java Thu Feb 20 13:19:27 2014
@@ -1207,7 +1207,7 @@ public class NodeImpl<T extends NodeDele
         perform(new LockOperation<Void>(sessionDelegate, dlg) {
             @Override
             public Void perform(NodeDelegate node) throws RepositoryException {
-                if (node.getStatus() != Status.EXISTING) {
+                if (node.getStatus() != Status.UNCHANGED) {
                     throw new LockException(
                             "Unable to lock a node with pending changes");
                 }