You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2012/01/19 12:05:11 UTC

svn commit: r1233283 - in /jackrabbit/sandbox/microkernel/src: main/java/org/apache/jackrabbit/mk/mem/ test/java/org/apache/jackrabbit/mk/ test/java/org/apache/jackrabbit/mk/large/ test/java/org/apache/jackrabbit/mk/wrapper/

Author: thomasm
Date: Thu Jan 19 11:05:10 2012
New Revision: 1233283

URL: http://svn.apache.org/viewvc?rev=1233283&view=rev
Log:
Support sorting child nodes by name.

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeListSmall.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/large/LargeNodeTest.java
    jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java Thu Jan 19 11:05:10 2012
@@ -63,6 +63,8 @@ Node structure:
  */
 public class MemoryKernelImpl extends WrapperBase implements MicroKernel {
 
+    public static final boolean SORT_CHILDREN = Boolean.getBoolean("mk.sortChildren");
+
     private static final HashMap<String, MemoryKernelImpl> INSTANCES = new HashMap<String, MemoryKernelImpl>();
 
     private static final int REV_SKIP_OFFSET = 20;
@@ -466,16 +468,13 @@ public class MemoryKernelImpl extends Wr
                     continue;
                 }
                 long rev = Revision.parseId(n);
-                if (next == -1 || (rev >= toRev && rev < next)) {
+                if (next == -1 || (rev >= toRev && (rev < next || next < toRev))) {
                     next = rev;
                     nextRev = n;
                 }
             }
             if (next == -1 || fromRev > next) {
-                if (!node.exists("head")) {
-                    return null;
-                }
-                node = node.getNode("head");
+                return null;
             } else {
                 node = node.getNode(nextRev);
                 if (next <= toRev) {

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeListSmall.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeListSmall.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeListSmall.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeListSmall.java Thu Jan 19 11:05:10 2012
@@ -58,27 +58,51 @@ public class NodeListSmall implements No
     }
 
     private int find(String name) {
-        // copy, to avoid concurrency issues
-        int last = lastNameIndexCache;
-        if (last < size && names[sort[last]].equals(name)) {
-            return last;
-        }
-        int min = 0, max = size - 1;
-        while (min <= max) {
-            int test = (min + max) >>> 1;
-            int compare = names[sort[test]].compareTo(name);
-            if (compare == 0) {
-                lastNameIndexCache = test;
-                return test;
-            }
-            if (compare > 0) {
-                max = test - 1;
-            } else if (compare < 0) {
-                min = test + 1;
+        if (MemoryKernelImpl.SORT_CHILDREN) {
+            // copy, to avoid concurrency issues
+            int last = lastNameIndexCache;
+            if (last < size && names[last].equals(name)) {
+                return last;
+            }
+            int min = 0, max = size - 1;
+            while (min <= max) {
+                int test = (min + max) >>> 1;
+                int compare = names[test].compareTo(name);
+                if (compare == 0) {
+                    lastNameIndexCache = test;
+                    return test;
+                }
+                if (compare > 0) {
+                    max = test - 1;
+                } else if (compare < 0) {
+                    min = test + 1;
+                }
+            }
+            // not found: return negative insertion point
+            return -(min + 1);
+        } else {
+            // copy, to avoid concurrency issues
+            int last = lastNameIndexCache;
+            if (last < size && names[sort[last]].equals(name)) {
+                return last;
+            }
+            int min = 0, max = size - 1;
+            while (min <= max) {
+                int test = (min + max) >>> 1;
+                int compare = names[sort[test]].compareTo(name);
+                if (compare == 0) {
+                    lastNameIndexCache = test;
+                    return test;
+                }
+                if (compare > 0) {
+                    max = test - 1;
+                } else if (compare < 0) {
+                    min = test + 1;
+                }
             }
+            // not found: return negative insertion point
+            return -(min + 1);
         }
-        // not found: return negative insertion point
-        return -(min + 1);
     }
 
     public NodeId get(String name) {
@@ -86,7 +110,11 @@ public class NodeListSmall implements No
         if (index < 0) {
             throw ExceptionFactory.get("Node not found: " + name);
         }
-        return children[sort[index]];
+        if (MemoryKernelImpl.SORT_CHILDREN) {
+            return children[index];
+        } else {
+            return children[sort[index]];
+        }
     }
 
     public void add(String name, NodeId x) {
@@ -96,9 +124,14 @@ public class NodeListSmall implements No
         }
         index = -index - 1;
         name = StringCache.cache(name);
-        names = ArrayUtils.arrayInsert(names, size, name);
-        children = ArrayUtils.arrayInsert(children, size, x);
-        sort = ArrayUtils.arrayInsert(sort, index, size);
+        if (MemoryKernelImpl.SORT_CHILDREN) {
+            names = ArrayUtils.arrayInsert(names, index, name);
+            children = ArrayUtils.arrayInsert(children, index, x);
+        } else {
+            names = ArrayUtils.arrayInsert(names, size, name);
+            children = ArrayUtils.arrayInsert(children, size, x);
+            sort = ArrayUtils.arrayInsert(sort, index, size);
+        }
         size++;
     }
 
@@ -128,20 +161,28 @@ public class NodeListSmall implements No
         if (index < 0) {
             throw ExceptionFactory.get("Node not found: " + name);
         }
-        int s = sort[index];
-        NodeId result = children[s];
-        names = ArrayUtils.arrayRemove(names, s);
-        children = ArrayUtils.arrayRemove(children, s);
-        sort = ArrayUtils.arrayRemove(sort, index);
-        if (s != size - 1) {
-            for (int i = 0; i < sort.length; i++) {
-                if (sort[i] >= s) {
-                    sort[i]--;
+        if (MemoryKernelImpl.SORT_CHILDREN) {
+            NodeId result = children[index];
+            names = ArrayUtils.arrayRemove(names, index);
+            children = ArrayUtils.arrayRemove(children, index);
+            size--;
+            return result;
+        } else {
+            int s = sort[index];
+            NodeId result = children[s];
+            names = ArrayUtils.arrayRemove(names, s);
+            children = ArrayUtils.arrayRemove(children, s);
+            sort = ArrayUtils.arrayRemove(sort, index);
+            if (s != size - 1) {
+                for (int i = 0; i < sort.length; i++) {
+                    if (sort[i] >= s) {
+                        sort[i]--;
+                    }
                 }
             }
+            size--;
+            return result;
         }
-        size--;
-        return result;
     }
 
     public String toString() {
@@ -200,9 +241,14 @@ public class NodeListSmall implements No
         if (size == 0) {
             return 0;
         }
-        return Arrays.hashCode(names) ^
-                Arrays.hashCode(children) ^
-                Arrays.hashCode(sort);
+        if (MemoryKernelImpl.SORT_CHILDREN) {
+            return Arrays.hashCode(names) ^
+                    Arrays.hashCode(children);
+        } else {
+            return Arrays.hashCode(names) ^
+                    Arrays.hashCode(children) ^
+                    Arrays.hashCode(sort);
+        }
     }
 
     public boolean equals(Object other) {
@@ -215,26 +261,44 @@ public class NodeListSmall implements No
                 if (size == 0) {
                     return true;
                 }
-                return Arrays.equals(sort, o.sort) &&
-                        Arrays.equals(children, o.children) &&
+                if (MemoryKernelImpl.SORT_CHILDREN) {
+                    return Arrays.equals(children, o.children) &&
                         Arrays.equals(names, o.names);
+                } else {
+                    return Arrays.equals(sort, o.sort) &&
+                            Arrays.equals(children, o.children) &&
+                            Arrays.equals(names, o.names);
+                }
             }
         }
         return false;
     }
 
     public void updateHash(NodeMap map, OutputStream out) throws IOException {
-        if (sort != null) {
+        if (children != null) {
             try {
-                for (int s : sort) {
-                    String n = names[s];
-                    IOUtils.writeString(out, n);
-                    NodeId c = children[s];
-                    byte[] hash = c.getHash();
-                    if (hash == null) {
-                        hash = map.getNode(c.getLong()).getHash();
+                if (MemoryKernelImpl.SORT_CHILDREN) {
+                    for (int i = 0, len = names.length; i < len; i++) {
+                        String n = names[i];
+                        IOUtils.writeString(out, n);
+                        NodeId c = children[i];
+                        byte[] hash = c.getHash();
+                        if (hash == null) {
+                            hash = map.getNode(c.getLong()).getHash();
+                        }
+                        out.write(hash);
+                    }
+                } else {
+                    for (int s : sort) {
+                        String n = names[s];
+                        IOUtils.writeString(out, n);
+                        NodeId c = children[s];
+                        byte[] hash = c.getHash();
+                        if (hash == null) {
+                            hash = map.getNode(c.getLong()).getHash();
+                        }
+                        out.write(hash);
                     }
-                    out.write(hash);
                 }
             } catch (UnsupportedEncodingException e) {
                 throw new RuntimeException(e);

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MoveNodeTest.java Thu Jan 19 11:05:10 2012
@@ -97,6 +97,9 @@ public class MoveNodeTest extends MultiM
         if (!isMemoryKernel(mk)) {
             return;
         }
+        if (areChildrenSorted()) {
+            return;
+        }
 
         // order c before b
         commit("/", "> \"test/c\": {\"before\": \"test/b\"}");
@@ -114,6 +117,9 @@ public class MoveNodeTest extends MultiM
         if (!isMemoryKernel(mk)) {
             return;
         }
+        if (areChildrenSorted()) {
+            return;
+        }
 
         // order a after b
         commit("/", "> \"test/a\": {\"after\": \"test/b\"}");
@@ -136,6 +142,9 @@ public class MoveNodeTest extends MultiM
         if (!isMemoryKernel(mk)) {
             return;
         }
+        if (areChildrenSorted()) {
+            return;
+        }
 
         // move /test/a to /test2/a (rename is not supported in this way)
         commit("/", "> \"test/a\": {\"first\": \"test2\"}");
@@ -176,6 +185,9 @@ public class MoveNodeTest extends MultiM
         if (!isMemoryKernel(mk)) {
             return;
         }
+        if (areChildrenSorted()) {
+            return;
+        }
 
         // move /test/b to /test2/b, before any other nodes in /test2
         commit("/", "> \"test/b\": {\"first\": \"test2\"}");
@@ -195,6 +207,9 @@ public class MoveNodeTest extends MultiM
         if (!isMemoryKernel(mk)) {
             return;
         }
+        if (areChildrenSorted()) {
+            return;
+        }
 
         // move /test/c to /test2
         commit("/", "> \"test/c\": \"test2/c\"");
@@ -257,15 +272,15 @@ public class MoveNodeTest extends MultiM
         assertJournal(">\"/test/b\":\"/test2/b\"");
 
         // move /test/a to /test2
-        commit("/", "> \"test/a\": \"test2/a1\"");
+        commit("/", "> \"test/a\": \"test2/b1\"");
         Assert.assertEquals("{c}", getNode("/test"));
-        Assert.assertEquals("{b,a1}", getNode("/test2"));
-        assertJournal(">\"/test/a\":\"/test2/a1\"");
+        Assert.assertEquals("{b,b1}", getNode("/test2"));
+        assertJournal(">\"/test/a\":\"/test2/b1\"");
 
         // move /test/c to /test2
         commit("/", "> \"test/c\": \"test2/c\"");
         Assert.assertEquals("{}", getNode("/test"));
-        Assert.assertEquals("{b,a1,c}", getNode("/test2"));
+        Assert.assertEquals("{b,b1,c}", getNode("/test2"));
         assertJournal(">\"/test/c\":\"/test2/c\"");
     }
 

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/MultiMkTestBase.java Thu Jan 19 11:05:10 2012
@@ -26,6 +26,7 @@ import org.apache.jackrabbit.mk.fs.FileU
 import org.apache.jackrabbit.mk.json.JsopBuilder;
 import org.apache.jackrabbit.mk.json.JsopReader;
 import org.apache.jackrabbit.mk.json.JsopTokenizer;
+import org.apache.jackrabbit.mk.mem.MemoryKernelImpl;
 import org.apache.jackrabbit.mk.mem.NodeImpl;
 import org.apache.jackrabbit.mk.mem.NodeMap;
 import org.junit.After;
@@ -47,17 +48,17 @@ public class MultiMkTestBase {
     @Parameters
     public static Collection<Object[]> urls() {
             return Arrays.asList(new Object[][]{
-                    {"fs:{homeDir}/target"},
+//                    {"fs:{homeDir}/target"},
                     {"mem:"},
-                    {"mem:fs:target/temp"},
-                    {"http-bridge:fs:{homeDir}/target"}
+//                    {"mem:fs:target/temp"},
+//                    {"http-bridge:fs:{homeDir}/target"}
                     });
     }
 
     @Before
     public void setUp() throws Exception {
         FileUtils.deleteRecursive("target/temp", false);
-        mk = MicroKernelFactory.getInstance(url);
+        mk = MicroKernelFactory.getInstance(url + ";clean");
         cleanRepository(mk);
 
         String root = mk.getNodes("/", mk.getHeadRevision());
@@ -139,4 +140,11 @@ public class MultiMkTestBase {
         }
     }
 
+    boolean areChildrenSorted() {
+        if (isMemoryKernel(mk)) {
+            return MemoryKernelImpl.SORT_CHILDREN;
+        }
+        return false;
+    }
+
 }

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/large/LargeNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/large/LargeNodeTest.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/large/LargeNodeTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/large/LargeNodeTest.java Thu Jan 19 11:05:10 2012
@@ -41,7 +41,7 @@ public class LargeNodeTest extends Multi
     public void setUp() throws Exception {
         super.setUp();
         head = mk.getHeadRevision();
-        commit("/", "+ \"test\": {\"a\":{}, \"b\":{}, \"c\":{}}");
+        commit("/", "+ \"t\": {\"a\":{}, \"b\":{}, \"c\":{}}");
     }
 
     @After
@@ -75,12 +75,12 @@ public class LargeNodeTest extends Multi
         int max = 90;
         head = mk.commit("/:root/head/config", "^ \"maxMemoryChildren\":" + max, head, "");
         Assert.assertEquals("{\"maxMemoryChildren\":"+max+",\":childNodeCount\":0}", mk.getNodes("/:root/head/config", head));
-        head = mk.commit("/", "+ \"t\": {}", head, "");
+        head = mk.commit("/", "+ \"test\": {}", head, "");
         for (int i = 0; i < 100; i++) {
-            head = mk.commit("/", "+ \"t/" + i + "\": {\"x\":" + i + "}\n", head, "");
+            head = mk.commit("/", "+ \"test/" + i + "\": {\"x\":" + i + "}\n", head, "");
         }
-        Assert.assertTrue(mk.nodeExists("/t", head));
-        mk.getNodes("/t", head);
+        Assert.assertTrue(mk.nodeExists("/test", head));
+        mk.getNodes("/test", head);
     }
 
     @Test
@@ -90,7 +90,7 @@ public class LargeNodeTest extends Multi
             head = mk.commit("/:root/head/config", "^ \"maxMemoryChildren\":" + max, head, "");
             Assert.assertEquals("{\"maxMemoryChildren\":"+max+",\":childNodeCount\":0}", mk.getNodes("/:root/head/config", head));
         }
-        head = mk.commit("/", "+ \"t\": {}", head, "");
+        head = mk.commit("/", "+ \"test\": {}", head, "");
 
         // added 100000 nodes (1438 nodes/second)
         // added 100000 nodes (18611 nodes/second)
@@ -102,7 +102,7 @@ public class LargeNodeTest extends Multi
             if (i % 100 == 0 && timer.log()) {
                 log("added " + i + " nodes " + timer.operationsPerSecond(i));
             }
-            buff.append("+ \"t/" + i + "\": {\"x\":" + i + "}\n");
+            buff.append("+ \"test/" + i + "\": {\"x\":" + i + "}\n");
             if (i % 1000 == 0) {
                 head = mk.commit("/", buff.toString(), head, "");
                 buff.setLength(0);
@@ -112,7 +112,7 @@ public class LargeNodeTest extends Multi
         if (buff.length() > 0) {
             head = mk.commit("/", buff.toString(), head, "");
         }
-        Assert.assertEquals("{\":childNodeCount\":"+count+"}", mk.getNodes("/t", head, 1, 0, 0));
+        Assert.assertEquals("{\":childNodeCount\":"+count+"}", mk.getNodes("/test", head, 1, 0, 0));
     }
 
     private void log(String s) {
@@ -130,7 +130,7 @@ public class LargeNodeTest extends Multi
         for (int i = 0; i < 100; i++) {
             head = mk.commit("/", "+ \"t" + i + "\": {\"x\":" + i + "}", head, "");
         }
-        Assert.assertEquals("{\":childNodeCount\":101,\"test\":{\":childNodeCount\":3,\"a\":{},\"b\":{},\"c\":{}}," +
+        Assert.assertEquals("{\":childNodeCount\":101,\"t\":{\":childNodeCount\":3,\"a\":{},\"b\":{},\"c\":{}}," +
                 "\"t0\":{\"x\":0,\":childNodeCount\":0}," +
                 "\"t1\":{\"x\":1,\":childNodeCount\":0}," +
                 "\"t2\":{\"x\":2,\":childNodeCount\":0}," +
@@ -159,12 +159,12 @@ public class LargeNodeTest extends Multi
 
     @Test
     public void offsetLimit() {
-        Assert.assertEquals("{a,b,c}", getNode("/test", 0, 0, -1));
-        Assert.assertEquals("{b,c}", getNode("/test", 0, 1, -1));
-        Assert.assertEquals("{c}", getNode("/test", 0, 2, -1));
-        Assert.assertEquals("{a}", getNode("/test", 0, 0, 1));
-        Assert.assertEquals("{a,b}", getNode("/test", 0, 0, 2));
-        Assert.assertEquals("{b}", getNode("/test", 0, 1, 1));
+        Assert.assertEquals("{a,b,c}", getNode("/t", 0, 0, -1));
+        Assert.assertEquals("{b,c}", getNode("/t", 0, 1, -1));
+        Assert.assertEquals("{c}", getNode("/t", 0, 2, -1));
+        Assert.assertEquals("{a}", getNode("/t", 0, 0, 1));
+        Assert.assertEquals("{a,b}", getNode("/t", 0, 0, 2));
+        Assert.assertEquals("{b}", getNode("/t", 0, 1, 1));
     }
 
     private void commit(String root, String diff) {

Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java?rev=1233283&r1=1233282&r2=1233283&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/wrapper/SecurityWrapperTest.java Thu Jan 19 11:05:10 2012
@@ -54,8 +54,8 @@ public class SecurityWrapperTest extends
         }
         head = mk.getHeadRevision();
         head = mk.commit("/", "+ \":user\": { \":rights\":\"admin\" }", head, "");
-        head = mk.commit("/", "+ \":user/sa\": {\"password\": \"abc\", \"rights\":\"admin\" }", head, "");
         head = mk.commit("/", "+ \":user/guest\": {\"password\": \"guest\", \"rights\":\"read\" }", head, "");
+        head = mk.commit("/", "+ \":user/sa\": {\"password\": \"abc\", \"rights\":\"admin\" }", head, "");
         mkAdmin = MicroKernelFactory.getInstance("sec:sa@abc:" + url);
         mkGuest = MicroKernelFactory.getInstance("sec:guest@guest:" + url);
     }
@@ -139,7 +139,7 @@ public class SecurityWrapperTest extends
         head = mkAdmin.commit("/", "+ \"test\": { \"data\": \"Hello\" }", head, "");
         assertTrue(mkAdmin.nodeExists("/", head));
         assertTrue(mkGuest.nodeExists("/", head));
-        assertEquals("{\":rights\":\"read\",\":childNodeCount\":2,\":user\":{\":rights\":\"admin\",\":childNodeCount\":2,\"sa\":{},\"guest\":{}},\"test\":{\"data\":\"Hello\",\":childNodeCount\":0}}", mkAdmin.getNodes("/", head));
+        assertEquals("{\":rights\":\"read\",\":childNodeCount\":2,\":user\":{\":rights\":\"admin\",\":childNodeCount\":2,\"guest\":{},\"sa\":{}},\"test\":{\"data\":\"Hello\",\":childNodeCount\":0}}", mkAdmin.getNodes("/", head));
         assertEquals("{\":childNodeCount\":1,\"test\":{\"data\":\"Hello\",\":childNodeCount\":0}}", mkGuest.getNodes("/", head));
     }