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 2012/04/04 13:39:59 UTC

svn commit: r1309338 - in /jackrabbit/oak/trunk: oak-core/ oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-mk/src/main/java/org/apache/jackrabbit/mk/model/

Author: mduerig
Date: Wed Apr  4 11:39:58 2012
New Revision: 1309338

URL: http://svn.apache.org/viewvc?rev=1309338&view=rev
Log:
OAK-9: Internal tree builder
fixed implementation of getChildNodes and getProperties

Modified:
    jackrabbit/oak/trunk/oak-core/pom.xml
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java

Modified: jackrabbit/oak/trunk/oak-core/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/pom.xml?rev=1309338&r1=1309337&r2=1309338&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-core/pom.xml Wed Apr  4 11:39:58 2012
@@ -37,6 +37,12 @@
       <version>${project.version}</version>
     </dependency>
 
+    <dependency>
+        <groupId>commons-collections</groupId>
+        <artifactId>commons-collections</artifactId>
+        <version>3.2.1</version>
+    </dependency>
+
     <!-- Optional dependencies for different persistence backends -->
     <dependency>
       <groupId>org.mongodb</groupId>

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java?rev=1309338&r1=1309337&r2=1309338&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateEditor.java Wed Apr  4 11:39:58 2012
@@ -130,12 +130,6 @@ public class KernelNodeStateEditor imple
     }
 
     @Override
