You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2010/08/04 11:50:36 UTC

svn commit: r982181 - in /jackrabbit/trunk: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/fl...

Author: mduerig
Date: Wed Aug  4 09:50:36 2010
New Revision: 982181

URL: http://svn.apache.org/viewvc?rev=982181&view=rev
Log:
JCR-2698: Consolidate type safe wrappers for commons-collection classes

Added:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Predicate.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Transformer.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/TreeTraverserTest.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/BTreeManager.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/Rank.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/TreeTraverser.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/GetItemsTest.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/ItemInfoStore.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/benchmark/ReadPerformanceTest.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ItemInfoBuilder.java

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/TreeTraverserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/TreeTraverserTest.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/TreeTraverserTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/TreeTraverserTest.java Wed Aug  4 09:50:36 2010
@@ -16,13 +16,14 @@
  */
 package org.apache.jackrabbit.core.integration;
 
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.Transformer;
-import org.apache.commons.collections.iterators.EmptyIterator;
-import org.apache.commons.collections.iterators.FilterIterator;
-import org.apache.commons.collections.iterators.SingletonIterator;
-import org.apache.commons.collections.iterators.TransformIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
+import static org.apache.jackrabbit.commons.iterator.Iterators.transformIterator;
+
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.commons.iterator.Iterators;
+import org.apache.jackrabbit.commons.iterator.Predicate;
+import org.apache.jackrabbit.commons.iterator.Transformer;
 import org.apache.jackrabbit.flat.TreeTraverser;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 
@@ -125,10 +126,10 @@ public class TreeTraverserTest extends A
     public void testTraversePropertiesEmpty() throws RepositoryException {
         Iterator<Node> nodeIt = TreeTraverser.nodeIterator(testNode);
         Iterator<Property> propertyIt = TreeTraverser.propertyIterator(nodeIt);
-        checkProperties(propertyIt, TreeTraverserTest.<String>empty(), testNode.getPath());
+        checkProperties(propertyIt, Iterators.<String>empty(), testNode.getPath());
 
         addNodes(testNode, nodes);
-        checkProperties(propertyIt, TreeTraverserTest.<String>empty(), testNode.getPath());
+        checkProperties(propertyIt, Iterators.<String>empty(), testNode.getPath());
     }
 
     public void testTraverseProperties() throws RepositoryException {
@@ -192,12 +193,10 @@ public class TreeTraverserTest extends A
         assertEquals(expectedPaths, actualPaths);
     }
 
