You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2013/04/03 11:29:19 UTC

svn commit: r1463890 - in /jackrabbit/trunk/jackrabbit-jcr-commons/src: main/java/org/apache/jackrabbit/commons/ main/java/org/apache/jackrabbit/commons/iterator/ test/java/org/apache/jackrabbit/commons/

Author: jukka
Date: Wed Apr  3 09:29:18 2013
New Revision: 1463890

URL: http://svn.apache.org/r1463890
Log:
JCR-3555: Add a static utility to transform JCR Iterators into Iterables

Patch by Lukas Eder

Removed:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/Iterators.java
Modified:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/NodeIterable.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/PropertyIterable.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/RowIterable.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/JcrUtilsTest.java

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java?rev=1463890&r1=1463889&r2=1463890&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/JcrUtils.java Wed Apr  3 09:29:18 2013
@@ -49,9 +49,17 @@ import javax.jcr.RepositoryFactory;
 import javax.jcr.Session;
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeIterator;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.observation.EventListenerIterator;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
+import javax.jcr.security.AccessControlPolicyIterator;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
 
 /**
  * Collection of static utility methods for use with the JCR API.
@@ -721,6 +729,188 @@ public class JcrUtils {
     }
 
     /**
+     * Transform any type of {@link Iterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    public static <I> Iterable<I> in(final Iterator<I> iterator) {
+        return new Iterable<I>() {
+            private boolean stale = false;
+
+            @Override
+            public synchronized Iterator<I> iterator() {
+                if (stale) {
+                    throw new IllegalStateException("Cannot reuse Iterable intended for single use");
+                }
+
+                stale = true;
+                return iterator;
+            }
+        };
+    }
+
+    /**
+     * Transform an {@link AccessControlPolicyIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<AccessControlPolicyIterator> in(AccessControlPolicyIterator iterator) {
+        return in((Iterator<AccessControlPolicyIterator>) iterator);
+    }
+
+    /**
+     * Transform an {@link EventIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<Event> in(EventIterator iterator) {
+        return in((Iterator<Event>) iterator);
+    }
+
+    /**
+     * Transform an {@link EventListenerIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<EventListener> in(EventListenerIterator iterator) {
+        return in((Iterator<EventListener>) iterator);
+    }
+
+    /**
+     * Transform an {@link NodeIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<Node> in(NodeIterator iterator) {
+        return in((Iterator<Node>) iterator);
+    }
+
+    /**
+     * Transform an {@link NodeTypeIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<NodeType> in(NodeTypeIterator iterator) {
+        return in((Iterator<NodeType>) iterator);
+    }
+
+    /**
+     * Transform an {@link PropertyIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<Property> in(PropertyIterator iterator) {
+        return in((Iterator<Property>) iterator);
+    }
+
+    /**
+     * Transform an {@link RowIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<Row> in(RowIterator iterator) {
+        return in((Iterator<Row>) iterator);
+    }
+
+    /**
+     * Transform an {@link VersionIterator} into an {@link Iterable}
+     * <strong>for single use</strong> in a Java 5 for-each loop.
+     * <p>
+     * <strong>While general purpose <code>Iterables</code> tend to be reusable,
+     * this wrapper <code>Iterable</code> consumes the argument
+     * <code>Iterator</code>, leaving it in a non-reusable state. The returned
+     * <code>Iterable</code> will throw an <code>IllegalStateException</code> if
+     * its <code>iterator()</code> method is invoked a second time.</strong>
+     *
+     * @param iterator
+     *            The input <code>Iterator</code>
+     * @return The wrapping <code>Iterable</code>
+     */
+    @SuppressWarnings("unchecked")
+    public static Iterable<Version> in(VersionIterator iterator) {
+        return in((Iterator<Version>) iterator);
+    }
+
+    /**
      * Returns the named child of the given node, creating the child if
      * it does not already exist. If the child node gets added, then its
      * type will be determined by the child node definitions associated

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/NodeIterable.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/NodeIterable.java?rev=1463890&r1=1463889&r2=1463890&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/NodeIterable.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/NodeIterable.java Wed Apr  3 09:29:18 2013
@@ -21,13 +21,17 @@ import java.util.Iterator;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 
+import org.apache.jackrabbit.commons.JcrUtils;
+
 /**
  * Adapter class that adapts a {@link NodeIterator} instance to an
  * {@link Iterable<Node>} instance that always returns the same underlying
  * iterator.
  *
  * @since Apache Jackrabbit 2.0
+ * @deprecated - Use {@link JcrUtils#in(NodeIterator)} instead
  */
+@Deprecated
 public class NodeIterable implements Iterable<Node> {
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/PropertyIterable.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/PropertyIterable.java?rev=1463890&r1=1463889&r2=1463890&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/PropertyIterable.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/PropertyIterable.java Wed Apr  3 09:29:18 2013
@@ -21,13 +21,17 @@ import java.util.Iterator;
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 
+import org.apache.jackrabbit.commons.JcrUtils;
+
 /**
  * Adapter class that adapts a {@link PropertyIterator} instance to an
  * {@link Iterable<Property>} instance that always returns the same underlying
  * iterator.
  *
  * @since Apache Jackrabbit 2.0
+ * @deprecated - Use {@link JcrUtils#in(PropertyIterator)} instead
  */
+@Deprecated
 public class PropertyIterable implements Iterable<Property> {
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/RowIterable.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/RowIterable.java?rev=1463890&r1=1463889&r2=1463890&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/RowIterable.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/RowIterable.java Wed Apr  3 09:29:18 2013
@@ -21,13 +21,17 @@ import java.util.Iterator;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
 
+import org.apache.jackrabbit.commons.JcrUtils;
+
 /**
  * Adapter class that adapts a {@link RowIterator} instance to an
  * {@link Iterable<Row>} instance that always returns the same underlying
  * iterator.
  *
  * @since Apache Jackrabbit 2.0
+ * @deprecated - Use {@link JcrUtils#in(RowIterator)} instead
  */
+@Deprecated
 public class RowIterable implements Iterable<Row> {
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/JcrUtilsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/JcrUtilsTest.java?rev=1463890&r1=1463889&r2=1463890&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/JcrUtilsTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/JcrUtilsTest.java Wed Apr  3 09:29:18 2013
@@ -16,8 +16,10 @@
  */
 package org.apache.jackrabbit.commons;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.Map;
 
 import javax.jcr.PropertyType;
@@ -76,4 +78,19 @@ public class JcrUtilsTest extends MockCa
         assertEquals(PropertyType.DATE, JcrUtils.getPropertyType(
                 PropertyType.TYPENAME_DATE.toUpperCase()));
     }
+
+    public void testIn() {
+        Iterable<String> iterable = JcrUtils.in(Arrays.asList("A").iterator());
+        Iterator<String> iterator = iterable.iterator();
+        assertNotNull(iterator);
+        assertTrue(iterator.hasNext());
+        assertEquals("A", iterator.next());
+        assertFalse(iterator.hasNext());
+
+        try {
+            iterable.iterator();
+            fail("Second execution of Iterable.iterator() should throw an exception");
+        } catch (IllegalStateException expected) {
+        }
+    }
 }