-    public NodeState getNodeState() {
-        // todo implement getNodeState
-        return null;
-    }
-
-    @Override
     public NodeState getBaseNodeState() {
         return base;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java?rev=1309338&r1=1309337&r2=1309338&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/TransientNodeState.java Wed Apr  4 11:39:58 2012
@@ -1,5 +1,9 @@
 package org.apache.jackrabbit.oak.kernel;
 
+import org.apache.commons.collections.iterators.EmptyIterator;
+import org.apache.commons.collections.iterators.FilterIterator;
+import org.apache.commons.collections.iterators.IteratorChain;
+import org.apache.commons.collections.iterators.TransformIterator;
 import org.apache.jackrabbit.mk.model.ChildNodeEntry;
 import org.apache.jackrabbit.mk.model.NodeState;
 import org.apache.jackrabbit.mk.model.PropertyState;
@@ -9,9 +13,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.NoSuchElementException;
 import java.util.Set;
 
+import static org.apache.jackrabbit.oak.kernel.TransientNodeState.Iterators.*;
+
 public class TransientNodeState {
     private final KernelNodeStateEditor editor;
     private final NodeState persistentState;
@@ -115,111 +120,74 @@ public class TransientNodeState {
     }
 
     public Iterable<PropertyState> getProperties() {
+        final Iterable<? extends PropertyState> persisted = persistentState == null
+                ? null
+                : persistentState.getProperties();
+
         final Set<String> removed = new HashSet<String>();
         removed.addAll(removedProperties);
 
-        final Map<String, PropertyState> added = new HashMap<String, PropertyState>();
-        added.putAll(addedProperties);
-
-        final Iterable<? extends PropertyState>
-                persistedProperties = persistentState.getProperties(); // fixme check for null
+        final Set<PropertyState> added = new HashSet<PropertyState>();
+        added.addAll(addedProperties.values());
 
+        // persisted - removed + added
         return new Iterable<PropertyState>() {
             @Override
             public Iterator<PropertyState> iterator() {
-                return new Iterator<PropertyState>() {
-                    private final Iterator<? extends PropertyState>
-                            properties = persistedProperties.iterator();
-                    private PropertyState next;
-
-                    @Override
-                    public boolean hasNext() {
-                        if (next == null) {
-                            while (properties.hasNext()) {
-                                PropertyState prop = properties.next();
-                                if (added.containsKey(prop.getName())) {
-                                    next = added.get(prop.getName());
-                                    break;
-                                }
-                                if (!removed.contains(prop.getName())) {
-                                    next = prop;
-                                    break;
-                                }
-                            }
+                Iterator<? extends PropertyState> properties = persisted == null
+                    ? Iterators.<PropertyState>empty()
+                    : persisted.iterator();
+
+                Iterator<PropertyState> persistedMinusRemoved =
+                    filter(properties, new Predicate<PropertyState>() {
+                        @Override
+                        public boolean evaluate(PropertyState state) {
+                            return !removed.contains(state.getName());
                         }
-                        return next != null;
-                    }
+                });
 
-                    @Override
-                    public PropertyState next() {
-                        if (!hasNext()) {
-                            throw new NoSuchElementException();
-                        }
-                        PropertyState e = next;
-                        next = null;
-                        return e;
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException("remove");
-                    }
-                };
+                return add(persistedMinusRemoved, added.iterator());
             }
         };
     }
 
     public Iterable<TransientNodeState> getChildNodes(long offset, int count) {
+        final Iterable<? extends ChildNodeEntry> persisted = persistentState == null
+            ? null
+            : persistentState.getChildNodeEntries(offset, count);
+
         final Set<String> removed = new HashSet<String>();
         removed.addAll(removedNodes);
 
-        final Map<String, TransientNodeState> added = new HashMap<String, TransientNodeState>();
-        added.putAll(addedNodes);
-
-        final Iterable<? extends ChildNodeEntry>
-                persistedNodes = persistentState.getChildNodeEntries(offset, count); // fixme check for null
+        final Set<TransientNodeState> added = new HashSet<TransientNodeState>();
+        added.addAll(addedNodes.values());
 
+        // persisted - removed + added
         return new Iterable<TransientNodeState>() {
             @Override
             public Iterator<TransientNodeState> iterator() {
-                return new Iterator<TransientNodeState>() {
-                    private final Iterator<? extends ChildNodeEntry>
-                            nodes = persistedNodes.iterator();
-                    private TransientNodeState next;
-
-                    @Override
-                    public boolean hasNext() {
-                        if (next == null) {
-                            while (nodes.hasNext()) {
-                                final ChildNodeEntry entry = nodes.next();
-                                if (added.containsKey(entry.getName())) {
-                                    next = added.get(entry.getName());
-                                    break;
-                                }
-                                if (!removed.contains(entry.getName())) {
-                                    next = getExistingChildNode(entry.getName());
-                                    break;
-                                }
-                            }
+                Iterator<? extends ChildNodeEntry> nodes = persisted == null
+                    ? Iterators.<ChildNodeEntry>empty()
+                    : persisted.iterator();
+
+                Iterator<ChildNodeEntry> persistedMinusRemovedEntries =
+                    filter(nodes, new Predicate<ChildNodeEntry>() {
+                        @Override
+                        public boolean evaluate(ChildNodeEntry entry) {
+                            return !removed.contains(entry.getName());
                         }
-                        return next != null;
-                    }
+                });
 
-                    @Override
-                    public TransientNodeState next() {
-                        if (!hasNext()) {
-                            throw new NoSuchElementException();
-                        }
-                        TransientNodeState e = next;
-                        next = null;
-                        return e;
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException("remove");
-                    }
-                };
+                Iterator<TransientNodeState> persistedMinusRemoved =
+                    map(persistedMinusRemovedEntries,
+                        new Function1<ChildNodeEntry, TransientNodeState>() {
+                            @Override
+                            public TransientNodeState apply(ChildNodeEntry entry) {
+                                return getExistingChildNode(entry.getName());
+                            }
+                });
+
+                return add(persistedMinusRemoved, added.iterator());
             }
         };
     }
@@ -300,4 +268,98 @@ public class TransientNodeState {
         return persistentState != null && persistentState.getProperty(name) != null;
     }
 
+    // TODO: move to a more suitable location
+    static final class Iterators {
+        private Iterators() { }
+
+        /**
+         * Returns an empty iterator of type {@code T}.
+         *
+         * @param <T>
+         * @return
+         */
+        @SuppressWarnings("unchecked")
+        public static <T> Iterator<T> empty() {
+            return EmptyIterator.INSTANCE;
+        }
+
+        /**
+         * Returns an iterator for the concatenation of {@code iterator1} and
+         * {@code iterator2}.
+         *
+         * @param <T>
+         * @param iterator1
+         * @param iterator2
+         * @return
+         */
+        @SuppressWarnings("unchecked")
+        public static <T> Iterator<T> add(Iterator<? extends T> iterator1,
+                Iterator<? extends T> iterator2) {
+
+            return new IteratorChain(iterator1, iterator2);
+        }
+
+        /**
+         * Returns an iterator containing only the elements from an original
+         * {@code iterator} where the given {@code predicate} matches.
+         *
+         * @param <T>
+         * @param iterator
+         * @param predicate
+         * @return
+         */
+        @SuppressWarnings("unchecked")
+        public static <T> Iterator<T> filter(Iterator<? extends T> iterator,
+                final Predicate<? super T> predicate) {
+
+            return new FilterIterator(iterator, new org.apache.commons.collections.Predicate() {
+                @Override
+                public boolean evaluate(Object object) {
+                    return predicate.evaluate((T) object);
+                }
+            });
+        }
+
+        /**
+         * Returns an iterator with elements of an original  {@code iterator} mapped by
+         * a function {@code f}.
+         *
+         * @param <T>
+         * @param <R>
+         * @param <S>
+         * @param iterator
+         * @param f
+         * @return
+         */
+        @SuppressWarnings("unchecked")
+        public static <T, R, S extends T> Iterator<R> map(Iterator<? extends T> iterator,
+                final Function1<S, ? super R> f) {
+
+            return new TransformIterator(iterator, new org.apache.commons.collections.Transformer() {
+                @Override
+                public Object transform(Object input) {
+                    return f.apply((S) input);
+                }
+            });
+        }
+
+        /**
+         * Type safe counter part of {@link org.apache.commons.collections.Predicate}.
+         *
+         * @param <T> type of values this predicate is defined on
+         */
+        interface Predicate<T> {
+            boolean evaluate(T arg);
+        }
+
+        /**
+         * Type safe counter part of {@link org.apache.commons.collections.Transformer}.
+         *
+         * @param <S>  argument type to transform from
+         * @param <T>  result type to transform to
+         */
+        public interface Function1<S, T> {
+            T apply(S argument);
+        }
+    }
 }

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java?rev=1309338&r1=1309337&r2=1309338&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/model/NodeStateEditor.java Wed Apr  4 11:39:58 2012
@@ -75,14 +75,6 @@ public interface NodeStateEditor {
     NodeStateEditor edit(String name);
 
     /**
-     * Returns an immutable node state that matches the current state of
-     * the editor.
-     *
-     * @return immutable node state
-     */
-    NodeState getNodeState();
-
-    /**
      * Return the base node state of this private branch
      * @return base node state
      */