-    @SuppressWarnings("unchecked")
     private static Iterator<Property> removeIgnored(Iterator<Property> properties) {
-        return new FilterIterator(properties, new Predicate() {
-            public boolean evaluate(Object object) {
+        return filterIterator(properties, new Predicate<Property>() {
+            public boolean evaluate(Property property) {
                 try {
-                    Property property = (Property) object;
                     return !JcrConstants.JCR_PRIMARYTYPE.equals(property.getName());
                 }
                 catch (RepositoryException e) {
@@ -207,12 +206,11 @@ public class TreeTraverserTest extends A
         });
     }
 
-    @SuppressWarnings("unchecked")
     private static Iterator<String> property2Path(Iterator<Property> properties) {
-        return new TransformIterator(properties, new Transformer() {
-            public Object transform(Object input) {
+        return transformIterator(properties, new Transformer<Property, String>() {
+            public String transform(Property property) {
                 try {
-                    return ((Property) input).getPath();
+                    return property.getPath();
                 }
                 catch (RepositoryException e) {
                     throw (AssertionFailedError) new AssertionFailedError().initCause(e);
@@ -238,23 +236,12 @@ public class TreeTraverserTest extends A
         }
     }
 
-    @SuppressWarnings("unchecked")
     private static Iterator<String> cat(final String s, Iterator<String> strings) {
-        return new TransformIterator(strings, new Transformer() {
-            public Object transform(Object input) {
-                return cat(s, (String) input);
+        return transformIterator(strings, new Transformer<String, String>() {
+            public String transform(String string) {
+                return cat(s, string);
             }
         });
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> singleton(T element) {
-        return new SingletonIterator(element);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> empty() {
-        return EmptyIterator.INSTANCE;
-    }
-
 }

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java?rev=982181&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java Wed Aug  4 09:50:36 2010
@@ -0,0 +1,183 @@
+/*
+ * 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.commons.iterator;
+
+import org.apache.commons.collections.iterators.ArrayIterator;
+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.SingletonIterator;
+import org.apache.commons.collections.iterators.TransformIterator;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Utility class containing type safe adapters for some of the iterators of
+ * commons-collections.
+ */
+public final class Iterators {
+
+    private Iterators() {
+        super();
+    }
+
+    /**
+     * Returns an iterator containing the single element <code>element</code> of
+     * type <code>T</code>.
+     *
+     * @param <T>
+     * @param element
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> singleton(T element) {
+        return new SingletonIterator(element);
+    }
+
+    /**
+     * Returns an empty iterator of type <code>T</code>.
+     *
+     * @param <T>
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> empty() {
+        return EmptyIterator.INSTANCE;
+    }
+
+    /**
+     * Returns an iterator for the concatenation of <code>iterator1</code> and
+     * <code>iterator2</code>.
+     *
+     * @param <T>
+     * @param iterator1
+     * @param iterator2
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> iteratorChain(Iterator<? extends T> iterator1, Iterator<? extends T> iterator2) {
+        return new IteratorChain(iterator1, iterator2);
+    }
+
+    /**
+     * Returns an iterator for the concatenation of all the given <code>iterators</code>.
+     *
+     * @param <T>
+     * @param iterators
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> iteratorChain(Iterator<? extends T>[] iterators) {
+        return new IteratorChain(iterators);
+    }
+
+    /**
+     * Returns an iterator for the concatenation of all the given <code>iterators</code>.
+     *
+     * @param <T>
+     * @param iterators
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> iteratorChain(Collection<? extends T> iterators) {
+        return new IteratorChain(iterators);
+    }
+
+    /**
+     * Returns an iterator for elements of an array of <code>values</code>.
+     *
+     * @param <T>
+     * @param values  the array to iterate over.
+     * @param from  the index to start iterating at.
+     * @param to  the index to finish iterating at.
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> arrayIterator(T[] values, int from, int to) {
+        return new ArrayIterator(values, from, to);
+    }
+
+    /**
+     * Returns an iterator with elements from an original <code>iterator</code> where the
+     * given <code>predicate</code> matches removed.
+     *
+     * @param <T>
+     * @param iterator
+     * @param predicate
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Iterator<T> filterIterator(Iterator<? extends T> iterator,
+            final Predicate<? super T> predicate) {
+
+        return new FilterIterator(iterator, new org.apache.commons.collections.Predicate() {
+            public boolean evaluate(Object object) {
+                return predicate.evaluate((T) object);
+            }
+        });
+    }
+
+    /**
+     * Returns an iterator with elements of an original  <code>iterator</code> transformed by
+     * a <code>transformer</code>.
+     *
+     * @param <T>
+     * @param <R>
+     * @param <S>
+     * @param iterator
+     * @param transformer
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T, R, S extends T> Iterator<R> transformIterator(Iterator<? extends T> iterator,
+            final Transformer<S, ? super R> transformer) {
+
+        return new TransformIterator(iterator, new org.apache.commons.collections.Transformer() {
+            public Object transform(Object input) {
+                return transformer.transform((S) input);
+            }
+        });
+    }
+
+    /**
+     * Returns an iterator of {@link Property} from a {@link PropertyIterator}.
+     *
+     * @param propertyIterator
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterator<Property> properties(PropertyIterator propertyIterator) {
+        return propertyIterator;
+    }
+
+    /**
+     * Returns an iterator of {@link Node} from a {@link NodeIterator}.
+     * @param nodeIterator
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterator<Node> nodes(NodeIterator nodeIterator) {
+        return nodeIterator;
+    }
+
+}

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java?rev=982181&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/LazyIteratorChain.java Wed Aug  4 09:50:36 2010
@@ -0,0 +1,69 @@
+/*
+ * 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.commons.iterator;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * This class implements the concatenation of iterators. The implementation
+ * is lazy in the sense that advancing of any iterator is deferred as much
+ * as possible. Specifically no iterator is fully unwrapped at one single
+ * point of time.
+ *
+ * @param <T>  type of values iterating over
+ */
+public class LazyIteratorChain<T> implements Iterator<T> {
+    private final Iterator<Iterator<T>> iterators;
+    private Iterator<T> currentIterator;
+
+    /**
+     * Returns the concatenation of all iterators in <code>iterators</code>.
+     *
+     * @param <T>
+     * @param iterators
+     * @return
+     */
+    public static <T> Iterator<T> chain(Iterator<Iterator<T>> iterators) {
+        return new LazyIteratorChain<T>(iterators);
+    }
+
+    public LazyIteratorChain(Iterator<Iterator<T>> iterators) {
+        super();
+        this.iterators = iterators;
+    }
+
+    public boolean hasNext() {
+        while ((currentIterator == null || !currentIterator.hasNext()) && iterators.hasNext()) {
+            currentIterator = iterators.next();
+        }
+        return currentIterator != null && currentIterator.hasNext();
+    }
+
+    public T next() {
+        if (hasNext()) {
+            return currentIterator.next();
+        }
+        else {
+            throw new NoSuchElementException();
+        }
+    }
+
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+}
\ No newline at end of file

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Predicate.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Predicate.java?rev=982181&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Predicate.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Predicate.java Wed Aug  4 09:50:36 2010
@@ -0,0 +1,33 @@
+/*
+ * 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.commons.iterator;
+
+/**
+ * Type safe counter part of {@link org.apache.commons.collections.Predicate}.
+ *
+ * @param <T> type of values this predicate is defined on
+ */
+public interface Predicate<T> {
+
+    /**
+     * Use the specified parameter to perform a test that returns true or false.
+     *
+     * @param arg  the predicate to evaluate, should not be changed
+     * @return true or false
+     */
+    public boolean evaluate(T arg);
+}

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Transformer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Transformer.java?rev=982181&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Transformer.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Transformer.java Wed Aug  4 09:50:36 2010
@@ -0,0 +1,35 @@
+/*
+ * 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.commons.iterator;
+
+/**
+ * Type safe counter part of {@link org.apache.commons.collections.Transformer}.
+ *
+ * @param <A>  argument type to transform from
+ * @param <R>  result type to transform to
+ */
+public interface Transformer<A, R> {
+
+    /**
+     * Transforms the input object (leaving it unchanged) into some output object.
+     *
+     * @param input  the object to be transformed, should be left unchanged
+     * @return a transformed object
+     */
+    public R transform(A argument);
+
+}

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/BTreeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/BTreeManager.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/BTreeManager.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/BTreeManager.java Wed Aug  4 09:50:36 2010
@@ -16,10 +16,12 @@
  */
 package org.apache.jackrabbit.flat;
 
+import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.nodes;
+import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
 
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.iterators.FilterIterator;
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.commons.iterator.Predicate;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
@@ -254,10 +256,9 @@ public class BTreeManager implements Tre
     /**
      * Returns a {@link SizedIterator} of the child nodes of <code>node</code>.
      */
-    @SuppressWarnings("unchecked")
     protected SizedIterator<Node> getNodes(Node node) throws RepositoryException {
         NodeIterator nodes = node.getNodes();
-        return getSizedIterator(nodes, nodes.getSize());
+        return getSizedIterator(nodes(nodes), nodes.getSize());
     }
 
     /**
@@ -267,17 +268,14 @@ public class BTreeManager implements Tre
     protected SizedIterator<Property> getProperties(final Node node) throws RepositoryException {
         final PropertyIterator properties = node.getProperties();
 
-        @SuppressWarnings("unchecked")
-        final Iterator<Property> filtered = new FilterIterator(properties, new Predicate() {
-            public boolean evaluate(Object object) {
-                Property p = (Property) object;
+        Iterator<Property> filtered = filterIterator(properties(properties), new Predicate<Property>() {
+            public boolean evaluate(Property property) {
                 try {
-                    return !JcrConstants.JCR_PRIMARYTYPE.equals(p.getName());
+                    return !JcrConstants.JCR_PRIMARYTYPE.equals(property.getName());
                 }
                 catch (RepositoryException ignore) {
                     return true;
                 }
-
             }
         });
 

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/Rank.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/Rank.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/Rank.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/Rank.java Wed Aug  4 09:50:36 2010
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.flat;
 
-import org.apache.commons.collections.iterators.ArrayIterator;
-import org.apache.commons.collections.iterators.EmptyIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.arrayIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
 
 import java.lang.reflect.Array;
 import java.util.Collection;
@@ -74,11 +74,9 @@ public class Rank<T> {
      * @param componentType type evidence for the values
      * @param order Ordering for ranking
      */
-    @SuppressWarnings("unchecked")
     public Rank(Collection<T> values, Class<T> componentType, Comparator<? super T> order) {
         super();
-        Object array = Array.newInstance(componentType, values.size());
-        this.values = values.toArray((T[]) array);
+        this.values = toArray(values, componentType);
         this.order = order;
     }
 
@@ -93,13 +91,12 @@ public class Rank<T> {
      * @param count Number of items to include. -1 for all.
      * @param order Ordering for ranking
      */
-    @SuppressWarnings("unchecked")
     public Rank(Iterator<T> values, Class<T> componentType, int count, Comparator<? super T> order) {
         super();
         this.order = order;
 
         if (count >= 0) {
-            this.values = (T[]) Array.newInstance(componentType, count);
+            this.values = createArray(count, componentType);
             for (int k = 0; k < count; k++) {
                 this.values[k] = values.next();
             }
@@ -109,8 +106,7 @@ public class Rank<T> {
             while (values.hasNext()) {
                 l.add(values.next());
             }
-            Object array = Array.newInstance(componentType, l.size());
-            this.values = l.toArray((T[]) array);
+            this.values = toArray(l, componentType);
         }
     }
 
@@ -267,14 +263,15 @@ public class Rank<T> {
         values[hi] = t1;
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> arrayIterator(T[] values, int from, int to) {
-        return new ArrayIterator(values, from, to);
+    // -----------------------------------------------------< utility >---
+
+    private static <S> S[] toArray(Collection<S> collection, Class<S> componentType) {
+        return collection.toArray(createArray(collection.size(), componentType));
     }
 
     @SuppressWarnings("unchecked")
-    private Iterator<T> empty() {
-        return EmptyIterator.INSTANCE;
+    private static <S> S[] createArray(int size, Class<S> componentType) {
+        return (S[]) Array.newInstance(componentType, size);
     }
 
 }

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/TreeTraverser.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/TreeTraverser.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/TreeTraverser.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/flat/TreeTraverser.java Wed Aug  4 09:50:36 2010
@@ -16,9 +16,11 @@
  */
 package org.apache.jackrabbit.flat;
 
-import org.apache.commons.collections.iterators.EmptyIterator;
-import org.apache.commons.collections.iterators.IteratorChain;
-import org.apache.commons.collections.iterators.SingletonIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
+import static org.apache.jackrabbit.commons.iterator.Iterators.iteratorChain;
+import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
+import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
+import static org.apache.jackrabbit.commons.iterator.LazyIteratorChain.chain;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
@@ -27,7 +29,6 @@ import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
 import java.util.Iterator;
-import java.util.NoSuchElementException;
 
 /**
  * <p>
@@ -249,7 +250,7 @@ public final class TreeTraverser impleme
     private Iterator<Node> iterator(Node node) {
         try {
             if (inclusionPolicy.include(node)) {
-                return chain(singleton(node), childIterators(node));
+                return iteratorChain(singleton(node), chain(childIterators(node)));
             }
             else {
                 return chain(childIterators(node));
@@ -262,14 +263,6 @@ public final class TreeTraverser impleme
     }
 
     /**
-     * Returns an iterator containing the single element <code>element</code>.
-     */
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> singleton(T element) {
-        return new SingletonIterator(element);
-    }
-
-    /**
      * Returns an iterator of iterators of the child nodes of <code>node</code>.
      */
     private Iterator<Iterator<Node>> childIterators(final Node node) {
@@ -310,11 +303,10 @@ public final class TreeTraverser impleme
                 return nodes.hasNext();
             }
 
-            @SuppressWarnings("unchecked")
             public Iterator<Property> next() {
                 Node n = nodes.next();
                 try {
-                    return n.getProperties();
+                    return properties(n.getProperties());
                 }
                 catch (RepositoryException e) {
                     errorHandler.call(n, e);
@@ -328,64 +320,4 @@ public final class TreeTraverser impleme
         };
     }
 
-    /**
-     * Returns the concatenation of <code>iterator</code> with the concatenation
-     * of all iterators in <code>iterators</code>.
-     */
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> chain(Iterator<T> iterator, Iterator<Iterator<T>> iterators) {
-        return new IteratorChain(iterator, new LazyIteratorChain<T>(iterators));
-    }
-
-    /**
-     * Returns the concatenation of all iterators in <code>iterators</code>.
-     */
-    private static <T> Iterator<T> chain(Iterator<Iterator<T>> iterators) {
-        return new LazyIteratorChain<T>(iterators);
-    }
-
-    /**
-     * Returns an empty iterator.
-     */
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> empty() {
-        return EmptyIterator.INSTANCE;
-    }
-
-    /**
-     * The class implements the concatenation of iterators. The implementation
-     * is lazy in the sense that advancing off all iterators is deferred as much
-     * as possible. Specifically no iterator is fully unwrapped at one single
-     * point of time.
-     */
-    private static final class LazyIteratorChain<T> implements Iterator<T> {
-        private final Iterator<Iterator<T>> iterators;
-        private Iterator<T> currentIterator;
-
-        private LazyIteratorChain(Iterator<Iterator<T>> iterators) {
-            super();
-            this.iterators = iterators;
-        }
-
-        public boolean hasNext() {
-            while ((currentIterator == null || !currentIterator.hasNext()) && iterators.hasNext()) {
-                currentIterator = iterators.next();
-            }
-            return currentIterator != null && currentIterator.hasNext();
-        }
-
-        public T next() {
-            if (hasNext()) {
-                return currentIterator.next();
-            }
-            else {
-                throw new NoSuchElementException();
-            }
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
 }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/GetItemsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/GetItemsTest.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/GetItemsTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/GetItemsTest.java Wed Aug  4 09:50:36 2010
@@ -16,19 +16,11 @@
  */
 package org.apache.jackrabbit.jcr2spi;
 
-import java.util.Iterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.iteratorChain;
+import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
 
-import javax.jcr.AccessDeniedException;
-import javax.jcr.Item;
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.collections.iterators.FilterIterator;
-import org.apache.commons.collections.iterators.IteratorChain;
-import org.apache.commons.collections.iterators.SingletonIterator;
+import org.apache.jackrabbit.commons.iterator.Predicate;
 import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.ItemInfo;
 import org.apache.jackrabbit.spi.NodeId;
@@ -40,6 +32,16 @@ import org.apache.jackrabbit.spi.Reposit
 import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.NodeInfoBuilder;
 
+import javax.jcr.AccessDeniedException;
+import javax.jcr.Item;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import java.util.Iterator;
+
 /**
  * Test cases for {@link RepositoryService#getItemInfos(SessionInfo, NodeId)}. Specifically
  * for JCR-1797.
@@ -151,9 +153,9 @@ public class GetItemsTest extends Abstra
     public Iterator<ItemInfo> getItemInfos(SessionInfo sessionInfo, final NodeId nodeId)
             throws RepositoryException {
 
-        return chain(
+        return iteratorChain(
                 singleton(itemInfoStore.getNodeInfo(nodeId)),
-                filter(itemInfoStore.getItemInfos(), new Predicate<ItemInfo>() {
+                filterIterator(itemInfoStore.getItemInfos(), new Predicate<ItemInfo>() {
                     public boolean evaluate(ItemInfo info) {
                         return !nodeId.equals(info.getId());
                     }
@@ -172,29 +174,4 @@ public class GetItemsTest extends Abstra
         return itemInfoStore.getPropertyInfo(propertyId);
     }
 
-    // -----------------------------------------------------< private >---
-
-    private interface Predicate<T> {
-        public boolean evaluate(T value);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> chain(Iterator<? extends T> first, Iterator<? extends T> second) {
-        return new IteratorChain(first, second);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> singleton(T value) {
-        return new SingletonIterator(value);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> filter(Iterator<T> source, final Predicate<T> predicate) {
-        return new FilterIterator(source, new org.apache.commons.collections.Predicate() {
-            public boolean evaluate(Object object) {
-                return predicate.evaluate((T) object);
-            }
-        });
-    }
-
 }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/ItemInfoStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/ItemInfoStore.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/ItemInfoStore.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/ItemInfoStore.java Wed Aug  4 09:50:36 2010
@@ -16,16 +16,7 @@
  */
 package org.apache.jackrabbit.jcr2spi;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.ItemNotFoundException;
-
-import org.apache.commons.collections.iterators.EmptyIterator;
+import org.apache.jackrabbit.commons.iterator.Iterators;
 import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.spi.ItemInfo;
@@ -35,6 +26,15 @@ import org.apache.jackrabbit.spi.Propert
 import org.apache.jackrabbit.spi.PropertyInfo;
 import org.apache.jackrabbit.spi.RepositoryService;
 
+import javax.jcr.ItemNotFoundException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
 /**
  * In memory store for {@link ItemInfo}s.
  */
@@ -106,7 +106,7 @@ public class ItemInfoStore {
         Iterable<ItemInfo> batch = batches.get(id);
 
         return batch == null
-            ? ItemInfoStore.<ItemInfo>empty()
+            ? Iterators.<ItemInfo>empty()
             : batch.iterator();
     }
 
@@ -186,9 +186,4 @@ public class ItemInfoStore {
         return list;
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> empty() {
-        return EmptyIterator.INSTANCE;
-    }
-
 }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/benchmark/ReadPerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/benchmark/ReadPerformanceTest.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/benchmark/ReadPerformanceTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/benchmark/ReadPerformanceTest.java Wed Aug  4 09:50:36 2010
@@ -16,24 +16,11 @@
  */
 package org.apache.jackrabbit.jcr2spi.benchmark;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.Callable;
+import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.iteratorChain;
+import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
 
-import javax.jcr.Item;
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.collections.iterators.FilterIterator;
-import org.apache.commons.collections.iterators.IteratorChain;
-import org.apache.commons.collections.iterators.SingletonIterator;
+import org.apache.jackrabbit.commons.iterator.Predicate;
 import org.apache.jackrabbit.jcr2spi.AbstractJCR2SPITest;
 import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.ItemInfo;
@@ -45,9 +32,24 @@ import org.apache.jackrabbit.spi.Propert
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.spi.RepositoryService;
 import org.apache.jackrabbit.spi.SessionInfo;
-import org.apache.jackrabbit.spi.commons.ItemInfoCacheImpl;
 import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.NodeInfoBuilder;
 import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.PropertyInfoBuilder;
+import org.apache.jackrabbit.spi.commons.ItemInfoCacheImpl;
+
+import javax.jcr.Item;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.Callable;
 
 /**
  * Utility for testing jcr2spi read performance
@@ -100,7 +102,7 @@ public class ReadPerformanceTest extends
     private final Random rnd = new Random(12345);
 
     /**
-     * This implementation ovverides the default cache size with the value of
+     * This implementation overrides the default cache size with the value of
      * {@value #ITEM_INFO_CACHE_SIZE}
      */
     @Override
@@ -302,7 +304,7 @@ public class ReadPerformanceTest extends
     }
 
     private Iterator<ItemInfo> getBatch() {
-        return filter(itemInfoStore.getItemInfos(), new Predicate<ItemInfo>() {
+        return filterIterator(itemInfoStore.getItemInfos(), new Predicate<ItemInfo>() {
             public boolean evaluate(ItemInfo value) {
                 return rnd.nextInt(batchRatio) == 0;
             }
@@ -323,7 +325,7 @@ public class ReadPerformanceTest extends
 
         roundTripCount++;
         NodeInfo nodeInfo = itemInfoStore.getNodeInfo(nodeId);
-        return chain(singleton(nodeInfo), getBatch());
+        return iteratorChain(singleton(nodeInfo), getBatch());
     }
 
     @Override
@@ -348,29 +350,4 @@ public class ReadPerformanceTest extends
         return itemInfoStore.getChildInfos(parentId);
     }
 
-    // -----------------------------------------------------< private >---
-
-    private interface Predicate<T> {
-        public boolean evaluate(T value);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> chain(Iterator<? extends T> first, Iterator<? extends T> second) {
-        return new IteratorChain(first, second);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> singleton(T value) {
-        return new SingletonIterator(value);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> filter(Iterator<T> source, final Predicate<T> predicate) {
-        return new FilterIterator(source, new org.apache.commons.collections.Predicate() {
-            public boolean evaluate(Object object) {
-                return predicate.evaluate((T) object);
-            }
-        });
-    }
-
 }

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ItemInfoBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ItemInfoBuilder.java?rev=982181&r1=982180&r2=982181&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ItemInfoBuilder.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/ItemInfoBuilder.java Wed Aug  4 09:50:36 2010
@@ -16,23 +16,12 @@
  */
 package org.apache.jackrabbit.spi.commons;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Iterator;
-import java.util.List;
+import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
+import static org.apache.jackrabbit.commons.iterator.Iterators.transformIterator;
 
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.collections.Transformer;
-import org.apache.commons.collections.iterators.EmptyIterator;
-import org.apache.commons.collections.iterators.FilterIterator;
-import org.apache.commons.collections.iterators.TransformIterator;
+import org.apache.jackrabbit.commons.iterator.Iterators;
+import org.apache.jackrabbit.commons.iterator.Predicate;
+import org.apache.jackrabbit.commons.iterator.Transformer;
 import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.ItemInfo;
 import org.apache.jackrabbit.spi.Name;
@@ -42,12 +31,26 @@ import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.PropertyInfo;
 import org.apache.jackrabbit.spi.QValue;
+import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.NodeInfoBuilder;
 import org.apache.jackrabbit.spi.commons.identifier.IdFactoryImpl;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
 import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
 import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl;
 
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
 /**
  * Utility class providing a {@link NodeInfoBuilder} for building {@link NodeInfo}.
  * Example usage:
@@ -265,7 +268,7 @@ public final class ItemInfoBuilder {
                 NodeId id = getId();
 
                 nodeInfo = new NodeInfoImpl(id.getPath(), id, index, primaryTypeName,
-                        mixins.toArray(new Name[mixins.size()]), EmptyIterator.INSTANCE,
+                        mixins.toArray(new Name[mixins.size()]), Iterators.<PropertyId>empty(),
                         getPropertyIds(), includeChildInfos ? getChildInfos() : null);
 
                 if (listener != null) {
@@ -333,9 +336,9 @@ public final class ItemInfoBuilder {
         }
 
         private Iterator<ChildInfo> getChildInfos() {
-            return map(itemInfos.iterator(),
-                    new Function<ItemInfo, ChildInfo>(){
-                        public ChildInfo apply(ItemInfo info) {
+            return transformIterator(itemInfos.iterator(),
+                    new Transformer<ItemInfo, ChildInfo>(){
+                        public ChildInfo transform(ItemInfo info) {
                             Name name = info.getPath().getNameElement().getName();
                             return new ChildInfoImpl(name, null, Path.INDEX_DEFAULT);
                         }
@@ -343,14 +346,14 @@ public final class ItemInfoBuilder {
         }
 
         private Iterator<PropertyId> getPropertyIds() {
-            return map(filter(itemInfos.iterator(),
+            return transformIterator(filterIterator(itemInfos.iterator(),
                     new Predicate<ItemInfo>(){
                         public boolean evaluate(ItemInfo info) {
                             return !info.denotesNode();
                         }
                     }),
-                    new Function<ItemInfo, PropertyId>(){
-                        public PropertyId apply(ItemInfo info) {
+                    new Transformer<ItemInfo, PropertyId>(){
+                        public PropertyId transform(ItemInfo info) {
                             return (PropertyId) info.getId();
                         }
                     });
@@ -631,32 +634,4 @@ public final class ItemInfoBuilder {
 
     }
 
-    // -----------------------------------------------------< private >---
-
-    private interface Predicate<T> {
-        public boolean evaluate(T value);
-    }
-
-    private interface Function<S, T> {
-        public T apply(S s);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <S, T> Iterator<T> map(Iterator<S> source, final Function<S, T> f) {
-        return new TransformIterator(source, new Transformer() {
-            public Object transform(Object o) {
-                return f.apply((S) o);
-            }
-        });
-    }
-
-    @SuppressWarnings("unchecked")
-    private static <T> Iterator<T> filter(Iterator<T> source, final Predicate<T> predicate) {
-        return new FilterIterator(source, new org.apache.commons.collections.Predicate() {
-            public boolean evaluate(Object object) {
-                return predicate.evaluate((T) object);
-            }
-        });
-    }
-
 }