You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2012/01/20 18:33:32 UTC

svn commit: r1234021 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model: AbstractNode.java ChildNodeEntriesBasic.java ChildNodeEntriesBucket.java ChildNodeEntriesInlined.java ChildNodeEntriesTree.java

Author: stefan
Date: Fri Jan 20 17:33:32 2012
New Revision: 1234021

URL: http://svn.apache.org/viewvc?rev=1234021&view=rev
Log:
flat hierarchy support (WIP)

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesInlined.java
      - copied, changed from r1228255, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBasic.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java
Removed:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBasic.java
Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java?rev=1234021&r1=1234020&r2=1234021&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/AbstractNode.java Fri Jan 20 17:33:32 2012
@@ -37,21 +37,21 @@ public abstract class AbstractNode imple
 
     protected HashMap<String, String> properties;
 
-    protected ChildNodeEntriesBasic childEntries;
+    protected ChildNodeEntriesInlined childEntries;
 
     protected AbstractNode() {
         this.properties = new HashMap<String, String>();
-        this.childEntries = new ChildNodeEntriesBasic();
+        this.childEntries = new ChildNodeEntriesInlined();
     }
 
     protected AbstractNode(Node other) {
         if (other instanceof AbstractNode) {
             AbstractNode srcNode = (AbstractNode) other;
             this.properties = (HashMap<String, String>) srcNode.properties.clone();
-            this.childEntries = (ChildNodeEntriesBasic) srcNode.childEntries.clone();
+            this.childEntries = (ChildNodeEntriesInlined) srcNode.childEntries.clone();
         } else {
             this.properties = new HashMap<String, String>(other.getProperties());
-            this.childEntries = new ChildNodeEntriesBasic();
+            this.childEntries = new ChildNodeEntriesInlined();
             for (Iterator<ChildNodeEntry> it = other.getChildNodeEntries(); it.hasNext(); ) {
                 ChildNodeEntry cne = it.next();
                 this.childEntries.add(cne);
@@ -157,7 +157,7 @@ public abstract class AbstractNode imple
         // compare child node entries
 
         if (other instanceof AbstractNode) {
-            ChildNodeEntriesBasic otherEntries = ((AbstractNode) other).childEntries;
+            ChildNodeEntriesInlined otherEntries = ((AbstractNode) other).childEntries;
             for (Iterator<ChildNodeEntry> it = childEntries.getAdded(otherEntries); it.hasNext(); ) {
                 handler.childNodeAdded(it.next());
             }

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java?rev=1234021&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBucket.java Fri Jan 20 17:33:32 2012
@@ -0,0 +1,72 @@
+/*
+ * 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.mk.model;
+
+import java.util.Iterator;
+
+/**
+ * todo implement using HashMap (insertion order not required)
+ */
+public class ChildNodeEntriesBucket implements ChildNodeEntries {
+    public int getCount() {
+        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry get(String name) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Iterator<String> getNames(int offset, int count) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Iterator<ChildNodeEntry> getEntries(int offset, int count) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry add(ChildNodeEntry entry) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry remove(String name) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry rename(String oldName, String newName) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry moveAfter(String name, String sibling) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public ChildNodeEntry moveBefore(String name, String sibling) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Iterator<ChildNodeEntry> getAdded(ChildNodeEntries other) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Iterator<ChildNodeEntry> getRemoved(ChildNodeEntries other) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public Iterator<ChildNodeEntry> getModified(ChildNodeEntries other) {
+        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+}

Copied: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesInlined.java (from r1228255, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBasic.java)
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesInlined.java?p2=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesInlined.java&p1=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBasic.java&r1=1228255&r2=1234021&rev=1234021&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesBasic.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesInlined.java Fri Jan 20 17:33:32 2012
@@ -27,13 +27,13 @@ import java.util.Map;
 /**
  *
  */
-public class ChildNodeEntriesBasic implements ChildNodeEntries {
+public class ChildNodeEntriesInlined implements ChildNodeEntries {
 
     protected static final Iterator<ChildNodeEntry> EMPTY_ITER = new EmptyIterator<ChildNodeEntry>();
     
     protected LinkedHashMap<String, ChildNodeEntry> entries;
     
-    ChildNodeEntriesBasic() {
+    ChildNodeEntriesInlined() {
         entries = new LinkedHashMap<String, ChildNodeEntry>();
     }
 
@@ -41,17 +41,17 @@ public class ChildNodeEntriesBasic imple
 
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof ChildNodeEntriesBasic) {
-            return entries.equals(((ChildNodeEntriesBasic) obj).entries);
+        if (obj instanceof ChildNodeEntriesInlined) {
+            return entries.equals(((ChildNodeEntriesInlined) obj).entries);
         }
         return false;
     }
 
     @Override
     protected Object clone()  {
-        ChildNodeEntriesBasic clone = null;
+        ChildNodeEntriesInlined clone = null;
         try {
-            clone = (ChildNodeEntriesBasic) super.clone();
+            clone = (ChildNodeEntriesInlined) super.clone();
         } catch (CloneNotSupportedException e) {
             // can't possibly get here
         }

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java?rev=1234021&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java Fri Jan 20 17:33:32 2012
@@ -0,0 +1,220 @@
+/*
+ * 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.mk.model;
+
+import org.apache.jackrabbit.mk.util.EmptyIterator;
+import org.apache.jackrabbit.mk.util.RangeIterator;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ *
+ */
+public class ChildNodeEntriesTree implements ChildNodeEntries {
+
+    protected static final Iterator<ChildNodeEntry> EMPTY_ITER = new EmptyIterator<ChildNodeEntry>();
+
+    protected int count;
+
+    protected IndexEntry[] index = new IndexEntry[1024];  // 2^10
+
+    ChildNodeEntriesTree() {
+    }
+
+    //------------------------------------------------------------< overrides >
+
+    @Override
+    public boolean equals(Object obj) {
+        // todo implement
+        return super.equals(obj);
+    }
+
+    @Override
+    protected Object clone() {
+        ChildNodeEntriesTree clone = null;
+        try {
+            clone = (ChildNodeEntriesTree) super.clone();
+        } catch (CloneNotSupportedException e) {
+            // can't possibly get here
+        }
+        // todo properly initialize all fields
+        return clone;
+    }
+
+    //-------------------------------------------------------------< read ops >
+
+    public int getCount() {
+        return count;
+    }
+
+    public ChildNodeEntry get(String name) {
+        IndexEntry entry = index[keyToIndex(name)];
+        if (entry == null) {
+            return null;
+        }
+        if (entry instanceof ChildNodeEntry) {
+            return (ChildNodeEntry) entry;
+        } else {
+            BucketInfo bi = (BucketInfo) entry;
+            ChildNodeEntries entries = retrieveBucket(bi.id);
+            return entries == null ? null : entries.get(name);
+        }
+    }
+
+    public Iterator<String> getNames(int offset, int cnt) {
+        if (offset < 0 || cnt < -1) {
+            throw new IllegalArgumentException();
+        }
+
+        if (offset >= count) {
+            return new EmptyIterator<String>();
+        }
+
+        int n = 0;
+        if (cnt == -1 || (offset + cnt) > count) {
+            cnt = count - offset;
+        }
+        ArrayList<String> names = new ArrayList<String>(cnt);
+        for (IndexEntry e : index) {
+            if (e != null) {
+                if (n + e.getSize() > offset) {
+                    if (e instanceof NodeInfo) {
+                        names.add(((NodeInfo) e).getName());
+                    } else {
+                        BucketInfo bi = (BucketInfo) e;
+                        ChildNodeEntriesBucket bucket = retrieveBucket(bi.id);
+                        // todo implement
+                    }
+                }
+                n += e.getSize();
+            }
+        }
+        
+        return names.iterator();
+    }
+
+    public Iterator<ChildNodeEntry> getEntries(int offset, int cnt) {
+        if (offset < 0 || cnt < -1) {
+            throw new IllegalArgumentException();
+        }
+
+        // todo implement
+        return null;
+    }
+
+    //------------------------------------------------------------< write ops >
+
+    public ChildNodeEntry add(ChildNodeEntry entry) {
+        // todo implement
+        return null;
+    }
+
+    public ChildNodeEntry remove(String name) {
+        // todo implement
+        return null;
+    }
+
+    public ChildNodeEntry rename(String oldName, String newName) {
+        // todo implement
+        return null;
+    }
+
+    public ChildNodeEntry moveAfter(String name, String sibling) {
+        // not supported, silently ignore
+        // todo implement
+        return null;
+    }
+
+    public ChildNodeEntry moveBefore(String name, String sibling) {
+        // not supported, silently ignore
+        // todo implement
+        return null;
+    }
+
+    //-------------------------------------------------------------< diff ops >
+
+    public Iterator<ChildNodeEntry> getAdded(final ChildNodeEntries other) {
+        if (equals(other)) {
+            return EMPTY_ITER;
+        }
+
+        // todo implement
+        return null;
+    }
+
+    public Iterator<ChildNodeEntry> getRemoved(final ChildNodeEntries other) {
+        if (equals(other)) {
+            return EMPTY_ITER;
+        }
+
+        // todo implement
+        return null;
+    }
+
+    public Iterator<ChildNodeEntry> getModified(final ChildNodeEntries other) {
+        if (equals(other)) {
+            return EMPTY_ITER;
+        }
+
+        // todo implement
+        return null;
+    }
+
+    //-------------------------------------------------------< implementation >
+    
+    protected int keyToIndex(String key) {
+        int hash = key.hashCode();
+        // todo rehash? ensure optimal distribution of hash WRT to index.length
+        return (hash & 0x7FFFFFFF) % index.length;
+    }
+
+    protected ChildNodeEntriesBucket retrieveBucket(String id) {
+        // todo implement
+        return null;
+    }
+
+    //--------------------------------------------------------< inner classes >
+
+    protected static interface IndexEntry {
+        // number of entries
+        int getSize();
+    }
+
+    protected static class BucketInfo implements IndexEntry {
+        // bucket id
+        String id;
+
+        // number of bucket entries
+        int size;
+
+        public int getSize() {
+            return size;
+        }
+    }
+
+    protected static class NodeInfo extends ChildNodeEntry implements IndexEntry {
+
+        public NodeInfo(String name, String id) {
+            super(name, id);
+        }
+
+        public int getSize() {
+            return 1;
+        }
+    }
+}