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 an...@apache.org on 2013/07/03 10:10:36 UTC

svn commit: r1499246 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/core/ oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/

Author: angela
Date: Wed Jul  3 08:10:35 2013
New Revision: 1499246

URL: http://svn.apache.org/r1499246
Log:
OAK-753 : TreeImpl exposes hidden child trees

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/HiddenTreeTest.java
    jackrabbit/oak/trunk/oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1499246&r1=1499245&r2=1499246&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Wed Jul  3 08:10:35 2013
@@ -18,38 +18,25 @@
  */
 package org.apache.jackrabbit.oak.core;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.indexOf;
-import static com.google.common.collect.Iterables.size;
-import static com.google.common.collect.Iterables.transform;
-import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
-import static org.apache.jackrabbit.oak.api.Tree.Status.EXISTING;
-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.STRING;
-import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
-import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
-
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
-
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import org.apache.jackrabbit.mk.api.MicroKernel;
 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;
 import org.apache.jackrabbit.oak.core.RootImpl.Move;
+import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryPropertyBuilder;
 import org.apache.jackrabbit.oak.plugins.memory.MultiStringPropertyState;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -57,6 +44,21 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
 import org.apache.jackrabbit.oak.spi.state.PropertyBuilder;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.indexOf;
+import static com.google.common.collect.Iterables.size;
+import static com.google.common.collect.Iterables.transform;
+import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.oak.api.Tree.Status.EXISTING;
+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.STRING;
+import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
+import static org.apache.jackrabbit.oak.commons.PathUtils.isAbsolute;
+
 public class TreeImpl implements Tree {
 
     /**
@@ -64,6 +66,9 @@ public class TreeImpl implements Tree {
      */
     public static final String OAK_CHILD_ORDER = ":childOrder";
 
+    // TODO: make this configurable
+    public static final Set<String> HIDDEN_NAMES = ImmutableSet.of(IndexConstants.INDEX_CONTENT_NODE_NAME, MicroKernel.CONFLICT_NAME);
+
     /**
      * Underlying {@code Root} of this {@code Tree} instance
      */
@@ -122,7 +127,7 @@ public class TreeImpl implements Tree {
 
     @Override
     public Status getStatus() {
-        enter();
+        checkExists();
         if (nodeBuilder.isNew()) {
             return NEW;
         } else if (nodeBuilder.isModified()) {
@@ -207,13 +212,19 @@ public class TreeImpl implements Tree {
         checkNotNull(name);
         enter();
         TreeImpl child = new TreeImpl(root, this, name, pendingMoves);
-        return child.nodeBuilder.exists();
+        return child.exists();
     }
 
     @Override
     public long getChildrenCount() {
         enter();
-        return nodeBuilder.getChildNodeCount();
+        long childCnt = nodeBuilder.getChildNodeCount();
+        for (String name : HIDDEN_NAMES) {
+            if (nodeBuilder.hasChildNode(name)) {
+                childCnt--;
+            }
+        }
+        return childCnt;
     }
 
     @Override
@@ -226,7 +237,12 @@ public class TreeImpl implements Tree {
             childNames = nodeBuilder.getChildNodeNames();
         }
         return transform(
-                childNames,
+                filter(childNames, new Predicate<String>() {
+                    @Override
+                    public boolean apply(@Nullable String name) {
+                        return !isHidden(name);
+                    }
+                }),
                 new Function<String, Tree>() {
                     @Override
                     public Tree apply(String input) {
@@ -455,7 +471,9 @@ public class TreeImpl implements Tree {
 
     private boolean enter() {
         root.checkLive();
-        if (applyPendingMoves()) {
+        if (isHidden(name)) {
+            return false;
+        } else if (applyPendingMoves()) {
             return reconnect();
         } else {
             return nodeBuilder.exists();
@@ -463,7 +481,6 @@ public class TreeImpl implements Tree {
     }
 
     private static boolean isHidden(String name) {
-        // FIXME clarify handling of hidden items (OAK-753).
         return NodeStateUtils.isHidden(name);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/HiddenTreeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/HiddenTreeTest.java?rev=1499246&r1=1499245&r2=1499246&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/HiddenTreeTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/HiddenTreeTest.java Wed Jul  3 08:10:35 2013
@@ -18,12 +18,13 @@ package org.apache.jackrabbit.oak.securi
 
 import org.apache.jackrabbit.oak.api.Tree;
 import org.junit.Before;
-import org.junit.Ignore;
 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.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * Test to make sure hidden trees are never exposed.
@@ -44,26 +45,54 @@ public class HiddenTreeTest extends Abst
         assertTrue(parent.exists());
     }
 
-    @Ignore("OAK-753") // FIXME
     @Test
     public void testHasHiddenTree() {
         assertFalse(parent.hasChild(hiddenName));
     }
 
-    @Ignore("OAK-753") // FIXME
     @Test
     public void testGetHiddenTree() {
-        assertFalse(parent.getChild(hiddenName).exists());
+        Tree hidden = parent.getChild(hiddenName);
+        assertNotNull(hidden);
+        assertFalse(hidden.exists());
+    }
+
+    @Test
+    public void testOrderBeforeOnHiddenTree() {
+        try {
+            Tree hidden = parent.getChild(hiddenName);
+            hidden.orderBefore("someother");
+            fail("IllegalStateException expected");
+        } catch (IllegalStateException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testSetOrderableChildNodesOnHiddenTree() {
+        try {
+            Tree hidden = parent.getChild(hiddenName);
+            hidden.setOrderableChildren(true);
+            fail("IllegalStateException expected");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        try {
+            Tree hidden = parent.getChild(hiddenName);
+            hidden.setOrderableChildren(false);
+            fail("IllegalStateException expected");
+        } catch (IllegalStateException e) {
+            // success
+        }
     }
 
-    @Ignore("OAK-753") // FIXME
     @Test
     public void testGetHiddenChildren() {
         Iterable<Tree> children = parent.getChildren();
         assertFalse(children.iterator().hasNext());
     }
 
-    @Ignore("OAK-753") // FIXME
     @Test
     public void testGetHiddenChildrenCount() {
         assertEquals(0, parent.getChildrenCount());

Modified: jackrabbit/oak/trunk/oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java?rev=1499246&r1=1499245&r2=1499246&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java (original)
+++ jackrabbit/oak/trunk/oak-mk-api/src/main/java/org/apache/jackrabbit/mk/api/MicroKernel.java Wed Jul  3 08:10:35 2013
@@ -71,6 +71,8 @@ import javax.annotation.Nonnull;
  */
 public interface MicroKernel {
 
+    public static final String CONFLICT_NAME = ":conflict";
+
     //---------------------------------------------------------< REVISION ops >
 
     /**
@@ -506,7 +508,7 @@ public interface MicroKernel {
      * <p/>
      * If rebasing results in a conflict, conflicting nodes are annotated with a conflict
      * marker denoting the type of the conflict and the value(s) before the rebase operation.
-     * The conflict marker is an internal node with the name {@code :conflict} and is added
+     * The conflict marker is an internal node with the name {@link #CONFLICT_NAME} and is added
      * to the node whose properties or child nodes are in conflict.
      * <p/>
      * type of conflicts: