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/24 18:34:12 UTC

svn commit: r1235368 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model: ChildNodeEntriesTree.java ChildNodeEntry.java

Author: stefan
Date: Tue Jan 24 17:34:11 2012
New Revision: 1235368

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

Modified:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntry.java

Modified: 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=1235368&r1=1235367&r2=1235368&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntriesTree.java Tue Jan 24 17:34:11 2012
@@ -20,6 +20,7 @@ import org.apache.jackrabbit.mk.util.Abs
 import org.apache.jackrabbit.mk.util.EmptyIterator;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
 
 /**
@@ -31,6 +32,7 @@ public class ChildNodeEntriesTree implem
 
     protected int count;
 
+    // array of *immutable* IndexEntry objects
     protected IndexEntry[] index = new IndexEntry[1024];  // 2^10
 
     ChildNodeEntriesTree() {
@@ -40,8 +42,14 @@ public class ChildNodeEntriesTree implem
 
     @Override
     public boolean equals(Object obj) {
-        // todo implement
-        return super.equals(obj);
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ChildNodeEntriesTree) {
+            ChildNodeEntriesTree other = (ChildNodeEntriesTree) obj;
+            return Arrays.equals(index, other.index);
+        }
+        return false;
     }
 
     @Override
@@ -52,7 +60,8 @@ public class ChildNodeEntriesTree implem
         } catch (CloneNotSupportedException e) {
             // can't possibly get here
         }
-        // todo properly initialize all fields
+        // shallow clone of array of immutable IndexEntry objects
+        clone.index = index.clone();
         return clone;
     }
 
@@ -159,24 +168,29 @@ public class ChildNodeEntriesTree implem
                 ChildNodeEntriesBucket bucket = new ChildNodeEntriesBucket();
                 bucket.add(existing);
                 bucket.add(entry);
-                BucketInfo bi = new BucketInfo();
-                bi.size = 2;
                 // todo store bucket and update index entry with new bucket id (content hash)
-                //bi.id = <content hash of bucket>;
-                index[idx] = bi;
+                //bucketId = <content hash of bucket>;
+                String bucketId = "";
+                index[idx] = new BucketInfo(bucketId, 2);
                 count++;
                 return null;
             }
         } else {
             BucketInfo bi = (BucketInfo) ie;
-            ChildNodeEntries entries = retrieveBucket(bi.id);
+            ChildNodeEntries entries = retrieveBucket(bi.getId());
             ChildNodeEntry existing = entries.add(entry);
+            if (entry.equals(existing)) {
+                // no-op
+                return existing;
+            }
+            // todo store bucket and update index entry with new bucket id (content hash)
+            //bucketId = <content hash of bucket>;
+            String bucketId = "";
             if (existing == null) {
+                // new entry
                 count++;
-                bi.size++;
+                index[idx] = new BucketInfo(bucketId, entries.getCount());;
             }
-            // todo store bucket and update index entry with new bucket id (content hash)
-            //bi.id = <content hash of bucket>;
             return existing;
         }
     }
@@ -198,17 +212,22 @@ public class ChildNodeEntriesTree implem
             }
         } else {
             BucketInfo bi = (BucketInfo) ie;
-            ChildNodeEntries entries = retrieveBucket(bi.id);
+            ChildNodeEntries entries = retrieveBucket(bi.getId());
             ChildNodeEntry existing = entries.remove(name);
             if (existing == null) {
                 return null;
             }
             if (entries.getCount() == 0) {
                 index[idx] = null;
+            } else if (entries.getCount() == 1) {
+                // inline single remaining entry
+                ChildNodeEntry remaining = entries.getEntries(0, 1).next();
+                index[idx] = new NodeInfo(remaining.getName(), remaining.getId());
             } else {
-                bi.size--;
                 // todo store bucket and update index entry with new bucket id (content hash)
-                //bi.id = <content hash of bucket>;
+                //bucketId = <content hash of bucket>;
+                String bucketId = "";
+                index[idx] = new BucketInfo(bucketId, entries.getCount());
             }
             count--;
             return existing;
@@ -287,15 +306,37 @@ public class ChildNodeEntriesTree implem
     }
 
     protected static class BucketInfo implements IndexEntry {
+
         // bucket id
-        String id;
+        private final String id;
 
         // number of bucket entries
-        int size;
+        private final int size;
+
+        protected BucketInfo(String id, int size) {
+            this.id = id;
+            this.size = size;
+        }
+
+        public String getId() {
+            return id;
+        }
 
         public int getSize() {
             return size;
         }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof BucketInfo) {
+                BucketInfo other = (BucketInfo) obj;
+                return (size == other.size && id == null ? other.id == null : id.equals(other.id));
+            }
+            return false;
+        }
     }
 
     protected static class NodeInfo extends ChildNodeEntry implements IndexEntry {
@@ -307,5 +348,10 @@ public class ChildNodeEntriesTree implem
         public int getSize() {
             return 1;
         }
+
+        @Override
+        public boolean equals(Object obj) {
+            return super.equals(obj);
+        }
     }
 }

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntry.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntry.java?rev=1235368&r1=1235367&r2=1235368&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntry.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/ChildNodeEntry.java Tue Jan 24 17:34:11 2012
@@ -17,18 +17,18 @@
 package org.apache.jackrabbit.mk.model;
 
 /**
- * 
+ *
  */
 public class ChildNodeEntry {
-    
+
     private final String name;
     private final String id;
-    
+
     public ChildNodeEntry(String name, String id) {
         this.name = name;
         this.id = id;
     }
-    
+
     public String getName() {
         return name;
     }
@@ -36,4 +36,17 @@ public class ChildNodeEntry {
     public String getId() {
         return id;
     }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ChildNodeEntry) {
+            ChildNodeEntry other = (ChildNodeEntry) obj;
+            return (name == null ? other.name == null : name.equals(other.name)
+                    && id == null ? other.id == null : id.equals(other.id));
+        }
+        return false;
+    }
 }