You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2016/12/08 23:44:10 UTC

[01/13] zest-java git commit: build: move performance tests build logic into buildSrc

Repository: zest-java
Updated Branches:
  refs/heads/develop 994d38913 -> 8854b1306


build: move performance tests build logic into buildSrc


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/447695d6
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/447695d6
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/447695d6

Branch: refs/heads/develop
Commit: 447695d6c3a46508e72913eefbe8dd18bb6b96e0
Parents: 994d389
Author: Paul Merlin <pa...@apache.org>
Authored: Tue Dec 6 19:03:28 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Tue Dec 6 19:03:54 2016 +0100

----------------------------------------------------------------------
 .../performance/PerformanceTestsPlugin.groovy   | 62 ++++++++++++++++++++
 .../src/docs/tutorials/howto-build-system.txt   |  4 +-
 tests/performance/build.gradle                  | 23 +-------
 3 files changed, 66 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/447695d6/buildSrc/src/main/groovy/org/apache/zest/gradle/performance/PerformanceTestsPlugin.groovy
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/groovy/org/apache/zest/gradle/performance/PerformanceTestsPlugin.groovy b/buildSrc/src/main/groovy/org/apache/zest/gradle/performance/PerformanceTestsPlugin.groovy
new file mode 100644
index 0000000..29f1986
--- /dev/null
+++ b/buildSrc/src/main/groovy/org/apache/zest/gradle/performance/PerformanceTestsPlugin.groovy
@@ -0,0 +1,62 @@
+/*
+ *  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.zest.gradle.performance
+
+import groovy.transform.CompileStatic
+import org.apache.zest.gradle.TaskGroups
+import org.gradle.api.Action
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.plugins.JavaPluginConvention
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.api.tasks.testing.Test
+import org.gradle.language.base.plugins.LifecycleBasePlugin
+
+// TODO Add profiling tasks (jfr or honest? flamegraphs?)
+// TODO Add simple regression assertions, how? testing against a previous version?
+@CompileStatic
+class PerformanceTestsPlugin implements Plugin<Project>
+{
+  static class TaskNames
+  {
+    static final String PERFORMANCE_TEST = 'performanceTest'
+    static final String PERFORMANCE_PROFILE = 'performanceProfile'
+    static final String PERFORMANCE_CHECK = 'performanceCheck'
+  }
+
+  @Override
+  void apply( final Project project )
+  {
+    def sourceSets = project.convention.getPlugin( JavaPluginConvention ).sourceSets
+    sourceSets.create 'perf'
+    project.dependencies.add 'perfCompile', sourceSets.getByName( 'main' ).output
+    project.dependencies.add 'perfCompile', sourceSets.getByName( 'test' ).output
+    project.dependencies.add 'perfCompile', project.configurations.getByName( 'testCompile' )
+    project.dependencies.add 'perfRuntime', project.configurations.getByName( 'testRuntime' )
+    project.tasks.getByName( LifecycleBasePlugin.CHECK_TASK_NAME ).dependsOn 'compilePerfJava'
+    project.tasks.create( TaskNames.PERFORMANCE_TEST, Test, { Test task ->
+      task.group = TaskGroups.PERFORMANCE
+      task.description = 'Runs performance tests.'
+      task.maxParallelForks = 1
+      task.forkEvery = 1L
+      task.testClassesDir = sourceSets.getByName( 'perf' ).output.classesDir
+      task.classpath = sourceSets.getByName( 'perf' ).runtimeClasspath
+      task.systemProperty 'jar.path', ( project.tasks.getByName( 'jar' ) as Jar ).archivePath
+    } as Action<Test> )
+  }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/447695d6/manual/src/docs/tutorials/howto-build-system.txt
----------------------------------------------------------------------
diff --git a/manual/src/docs/tutorials/howto-build-system.txt b/manual/src/docs/tutorials/howto-build-system.txt
index 2af9cbf..54bfd86 100644
--- a/manual/src/docs/tutorials/howto-build-system.txt
+++ b/manual/src/docs/tutorials/howto-build-system.txt
@@ -109,7 +109,7 @@ To see all available tasks on a submodule issue the following command:
 ----
 
 This example will output all gradle tasks available in the +tests/performance+ module where you should find
-the +testPerf+ task that run the Zest\u2122 performance test suite.
+the +performanceTest+ task that run the Zest\u2122 performance test suite.
 
 
 == Versions ==
@@ -165,7 +165,7 @@ They can be run with the following Gradle command:
 
 [source,bash]
 -----------
-./gradlew :org.apache.zest.tests:org.apache.zest.test.performance:testPerf
+./gradlew :org.apache.zest.tests:org.apache.zest.test.performance:performanceTest
 -----------
 
 Results will then be available in the test reports.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/447695d6/tests/performance/build.gradle
----------------------------------------------------------------------
diff --git a/tests/performance/build.gradle b/tests/performance/build.gradle
index af5e790..7da0e51 100644
--- a/tests/performance/build.gradle
+++ b/tests/performance/build.gradle
@@ -15,26 +15,19 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-import org.apache.zest.gradle.TaskGroups
+import org.apache.zest.gradle.performance.PerformanceTestsPlugin
 
 description = "Apache Zest\u2122 Performance Test Suite."
 
 jar { manifest { name = "Apache Zest\u2122 Tests - Performance" } }
 
-sourceSets {
-  perf
-}
+apply plugin: PerformanceTestsPlugin
 
 dependencies {
   compile zest.core.bootstrap
   compile libraries.junit
   compile libraries.slf4j_api
 
-  perfCompile sourceSets.main.output
-  perfCompile configurations.testCompile
-  perfCompile sourceSets.test.output
-  perfRuntime configurations.testRuntime
-
   perfCompile zest.core.testsupport
   perfCompile zest.library( 'sql-dbcp' )
   perfCompile zest.extension( 'valueserialization-orgjson' )
@@ -48,15 +41,3 @@ dependencies {
   perfRuntime zest.core.runtime
   perfRuntime libraries.logback
 }
-
-check.dependsOn compilePerfJava
-
-task testPerf( type: Test, dependsOn: jar ) {
-  group = TaskGroups.PERFORMANCE
-  description = 'Runs performance tests.'
-  maxParallelForks = 1
-  forkEvery = 1
-  testClassesDir = sourceSets.perf.output.classesDir
-  classpath = sourceSets.perf.runtimeClasspath
-  systemProperties[ 'jar.path' ] = jar.archivePath
-}


[12/13] zest-java git commit: runtime: remove Iterables and its last usages

Posted by pa...@apache.org.
runtime: remove Iterables and its last usages


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/516f0056
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/516f0056
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/516f0056

Branch: refs/heads/develop
Commit: 516f0056cca650f91e987aa8c60d190eaaf27266
Parents: df8636b
Author: Paul Merlin <pa...@apache.org>
Authored: Fri Dec 9 00:21:23 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Fri Dec 9 00:21:23 2016 +0100

----------------------------------------------------------------------
 .../org/apache/zest/functional/Iterables.java   | 59 --------------------
 .../apache/zest/functional/IterablesTest.java   | 50 -----------------
 .../association/ManyAssociationInstance.java    |  5 +-
 .../composite/FunctionStateResolver.java        | 10 ++--
 4 files changed, 9 insertions(+), 115 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/516f0056/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
deleted file mode 100644
index 685cf69..0000000
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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.zest.functional;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Utility methods for working with Iterables. See test for examples of how to use.
- */
-@Deprecated
-public final class Iterables
-{
-    public static long count( Iterable<?> iterable )
-    {
-        long c = 0;
-        for( Object anIterable : iterable )
-        {
-            c++;
-        }
-        return c;
-    }
-
-    public static <T> List<T> toList( Iterable<T> iterable )
-    {
-        return addAll( new ArrayList<>(), iterable );
-    }
-
-    private static <T, C extends Collection<T>> C addAll( C collection, Iterable<? extends T> iterable )
-    {
-        for( T item : iterable )
-        {
-            collection.add( item );
-        }
-        return collection;
-    }
-
-    private Iterables()
-    {
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/516f0056/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
deleted file mode 100644
index db307d8..0000000
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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.zest.functional;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-/**
- * Test of Iterables utility methods
- */
-public class IterablesTest
-{
-    private List<String> numbers = Arrays.asList( "1", "2", "3" );
-    private Iterable<Long> numberLongs = Arrays.asList( 1L, 2L, 3L );
-
-    @Test
-    public void testAddAll()
-    {
-        List<String> strings = Iterables.toList( numbers );
-        assertThat( strings.toString(), equalTo( "[1, 2, 3]" ) );
-        assertThat( Iterables.toList( numberLongs ).toString(), equalTo( "[1, 2, 3]" ) );
-    }
-
-    @Test
-    public void testCount()
-    {
-        assertThat( Iterables.count( numbers ), equalTo( 3L ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/516f0056/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
index 848f7b8..1d21029 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
@@ -26,13 +26,14 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.association.ManyAssociationWrapper;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.identity.HasIdentity;
 import org.apache.zest.api.util.NullArgumentException;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.spi.entity.ManyAssociationState;
 
 /**
@@ -124,7 +125,7 @@ public class ManyAssociationInstance<T>
     @Override
     public Iterable<EntityReference> references()
     {
-        return Iterables.toList( manyAssociationState );
+        return StreamSupport.stream( manyAssociationState.spliterator(), false ).collect( Collectors.toList() );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/516f0056/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
index a2b35c1..73bc4a8 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
@@ -25,14 +25,14 @@ import java.util.function.Function;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.property.PropertyDescriptor;
-import org.apache.zest.functional.Iterables;
-import org.apache.zest.runtime.association.ManyAssociationModel;
-import org.apache.zest.runtime.association.NamedAssociationModel;
 import org.apache.zest.runtime.entity.EntityModel;
 import org.apache.zest.spi.entity.EntityState;
 import org.apache.zest.spi.entity.ManyAssociationState;
 import org.apache.zest.spi.entity.NamedAssociationState;
 
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.StreamSupport.stream;
+
 /**
  * Function based StateResolver.
  */
@@ -70,7 +70,9 @@ public class FunctionStateResolver
     @Override
     public List<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor )
     {
-        return Iterables.toList( manyAssociationFunction.apply( associationDescriptor ) );
+        // FIXME Do not shallow copy here
+        return stream( manyAssociationFunction.apply( associationDescriptor ).spliterator(), false )
+            .collect( toList() );
     }
 
     @Override


[06/13] zest-java git commit: functional: remove Iterables.first and Iterables.last and their usage

Posted by pa...@apache.org.
functional: remove Iterables.first and Iterables.last and their usage


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/47cbc7bc
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/47cbc7bc
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/47cbc7bc

Branch: refs/heads/develop
Commit: 47cbc7bc1a5fe79f9b108ecf3850d587095420d1
Parents: f8cd4f5
Author: Paul Merlin <pa...@apache.org>
Authored: Wed Dec 7 09:43:28 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Wed Dec 7 09:43:28 2016 +0100

----------------------------------------------------------------------
 .../apache/zest/api/query/QueryExpressions.java |  5 ++--
 .../org/apache/zest/functional/Iterables.java   | 25 --------------------
 .../apache/zest/functional/IterablesTest.java   |  7 ------
 .../elasticsearch/ElasticSearchFinder.java      |  9 ++++++-
 .../shiro/ini/IniSecurityManagerService.java    |  3 +--
 .../shiro/web/EnvironmentLoaderService.java     |  3 +--
 .../org/apache/zest/sample/rental/web/Page.java |  2 --
 .../apache/zest/envisage/detail/MethodPane.java |  2 --
 .../detail/ServiceConfigurationPane.java        |  2 --
 .../apache/zest/envisage/detail/StatePane.java  |  2 --
 .../model/util/ServiceConfigurationFinder.java  |  4 +---
 .../zest/tools/model/util/StateFinder.java      |  2 --
 12 files changed, 14 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
index dea7134..0ef35c3 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
@@ -26,6 +26,7 @@ import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.function.Predicate;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.GenericAssociationInfo;
@@ -66,7 +67,6 @@ import org.apache.zest.api.query.grammar.Variable;
 import org.apache.zest.api.util.NullArgumentException;
 
 import static org.apache.zest.api.identity.HasIdentity.IDENTITY_METHOD;
-import static org.apache.zest.functional.Iterables.first;
 import static org.apache.zest.functional.Iterables.prepend;
 
 /**
@@ -174,7 +174,8 @@ public final class QueryExpressions
     public static <T> T oneOf( final NamedAssociation<T> association )
     {
         NullArgumentException.validateNotNull( "Association", association );
-        return association.get( first( association ) );
+        Iterator<String> iterator = association.iterator();
+        return association.get( iterator.hasNext() ? iterator.next() : null );
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
index 0cdcd63..ae1d66c 100644
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
@@ -58,31 +58,6 @@ public final class Iterables
         return new FilterIterable<>( i, (Predicate<? super X>) specification );
     }
 
-    public static <X> X first( Iterable<X> i )
-    {
-        Iterator<X> iter = i.iterator();
-        if( iter.hasNext() )
-        {
-            return iter.next();
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public static <X> X last( Iterable<X> i )
-    {
-        Iterator<X> iter = i.iterator();
-        X item = null;
-        while( iter.hasNext() )
-        {
-            item = iter.next();
-        }
-
-        return item;
-    }
-
     @SuppressWarnings( "unchecked" )
     public static <FROM, TO> Iterable<TO> map( Function<? /* super FROM */, TO> function, Iterable<FROM> from )
     {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
index 84787d7..063d067 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
@@ -53,13 +53,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testFirst()
-    {
-        assertThat( Iterables.first( numbers ), equalTo( "1" ) );
-        assertThat( Iterables.first( emptyList() ), nullValue() );
-    }
-
-    @Test
     public void testAppend()
     {
         assertThat( Iterables.toList( Iterables.append( "C", Iterables.iterable( "A", "B" ) ) ).toString(),

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
index d1e083d..ebec4bd 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
@@ -20,6 +20,7 @@
 package org.apache.zest.index.elasticsearch;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
@@ -396,7 +397,13 @@ public interface ElasticSearchFinder
                                                       Map<String, Object> variables )
         {
             LOGGER.trace( "Processing ContainsAllSpecification {}", spec );
-            Object firstValue = Iterables.first( spec.containedValues() );
+            Iterator<?> iterator = spec.containedValues().iterator();
+            if( !iterator.hasNext() )
+            {
+                // Ignore empty contains all spec
+                return;
+            }
+            Object firstValue = iterator.next();
             if( firstValue instanceof ValueComposite )
             {
                 // Query by complex property "example value"

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/ini/IniSecurityManagerService.java
----------------------------------------------------------------------
diff --git a/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/ini/IniSecurityManagerService.java b/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/ini/IniSecurityManagerService.java
index 58e5d85..d9a3788 100644
--- a/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/ini/IniSecurityManagerService.java
+++ b/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/ini/IniSecurityManagerService.java
@@ -34,7 +34,6 @@ import org.apache.zest.api.injection.scope.This;
 import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.service.ServiceActivation;
 import org.apache.zest.api.service.ServiceReference;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.library.shiro.Shiro;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -76,7 +75,7 @@ public interface IniSecurityManagerService
             setIni( Ini.fromResourcePath( iniResourcePath ) );
             securityManager = getInstance();
 
-            if ( realmsRefs != null && Iterables.count( realmsRefs ) > 0 ) {
+            if ( realmsRefs != null && realmsRefs.iterator().hasNext() ) {
 
                 // Register Realms Services
                 RealmSecurityManager realmSecurityManager = ( RealmSecurityManager ) securityManager;

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/libraries/shiro-web/src/main/java/org/apache/zest/library/shiro/web/EnvironmentLoaderService.java
----------------------------------------------------------------------
diff --git a/libraries/shiro-web/src/main/java/org/apache/zest/library/shiro/web/EnvironmentLoaderService.java b/libraries/shiro-web/src/main/java/org/apache/zest/library/shiro/web/EnvironmentLoaderService.java
index 10fce76..400e4ac 100644
--- a/libraries/shiro-web/src/main/java/org/apache/zest/library/shiro/web/EnvironmentLoaderService.java
+++ b/libraries/shiro-web/src/main/java/org/apache/zest/library/shiro/web/EnvironmentLoaderService.java
@@ -34,7 +34,6 @@ import org.apache.zest.api.injection.scope.This;
 import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.service.ServiceComposite;
 import org.apache.zest.api.service.ServiceReference;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.library.shiro.Shiro;
 import org.apache.zest.library.shiro.ini.ShiroIniConfiguration;
 import org.slf4j.Logger;
@@ -68,7 +67,7 @@ public interface EnvironmentLoaderService
             sce.getServletContext().setInitParameter( "shiroConfigLocations", iniResourcePath );
             WebEnvironment env = initEnvironment( sce.getServletContext() );
 
-            if ( realmsRefs != null && Iterables.count( realmsRefs ) > 0 ) {
+            if ( realmsRefs != null && realmsRefs.iterator().hasNext() ) {
 
                 // Register Realms Services
                 RealmSecurityManager realmSecurityManager = ( RealmSecurityManager ) env.getSecurityManager();

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/samples/rental/src/main/java/org/apache/zest/sample/rental/web/Page.java
----------------------------------------------------------------------
diff --git a/samples/rental/src/main/java/org/apache/zest/sample/rental/web/Page.java b/samples/rental/src/main/java/org/apache/zest/sample/rental/web/Page.java
index 679a159..6bd2ba0 100644
--- a/samples/rental/src/main/java/org/apache/zest/sample/rental/web/Page.java
+++ b/samples/rental/src/main/java/org/apache/zest/sample/rental/web/Page.java
@@ -35,8 +35,6 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import static org.apache.zest.functional.Iterables.first;
-
 @Concerns( PageUowManagement.class )
 @Mixins( { Page.MountPointMixin.class, Page.DefaultPageRenderMixin.class } )
 public interface Page

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/tools/envisage/src/main/java/org/apache/zest/envisage/detail/MethodPane.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/MethodPane.java b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/MethodPane.java
index 7dc0b34..b8f8d5e 100644
--- a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/MethodPane.java
+++ b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/MethodPane.java
@@ -52,8 +52,6 @@ import org.apache.zest.tools.model.descriptor.MethodSideEffectDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.ObjectDetailDescriptor;
 import org.apache.zest.tools.model.util.DescriptorUtilities;
 
-import static org.apache.zest.functional.Iterables.first;
-
 /**
  * Implementation of Composite Method Panel
  */

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/tools/envisage/src/main/java/org/apache/zest/envisage/detail/ServiceConfigurationPane.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/ServiceConfigurationPane.java b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/ServiceConfigurationPane.java
index 8b9e06b..2bb4a77 100644
--- a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/ServiceConfigurationPane.java
+++ b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/ServiceConfigurationPane.java
@@ -43,8 +43,6 @@ import org.apache.zest.tools.model.descriptor.ServiceDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.ValueDetailDescriptor;
 import org.apache.zest.tools.model.util.DescriptorUtilities;
 
-import static org.apache.zest.functional.Iterables.first;
-
 /**
  * Implementation of Service Configuration Panel
  */

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/tools/envisage/src/main/java/org/apache/zest/envisage/detail/StatePane.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/StatePane.java b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/StatePane.java
index 70b8c13..cf0e96f 100644
--- a/tools/envisage/src/main/java/org/apache/zest/envisage/detail/StatePane.java
+++ b/tools/envisage/src/main/java/org/apache/zest/envisage/detail/StatePane.java
@@ -58,8 +58,6 @@ import org.apache.zest.tools.model.descriptor.MethodSideEffectDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.ObjectDetailDescriptor;
 import org.apache.zest.tools.model.util.DescriptorUtilities;
 
-import static org.apache.zest.functional.Iterables.first;
-
 /**
  * Implementation of Composite State Panel
  */

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/ServiceConfigurationFinder.java
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/ServiceConfigurationFinder.java b/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/ServiceConfigurationFinder.java
index b243563..635adbb 100644
--- a/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/ServiceConfigurationFinder.java
+++ b/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/ServiceConfigurationFinder.java
@@ -30,8 +30,6 @@ import org.apache.zest.tools.model.descriptor.ServiceDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.TransientDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.ValueDetailDescriptor;
 
-import static org.apache.zest.functional.Iterables.first;
-
 class ServiceConfigurationFinder
 {
     public Object findConfigurationDescriptor( ServiceDetailDescriptor descriptor )
@@ -43,7 +41,7 @@ class ServiceConfigurationFinder
             return null;
         }
 
-        // traverse the appDescritor to find the configurationDescriptor
+        // traverse the appDescriptor to find the configurationDescriptor
         ApplicationDetailDescriptor appDescriptor = descriptor.module().layer().application();
         Object obj = findConfigurationDescriptor( appDescriptor, configType );
         if( obj == null )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/47cbc7bc/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/StateFinder.java
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/StateFinder.java b/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/StateFinder.java
index 15351fb..98bdf68 100644
--- a/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/StateFinder.java
+++ b/tools/model-detail/src/main/java/org/apache/zest/tools/model/util/StateFinder.java
@@ -30,8 +30,6 @@ import org.apache.zest.api.property.Property;
 import org.apache.zest.tools.model.descriptor.CompositeDetailDescriptor;
 import org.apache.zest.tools.model.descriptor.CompositeMethodDetailDescriptor;
 
-import static org.apache.zest.functional.Iterables.first;
-
 public class StateFinder
 {
     public List<CompositeMethodDetailDescriptor> findState( CompositeDetailDescriptor<?> descriptor )


[08/13] zest-java git commit: functional: remove Iterables.map and .filter and their usage

Posted by pa...@apache.org.
functional: remove Iterables.map and .filter and their usage


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/d91227a4
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/d91227a4
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/d91227a4

Branch: refs/heads/develop
Commit: d91227a47c502aa0150c4c4b5226ad2ddf1493e4
Parents: 2d485e3
Author: Paul Merlin <pa...@apache.org>
Authored: Thu Dec 8 19:41:10 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Thu Dec 8 19:46:33 2016 +0100

----------------------------------------------------------------------
 .../apache/zest/api/query/QueryExpressions.java |  10 +-
 .../api/query/grammar/ContainsAllPredicate.java |   3 +-
 .../java/org/apache/zest/api/OperatorsTest.java |   4 +-
 .../org/apache/zest/functional/Iterables.java   | 227 +------------------
 .../apache/zest/functional/IterablesTest.java   |  33 ---
 .../association/NamedAssociationInstance.java   |  65 +-----
 .../runtime/bootstrap/ModuleAssemblyImpl.java   |  53 +++--
 .../zest/runtime/structure/ModuleInstance.java  |   4 +-
 .../zest/test/indexing/NameableAssert.java      |   6 +-
 .../AbstractCollectionSerializationTest.java    |  22 +-
 .../apache/zest/index/rdf/ContainsAllTest.java  |   3 +-
 .../support/skeletons/AbstractSQLIndexing.java  |  16 +-
 .../shiro/domain/permissions/RoleFactory.java   |   3 +-
 13 files changed, 85 insertions(+), 364 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
index 0ef35c3..17137d1 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
@@ -24,9 +24,12 @@ import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.function.Predicate;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.GenericAssociationInfo;
@@ -67,7 +70,6 @@ import org.apache.zest.api.query.grammar.Variable;
 import org.apache.zest.api.util.NullArgumentException;
 
 import static org.apache.zest.api.identity.HasIdentity.IDENTITY_METHOD;
-import static org.apache.zest.functional.Iterables.prepend;
 
 /**
  * Static factory methods for query expressions and operators.
@@ -293,7 +295,11 @@ public final class QueryExpressions
                                     Predicate<Composite>... optionalRight
     )
     {
-        return new AndPredicate( prepend( left, prepend( right, Arrays.asList( optionalRight ) ) ) );
+        List<Predicate<Composite>> predicates = new ArrayList<>( 2 + optionalRight.length );
+        predicates.add( left );
+        predicates.add( right );
+        Collections.addAll( predicates, optionalRight );
+        return new AndPredicate( predicates );
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java b/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
index 429aa73..0bed02b 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
@@ -21,7 +21,6 @@ package org.apache.zest.api.query.grammar;
 
 import java.util.Collection;
 import org.apache.zest.api.composite.Composite;
-import org.apache.zest.functional.Iterables;
 
 /**
  * Contains All Specification.
@@ -74,6 +73,6 @@ public class ContainsAllPredicate<T>
     @Override
     public String toString()
     {
-        return collectionProperty + " contains " + Iterables.toList( valueCollection );
+        return collectionProperty + " contains " + valueCollection;
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/api/src/test/java/org/apache/zest/api/OperatorsTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/zest/api/OperatorsTest.java b/core/api/src/test/java/org/apache/zest/api/OperatorsTest.java
index 99ccd5a..86151a0 100644
--- a/core/api/src/test/java/org/apache/zest/api/OperatorsTest.java
+++ b/core/api/src/test/java/org/apache/zest/api/OperatorsTest.java
@@ -19,6 +19,7 @@
  */
 package org.apache.zest.api;
 
+import java.util.Collections;
 import java.util.function.Predicate;
 import org.apache.zest.api.activation.ActivationException;
 import org.apache.zest.api.composite.Composite;
@@ -36,7 +37,6 @@ import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.bootstrap.SingletonAssembler;
 import org.apache.zest.bootstrap.unitofwork.DefaultUnitOfWorkAssembler;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.test.EntityTestAssembler;
 import org.junit.Assert;
 import org.junit.Test;
@@ -78,7 +78,7 @@ public class OperatorsTest
             uow.complete();
             uow = uowf.newUnitOfWork();
 
-            Iterable<TestEntity> entities = Iterables.iterable( testEntity = uow.get( testEntity ) );
+            Iterable<TestEntity> entities = Collections.singleton( testEntity = uow.get( testEntity ) );
 
             QueryBuilder<TestEntity> builder = assembler.module().newQueryBuilder( TestEntity.class );
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
index 46c26a3..685cf69 100644
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
@@ -20,27 +20,15 @@
 package org.apache.zest.functional;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
-import java.util.function.Function;
-import java.util.function.Predicate;
 
 /**
  * Utility methods for working with Iterables. See test for examples of how to use.
  */
+@Deprecated
 public final class Iterables
 {
-    private static <T, C extends Collection<T>> C addAll( C collection, Iterable<? extends T> iterable )
-    {
-        for( T item : iterable )
-        {
-            collection.add( item );
-        }
-        return collection;
-    }
-
     public static long count( Iterable<?> iterable )
     {
         long c = 0;
@@ -51,223 +39,18 @@ public final class Iterables
         return c;
     }
 
-    @SuppressWarnings( "unchecked" )
-    public static <X> Iterable<X> filter( Predicate<? /* super X*/> specification, Iterable<X> i )
-    {
-        return new FilterIterable<>( i, (Predicate<? super X>) specification );
-    }
-
-    @SuppressWarnings( "unchecked" )
-    public static <FROM, TO> Iterable<TO> map( Function<? /* super FROM */, TO> function, Iterable<FROM> from )
-    {
-        return new MapIterable<>( from, (Function<FROM, TO>) function );
-    }
-
-    @SafeVarargs
-    public static <T> Iterable<T> iterable( T... items )
-    {
-        return Arrays.asList( items );
-    }
-
-    public static <T> Iterable<T> prepend( final T item, final Iterable<T> iterable )
-    {
-        return () -> new Iterator<T>()
-        {
-            private T first = item;
-            private Iterator<T> iterator;
-
-            @Override
-            public boolean hasNext()
-            {
-                if( first != null )
-                {
-                    return true;
-                }
-                else
-                {
-                    if( iterator == null )
-                    {
-                        iterator = iterable.iterator();
-                    }
-                }
-
-                return iterator.hasNext();
-            }
-
-            @Override
-            public T next()
-            {
-                if( first != null )
-                {
-                    try
-                    {
-                        return first;
-                    }
-                    finally
-                    {
-                        first = null;
-                    }
-                }
-                else
-                {
-                    return iterator.next();
-                }
-            }
-
-            @Override
-            public void remove()
-            {
-            }
-        };
-    }
-
     public static <T> List<T> toList( Iterable<T> iterable )
     {
         return addAll( new ArrayList<>(), iterable );
     }
 
-    private static class MapIterable<FROM, TO>
-        implements Iterable<TO>
-    {
-        private final Iterable<FROM> from;
-        private final Function<? super FROM, TO> function;
-
-        private MapIterable( Iterable<FROM> from, Function<? super FROM, TO> function )
-        {
-            this.from = from;
-            this.function = function;
-        }
-
-        @Override
-        public Iterator<TO> iterator()
-        {
-            return new MapIterator<>( from.iterator(), function );
-        }
-
-        static class MapIterator<FROM, TO>
-            implements Iterator<TO>
-        {
-            private final Iterator<FROM> fromIterator;
-            private final Function<? super FROM, TO> function;
-
-            private MapIterator( Iterator<FROM> fromIterator, Function<? super FROM, TO> function )
-            {
-                this.fromIterator = fromIterator;
-                this.function = function;
-            }
-
-            @Override
-            public boolean hasNext()
-            {
-                return fromIterator.hasNext();
-            }
-
-            @Override
-            public TO next()
-            {
-                FROM from = fromIterator.next();
-                return function.apply( from );
-            }
-
-            @Override
-            public void remove()
-            {
-                fromIterator.remove();
-            }
-        }
-    }
-
-    private static class FilterIterable<T>
-        implements Iterable<T>
+    private static <T, C extends Collection<T>> C addAll( C collection, Iterable<? extends T> iterable )
     {
-        private final Iterable<T> iterable;
-
-        private final Predicate<? super T> specification;
-
-        private FilterIterable( Iterable<T> iterable, Predicate<? super T> specification )
-        {
-            this.iterable = iterable;
-            this.specification = specification;
-        }
-
-        @Override
-        public Iterator<T> iterator()
-        {
-            return new FilterIterator<>( iterable.iterator(), specification );
-        }
-
-        private static class FilterIterator<T>
-            implements Iterator<T>
+        for( T item : iterable )
         {
-            private final Iterator<T> iterator;
-
-            private final Predicate<? super T> specification;
-
-            private T currentValue;
-            boolean finished = false;
-            boolean nextConsumed = true;
-
-            private FilterIterator( Iterator<T> iterator, Predicate<? super T> specification )
-            {
-                this.specification = specification;
-                this.iterator = iterator;
-            }
-
-            private boolean moveToNextValid()
-            {
-                boolean found = false;
-                while( !found && iterator.hasNext() )
-                {
-                    T currentValue = iterator.next();
-                    boolean satisfies = specification.test( currentValue );
-
-                    if( satisfies )
-                    {
-                        found = true;
-                        this.currentValue = currentValue;
-                        nextConsumed = false;
-                    }
-                }
-                if( !found )
-                {
-                    finished = true;
-                }
-                return found;
-            }
-
-            @Override
-            public T next()
-            {
-                if( !nextConsumed )
-                {
-                    nextConsumed = true;
-                    return currentValue;
-                }
-                else
-                {
-                    if( !finished )
-                    {
-                        if( moveToNextValid() )
-                        {
-                            nextConsumed = true;
-                            return currentValue;
-                        }
-                    }
-                }
-                return null;
-            }
-
-            @Override
-            public boolean hasNext()
-            {
-                return !finished && ( !nextConsumed || moveToNextValid() );
-            }
-
-            @Override
-            public void remove()
-            {
-            }
+            collection.add( item );
         }
+        return collection;
     }
 
     private Iterables()

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
index ffa7d88..db307d8 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
@@ -20,9 +20,7 @@
 package org.apache.zest.functional;
 
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
-import java.util.function.Function;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -49,35 +47,4 @@ public class IterablesTest
     {
         assertThat( Iterables.count( numbers ), equalTo( 3L ) );
     }
-
-    @Test
-    public void testMap()
-    {
-        assertThat( Iterables.toList( Iterables.map( new Function<String, String>()
-        {
-
-            public String apply( String s )
-            {
-                return s + s;
-            }
-        }, numbers ) ).toString(), equalTo( "[11, 22, 33]" ) );
-
-        Iterable<List<String>> numberIterable = Iterables.iterable( numbers, numbers, numbers );
-        assertThat( Iterables.toList( Iterables.map( new Function<Collection, Integer>()
-        {
-
-            @Override
-            public Integer apply( Collection collection )
-            {
-                return collection.size();
-            }
-        }, numberIterable ) ).toString(), equalTo( "[3, 3, 3]" ) );
-    }
-
-    @Test
-    public void testIterableVarArg()
-    {
-        assertThat( Iterables.toList( Iterables.iterable( "1", "2", "3" ) ).toString(),
-                    equalTo( "[1, 2, 3]" ) );
-    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
index 05c4539..147fcc2 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
@@ -20,11 +20,14 @@
 package org.apache.zest.runtime.association;
 
 import java.lang.reflect.Type;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.NamedAssociation;
 import org.apache.zest.api.association.NamedAssociationWrapper;
@@ -33,8 +36,6 @@ import org.apache.zest.api.identity.HasIdentity;
 import org.apache.zest.api.util.NullArgumentException;
 import org.apache.zest.spi.entity.NamedAssociationState;
 
-import static org.apache.zest.functional.Iterables.map;
-
 public class NamedAssociationInstance<T>
     extends AbstractAssociationInstance<T>
     implements NamedAssociation<T>
@@ -112,14 +113,9 @@ public class NamedAssociationInstance<T>
     @Override
     public Iterable<EntityReference> references()
     {
-        return map( new Function<String, EntityReference>()
-        {
-            @Override
-            public EntityReference apply( String name )
-            {
-                return namedAssociationState.get( name );
-            }
-        }, namedAssociationState );
+        return StreamSupport.stream( namedAssociationState.spliterator(), false )
+                            .map( namedAssociationState::get )
+                            .collect( Collectors.toList() );
     }
 
     @Override
@@ -130,51 +126,10 @@ public class NamedAssociationInstance<T>
 
     public Iterable<Map.Entry<String, EntityReference>> getEntityReferences()
     {
-        return map( new Function<String, Map.Entry<String, EntityReference>>()
-        {
-            @Override
-            public Map.Entry<String, EntityReference> apply( final String key )
-            {
-                final EntityReference value = namedAssociationState.get( key );
-                return new Map.Entry<String, EntityReference>()
-                {
-                    @Override
-                    public String getKey()
-                    {
-                        return key;
-                    }
-
-                    @Override
-                    public EntityReference getValue()
-                    {
-                        return value;
-                    }
-
-                    @Override
-                    public EntityReference setValue( EntityReference value )
-                    {
-                        throw new UnsupportedOperationException( "Immutable Map" );
-                    }
-
-                    @Override
-                    public boolean equals( Object o )
-                    {
-                        if( o instanceof Map.Entry )
-                        {
-                            Map.Entry other = (Map.Entry) o;
-                            return key.equals( other.getKey() );
-                        }
-                        return false;
-                    }
-
-                    @Override
-                    public int hashCode()
-                    {
-                        return 997 * key.hashCode() + 981813497;
-                    }
-                };
-            }
-        }, namedAssociationState );
+        return Collections.unmodifiableMap(
+            StreamSupport.stream( namedAssociationState.spliterator(), false )
+                         .collect( Collectors.toMap( Function.identity(), namedAssociationState::get ) )
+        ).entrySet();
     }
 
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
index 1dea286..11b2f05 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/bootstrap/ModuleAssemblyImpl.java
@@ -22,7 +22,6 @@ package org.apache.zest.runtime.bootstrap;
 
 import java.lang.reflect.UndeclaredThrowableException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -32,7 +31,6 @@ import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
 import org.apache.zest.api.activation.Activator;
 import org.apache.zest.api.common.MetaInfo;
 import org.apache.zest.api.common.Visibility;
@@ -43,7 +41,6 @@ import org.apache.zest.api.identity.Identity;
 import org.apache.zest.api.identity.IdentityGenerator;
 import org.apache.zest.api.identity.StringIdentity;
 import org.apache.zest.api.service.DuplicateServiceIdentityException;
-import org.apache.zest.api.service.ServiceImporter;
 import org.apache.zest.api.structure.Module;
 import org.apache.zest.api.type.HasTypes;
 import org.apache.zest.api.type.MatchTypeSpecification;
@@ -88,8 +85,9 @@ import org.apache.zest.runtime.structure.ModuleModel;
 import org.apache.zest.runtime.value.ValueModel;
 import org.apache.zest.runtime.value.ValuesModel;
 
+import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
 import static java.util.stream.Collectors.toList;
-import static org.apache.zest.functional.Iterables.iterable;
 
 /**
  * Assembly of a Module. This is where you register all objects, Composites,
@@ -166,7 +164,7 @@ final class ModuleAssemblyImpl
     @SafeVarargs
     public final ModuleAssembly withActivators(Class<? extends Activator<Module>>... activators)
     {
-        this.activators.addAll(Arrays.asList(activators));
+        this.activators.addAll( asList( activators ) );
         return this;
     }
 
@@ -458,36 +456,36 @@ final class ModuleAssemblyImpl
     public <ThrowableType extends Throwable> void visit(AssemblyVisitor<ThrowableType> visitor)
             throws ThrowableType
     {
-        visitor.visitModule(this);
+        visitor.visitModule( this );
 
-        for (TransientAssemblyImpl compositeDeclaration : transientAssemblies.values())
+        for( TransientAssemblyImpl compositeDeclaration : transientAssemblies.values() )
         {
-            visitor.visitComposite(new TransientDeclarationImpl(iterable(compositeDeclaration)));
+            visitor.visitComposite( new TransientDeclarationImpl( singleton( compositeDeclaration ) ) );
         }
 
-        for (EntityAssemblyImpl entityDeclaration : entityAssemblies.values())
+        for( EntityAssemblyImpl entityDeclaration : entityAssemblies.values() )
         {
-            visitor.visitEntity(new EntityDeclarationImpl(iterable(entityDeclaration)));
+            visitor.visitEntity( new EntityDeclarationImpl( singleton( entityDeclaration ) ) );
         }
 
-        for (ObjectAssemblyImpl objectDeclaration : objectAssemblies.values())
+        for( ObjectAssemblyImpl objectDeclaration : objectAssemblies.values() )
         {
-            visitor.visitObject(new ObjectDeclarationImpl(iterable(objectDeclaration)));
+            visitor.visitObject( new ObjectDeclarationImpl( singleton( objectDeclaration ) ) );
         }
 
-        for (ServiceAssemblyImpl serviceDeclaration : serviceAssemblies)
+        for( ServiceAssemblyImpl serviceDeclaration : serviceAssemblies )
         {
-            visitor.visitService(new ServiceDeclarationImpl(iterable(serviceDeclaration)));
+            visitor.visitService( new ServiceDeclarationImpl( singleton( serviceDeclaration ) ) );
         }
 
-        for (ImportedServiceAssemblyImpl importedServiceDeclaration : importedServiceAssemblies.values())
+        for( ImportedServiceAssemblyImpl importedServiceDeclaration : importedServiceAssemblies.values() )
         {
-            visitor.visitImportedService(new ImportedServiceDeclarationImpl(iterable(importedServiceDeclaration)));
+            visitor.visitImportedService( new ImportedServiceDeclarationImpl( singleton( importedServiceDeclaration ) ) );
         }
 
-        for (ValueAssemblyImpl valueDeclaration : valueAssemblies.values())
+        for( ValueAssemblyImpl valueDeclaration : valueAssemblies.values() )
         {
-            visitor.visitValue(new ValueDeclarationImpl(iterable(valueDeclaration)));
+            visitor.visitValue( new ValueDeclarationImpl( singleton( valueDeclaration ) ) );
         }
     }
 
@@ -580,15 +578,16 @@ final class ModuleAssemblyImpl
             identities.add(identity);
         }
 
-        importedServiceModels.stream().filter(importedServiceModel ->
-                !StreamSupport.stream(objectModels.spliterator(), false)
-                        .anyMatch(model -> model.types().findFirst().get().equals(importedServiceModel.serviceImporter())))
-                .forEach(importedServiceModel ->
-        {
-            Class<? extends ServiceImporter> serviceFactoryType = importedServiceModel.serviceImporter();
-            ObjectModel objectModel = new ObjectModel(moduleModel, serviceFactoryType, Visibility.module, new MetaInfo());
-            objectModels.add(objectModel);
-        });
+        importedServiceModels
+            .stream()
+            .filter(
+                importedServiceModel ->
+                    objectModels.stream().noneMatch( model -> model.types().findFirst().get()
+                                                                   .equals( importedServiceModel.serviceImporter() ) ) )
+            .forEach(
+                importedServiceModel ->
+                    objectModels.add( new ObjectModel( moduleModel, importedServiceModel.serviceImporter(),
+                                                       Visibility.module, new MetaInfo() ) ) );
 
         return moduleModel;
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
index d3461d0..7a8a72d 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
@@ -92,8 +92,8 @@ import org.apache.zest.spi.entitystore.EntityStore;
 import org.apache.zest.spi.metrics.MetricsProviderAdapter;
 import org.apache.zest.spi.module.ModuleSpi;
 
+import static java.util.Arrays.asList;
 import static java.util.stream.Stream.concat;
-import static org.apache.zest.functional.Iterables.iterable;
 
 /**
  * Instance of a Zest Module. Contains the various composites for this Module.
@@ -427,7 +427,7 @@ public class ModuleInstance
     public void activate()
         throws ActivationException
     {
-        activation.activate( model.newActivatorsInstance(), iterable( services, importedServices ) );
+        activation.activate( model.newActivatorsInstance(), asList( services, importedServices ) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/testsupport/src/main/java/org/apache/zest/test/indexing/NameableAssert.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/zest/test/indexing/NameableAssert.java b/core/testsupport/src/main/java/org/apache/zest/test/indexing/NameableAssert.java
index 5429ab7..d1487c3 100644
--- a/core/testsupport/src/main/java/org/apache/zest/test/indexing/NameableAssert.java
+++ b/core/testsupport/src/main/java/org/apache/zest/test/indexing/NameableAssert.java
@@ -26,6 +26,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.identity.Identity;
 import org.apache.zest.test.indexing.model.Nameable;
@@ -34,7 +36,6 @@ import static org.hamcrest.core.IsEqual.equalTo;
 import static org.hamcrest.core.IsNull.notNullValue;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
-import static org.apache.zest.functional.Iterables.toList;
 
 public class NameableAssert
 {
@@ -56,7 +57,8 @@ public class NameableAssert
                                     String... expectedNames
     )
     {
-        final List<EntityReference> references = toList( identitiesIterable );
+        final List<EntityReference> references = StreamSupport.stream( identitiesIterable.spliterator(), false )
+                                                              .collect( Collectors.toList() );
         assertThat( expectedNames.length + " entries(" + expectedNames.length + ", got " + getNames( references ) + ")",
                     references.size(),
                     equalTo( expectedNames.length ) );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/core/testsupport/src/main/java/org/apache/zest/test/value/AbstractCollectionSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/zest/test/value/AbstractCollectionSerializationTest.java b/core/testsupport/src/main/java/org/apache/zest/test/value/AbstractCollectionSerializationTest.java
index 15ad941..75a6d03 100644
--- a/core/testsupport/src/main/java/org/apache/zest/test/value/AbstractCollectionSerializationTest.java
+++ b/core/testsupport/src/main/java/org/apache/zest/test/value/AbstractCollectionSerializationTest.java
@@ -24,6 +24,7 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -40,7 +41,6 @@ import org.apache.zest.api.value.ValueBuilder;
 import org.apache.zest.api.value.ValueSerialization;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.test.AbstractZestTest;
 import org.junit.Test;
 
@@ -50,7 +50,7 @@ import static org.junit.Assert.assertEquals;
 /**
  * Assert that ValueSerialization behaviour on Collections and Maps is correct.
  */
-// TODO How to assert that given a collection of valuecomposites when serializing and deserializing we have to OOME?
+// TODO How to assert that given a collection of valuecomposites when serializing and deserializing we have no OOME?
 public class AbstractCollectionSerializationTest
     extends AbstractZestTest
 {
@@ -96,7 +96,7 @@ public class AbstractCollectionSerializationTest
     public void givenIterableTypeWithByteAndNullElementWhenSerializingAndDeserializingExpectEquals()
         throws Exception
     {
-        String output = valueSerialization.serialize( Iterables.iterable( byteCollection().toArray() ) );
+        String output = valueSerialization.serialize( new AdHocIterable<>( byteCollection() ) );
         CollectionType collectionType = new CollectionType( List.class, new ValueType( Byte.class ) );
         List<Byte> list = valueSerialization.deserialize( module, collectionType, output );
         assertEquals( byteCollection(), list );
@@ -414,4 +414,20 @@ public class AbstractCollectionSerializationTest
         }
         return builder.newInstance();
     }
+
+    private static class AdHocIterable<T> implements Iterable<T>
+    {
+        private final Iterable<T> delegate;
+
+        private AdHocIterable( Iterable<T> delegate )
+        {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public Iterator<T> iterator()
+        {
+            return delegate.iterator();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/extensions/indexing-rdf/src/test/java/org/apache/zest/index/rdf/ContainsAllTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/test/java/org/apache/zest/index/rdf/ContainsAllTest.java b/extensions/indexing-rdf/src/test/java/org/apache/zest/index/rdf/ContainsAllTest.java
index 53dabc1..603d4a4 100644
--- a/extensions/indexing-rdf/src/test/java/org/apache/zest/index/rdf/ContainsAllTest.java
+++ b/extensions/indexing-rdf/src/test/java/org/apache/zest/index/rdf/ContainsAllTest.java
@@ -36,7 +36,6 @@ import org.apache.zest.api.value.ValueBuilderFactory;
 import org.apache.zest.api.value.ValueComposite;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.rdf.assembly.RdfNativeSesameStoreAssembler;
 import org.apache.zest.library.fileconfig.FileConfigurationAssembler;
 import org.apache.zest.library.fileconfig.FileConfigurationOverride;
@@ -314,7 +313,7 @@ public class ContainsAllTest
 
         builder = builder.where( QueryExpressions.containsAll(
                 QueryExpressions.templateFor( ExampleEntity.class ).strings(),
-                Iterables.iterable( strings ) ) );
+                Arrays.asList( strings ) ) );
         return this.unitOfWorkFactory.currentUnitOfWork().newQuery( builder ).find();
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLIndexing.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLIndexing.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLIndexing.java
index ed7cbfb..e42d2c5 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLIndexing.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLIndexing.java
@@ -32,7 +32,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.sql.DataSource;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.common.QualifiedName;
@@ -47,7 +48,6 @@ import org.apache.zest.api.service.ServiceDescriptor;
 import org.apache.zest.api.structure.Application;
 import org.apache.zest.api.value.ValueComposite;
 import org.apache.zest.api.value.ValueDescriptor;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.sql.support.api.SQLIndexing;
 import org.apache.zest.index.sql.support.common.DBNames;
 import org.apache.zest.index.sql.support.common.QNameInfo;
@@ -172,14 +172,10 @@ public abstract class AbstractSQLIndexing
             Map<Long, EntityState> statesByPK = new HashMap<>();
             Map<Long, Integer> qNamePKs = new HashMap<>();
 
-            Iterable<EntityState> relatedStates = Iterables.filter( new Predicate<EntityState>()
-            {
-                @Override
-                public boolean test( EntityState item )
-                {
-                    return item.entityDescriptor().queryable();
-                }
-            }, Iterables.map( SQLCompatEntityStateWrapper.WRAP, changedStates ) );
+            Iterable<EntityState> relatedStates = StreamSupport.stream( changedStates.spliterator(), false )
+                                                               .filter( state -> state.entityDescriptor().queryable() )
+                                                               .map( SQLCompatEntityStateWrapper.WRAP )
+                                                               .collect( Collectors.toList() );
 
             for( EntityState eState : relatedStates )
             {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/d91227a4/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/domain/permissions/RoleFactory.java
----------------------------------------------------------------------
diff --git a/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/domain/permissions/RoleFactory.java b/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/domain/permissions/RoleFactory.java
index 2de0b6d..9a3cc8d 100644
--- a/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/domain/permissions/RoleFactory.java
+++ b/libraries/shiro-core/src/main/java/org/apache/zest/library/shiro/domain/permissions/RoleFactory.java
@@ -26,7 +26,6 @@ import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.service.ServiceComposite;
 import org.apache.zest.api.unitofwork.UnitOfWork;
 import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
-import org.apache.zest.functional.Iterables;
 
 @Mixins( RoleFactory.Mixin.class )
 public interface RoleFactory
@@ -57,7 +56,7 @@ public interface RoleFactory
             EntityBuilder<Role> roleBuilder = uow.newEntityBuilder( Role.class );
             Role role = roleBuilder.instance();
             role.name().set( name );
-            role.permissions().set( Iterables.toList( permissions ) );
+            permissions.forEach( p -> role.permissions().get().add( p ) );
             return roleBuilder.newInstance();
         }
 


[05/13] zest-java git commit: api: ServiceFinder return streams

Posted by pa...@apache.org.
api: ServiceFinder return streams


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/f8cd4f58
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/f8cd4f58
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/f8cd4f58

Branch: refs/heads/develop
Commit: f8cd4f58e906b17b662a69704ca317654f15c1e5
Parents: 401f70f
Author: Paul Merlin <pa...@apache.org>
Authored: Wed Dec 7 09:41:59 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Wed Dec 7 09:41:59 2016 +0100

----------------------------------------------------------------------
 .../apache/zest/api/service/ServiceFinder.java  |  9 +--
 .../importer/ServiceInstanceImporter.java       | 20 ++-----
 .../importer/ServiceSelectorImporter.java       | 32 ++++------
 .../api/service/qualifier/ServiceQualifier.java | 14 -----
 .../ServiceInjectionProviderFactory.java        | 28 ++++-----
 .../zest/runtime/structure/ModuleInstance.java  | 18 +++---
 .../apache/zest/runtime/mixin/JDKMixinTest.java | 28 ++++-----
 .../zest/runtime/service/PassivationTest.java   | 63 +++++++++++---------
 .../runtime/service/ServiceIdSelectorTest.java  | 10 ++--
 .../structure/TypeToCompositeLookupTest.java    | 21 +++----
 .../zest/library/http/JettyServiceTest.java     |  4 +-
 .../library/jmx/ApplicationManagerService.java  | 22 ++++---
 .../zest/library/osgi/OSGiEnabledService.java   | 19 +++---
 .../internal/service/ServiceLocator.java        | 14 ++---
 .../spring/importer/ZestImportServiceTest.java  | 18 +++---
 .../zest/sample/rental/web/QuikitServlet.java   | 16 ++---
 16 files changed, 154 insertions(+), 182 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/api/src/main/java/org/apache/zest/api/service/ServiceFinder.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/service/ServiceFinder.java b/core/api/src/main/java/org/apache/zest/api/service/ServiceFinder.java
index abc6d86..f4290f9 100644
--- a/core/api/src/main/java/org/apache/zest/api/service/ServiceFinder.java
+++ b/core/api/src/main/java/org/apache/zest/api/service/ServiceFinder.java
@@ -21,6 +21,7 @@
 package org.apache.zest.api.service;
 
 import java.lang.reflect.Type;
+import java.util.stream.Stream;
 
 /**
  * Interface used to query for ServiceReferences.
@@ -74,9 +75,9 @@ public interface ServiceFinder
      *
      * @param serviceType the type that the Services must implement
      *
-     * @return an iterable of ServiceReferences for the given type. It is empty if none exist
+     * @return a stream of ServiceReferences for the given type. It is empty if none exist
      */
-    <T> Iterable<ServiceReference<T>> findServices( Class<T> serviceType );
+    <T> Stream<ServiceReference<T>> findServices( Class<T> serviceType );
 
     /**
      * Find ServiceReferences that implements the given type.
@@ -87,7 +88,7 @@ public interface ServiceFinder
      *
      * @param serviceType the type that the Services must implement
      *
-     * @return an iterable of ServiceReferences for the given type. It is empty if none exist
+     * @return a stream of ServiceReferences for the given type. It is empty if none exist
      */
-    <T> Iterable<ServiceReference<T>> findServices( Type serviceType );
+    <T> Stream<ServiceReference<T>> findServices( Type serviceType );
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceInstanceImporter.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceInstanceImporter.java b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceInstanceImporter.java
index 8f4c37f..01302d0 100644
--- a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceInstanceImporter.java
+++ b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceInstanceImporter.java
@@ -67,21 +67,13 @@ public class ServiceInstanceImporter<T>
     {
         if( service == null )
         {
-            for( ServiceReference<ServiceImporter> reference : finder.findServices( ServiceImporter.class ) )
-            {
-                if( reference.identity().equals( serviceId ) )
-                {
-                    service = reference.get();
-                    break;
-                }
-            }
+            service = finder.findServices( ServiceImporter.class )
+                            .filter( ref -> ref.identity().equals( serviceId ) )
+                            .findFirst().map( ServiceReference::get )
+                            .orElseThrow( () -> new ServiceImporterException(
+                                "No service importer with id '" + serviceId + "' was found" )
+                            );
         }
-
-        if( service == null )
-        {
-            throw new ServiceImporterException( "No service importer with id '" + serviceId + "' was found" );
-        }
-
         return service;
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
index 30ad631..f2d5de6 100644
--- a/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
+++ b/core/api/src/main/java/org/apache/zest/api/service/importer/ServiceSelectorImporter.java
@@ -20,9 +20,8 @@
 
 package org.apache.zest.api.service.importer;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.service.Availability;
 import org.apache.zest.api.service.ImportedServiceDescriptor;
@@ -30,7 +29,6 @@ import org.apache.zest.api.service.ServiceFinder;
 import org.apache.zest.api.service.ServiceImporter;
 import org.apache.zest.api.service.ServiceImporterException;
 import org.apache.zest.api.service.ServiceReference;
-import org.apache.zest.api.service.qualifier.ServiceQualifier;
 
 /**
  * If several services are available with a given type, and you want to constrain
@@ -54,25 +52,19 @@ public final class ServiceSelectorImporter<T>
     {
         Predicate<ServiceReference<?>> selector = serviceDescriptor.metaInfo( Predicate.class );
         Class serviceType = serviceDescriptor.types().findFirst().orElse( null );
-        Iterable<ServiceReference<T>> services = locator.findServices( serviceType );
-        List<ServiceReference<T>> filteredServices = new ArrayList<>();
-        for( ServiceReference<T> service : services )
-        {
-            Predicate selector1 = service.metaInfo( Predicate.class );
-            if( selector1 != null && selector1 == selector )
-            {
-                continue;
-            }
 
-            filteredServices.add( service );
-        }
-        T service = ServiceQualifier.firstService( selector, filteredServices );
-        if( service == null )
+        Stream<ServiceReference<T>> services = locator.findServices( serviceType );
+        Predicate<ServiceReference<T>> filter = ref ->
         {
-            throw new ServiceImporterException( "Could not find any service to import that matches the given specification for " + serviceDescriptor
-                .identity() );
-        }
-        return service;
+            Predicate selector1 = ref.metaInfo( Predicate.class );
+            return selector1 == null || selector == selector1;
+        };
+        return services.filter( filter.and( selector ) )
+                       .findFirst().map( ServiceReference::get )
+                       .orElseThrow(
+                           () -> new ServiceImporterException(
+                               "Could not find any service to import that matches the given specification for "
+                               + serviceDescriptor.identity() ) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/api/src/main/java/org/apache/zest/api/service/qualifier/ServiceQualifier.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/service/qualifier/ServiceQualifier.java b/core/api/src/main/java/org/apache/zest/api/service/qualifier/ServiceQualifier.java
index 1423d66..74f9691 100644
--- a/core/api/src/main/java/org/apache/zest/api/service/qualifier/ServiceQualifier.java
+++ b/core/api/src/main/java/org/apache/zest/api/service/qualifier/ServiceQualifier.java
@@ -48,20 +48,6 @@ import org.apache.zest.api.service.ServiceReference;
  */
 public abstract class ServiceQualifier
 {
-    public static <T> T firstService( Predicate<ServiceReference<?>> qualifier,
-                                      Iterable<ServiceReference<T>> services
-    )
-    {
-        for( ServiceReference<T> service : services )
-        {
-            if( qualifier.test( service ) )
-            {
-                return service.get();
-            }
-        }
-        return null;
-    }
-
     public static Predicate<ServiceReference<?>> withId( final String anId )
     {
         return new Predicate<ServiceReference<?>>()

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java
index 85817d2..69f37ec 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/injection/provider/ServiceInjectionProviderFactory.java
@@ -23,6 +23,7 @@ package org.apache.zest.runtime.injection.provider;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
@@ -31,13 +32,13 @@ import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.api.service.qualifier.Qualifier;
 import org.apache.zest.api.util.Classes;
 import org.apache.zest.bootstrap.InvalidInjectionException;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.runtime.injection.DependencyModel;
 import org.apache.zest.runtime.injection.InjectionContext;
 import org.apache.zest.runtime.injection.InjectionProvider;
 import org.apache.zest.runtime.injection.InjectionProviderFactory;
 import org.apache.zest.runtime.model.Resolution;
 
+import static java.util.stream.Collectors.toCollection;
 import static org.apache.zest.api.util.Annotations.typeHasAnnotation;
 
 public final class ServiceInjectionProviderFactory
@@ -98,9 +99,7 @@ public final class ServiceInjectionProviderFactory
     private static class IterableServiceReferenceProvider
         extends ServiceInjectionProvider
     {
-        private IterableServiceReferenceProvider( Type serviceType,
-                                                  Predicate<ServiceReference<?>> serviceQualifier
-        )
+        private IterableServiceReferenceProvider( Type serviceType, Predicate<ServiceReference<?>> serviceQualifier )
         {
             super( serviceType, serviceQualifier );
         }
@@ -109,7 +108,7 @@ public final class ServiceInjectionProviderFactory
         public synchronized Object provideInjection( InjectionContext context )
             throws InjectionProviderException
         {
-            return getServiceReferences( context );
+            return getServiceReferences( context ).collect( toCollection( ArrayList::new ) );
         }
     }
 
@@ -117,9 +116,7 @@ public final class ServiceInjectionProviderFactory
         extends ServiceInjectionProvider
         implements Function<ServiceReference<?>, Object>
     {
-        private IterableServiceProvider( Type serviceType,
-                                         Predicate<ServiceReference<?>> serviceQualifier
-        )
+        private IterableServiceProvider( Type serviceType, Predicate<ServiceReference<?>> serviceQualifier )
         {
             super( serviceType, serviceQualifier );
         }
@@ -128,7 +125,8 @@ public final class ServiceInjectionProviderFactory
         public synchronized Object provideInjection( final InjectionContext context )
             throws InjectionProviderException
         {
-            return Iterables.map( this, getServiceReferences( context ) );
+            return getServiceReferences( context ).map( ServiceReference::get )
+                                                  .collect( toCollection( ArrayList::new ) );
         }
 
         @Override
@@ -185,9 +183,7 @@ public final class ServiceInjectionProviderFactory
         private final Type serviceType;
         private final Predicate<ServiceReference<?>> serviceQualifier;
 
-        private ServiceInjectionProvider( Type serviceType,
-                                          Predicate<ServiceReference<?>> serviceQualifier
-        )
+        private ServiceInjectionProvider( Type serviceType, Predicate<ServiceReference<?>> serviceQualifier )
         {
             this.serviceType = serviceType;
             this.serviceQualifier = serviceQualifier;
@@ -203,8 +199,8 @@ public final class ServiceInjectionProviderFactory
                 }
                 else
                 {
-                    return Iterables.first( Iterables.filter( serviceQualifier, context.module().instance()
-                        .findServices( serviceType ) ) );
+                    return context.module().instance().findServices( serviceType )
+                                  .filter( serviceQualifier ).findFirst().orElse( null );
                 }
             }
             catch( NoSuchServiceException e )
@@ -213,7 +209,7 @@ public final class ServiceInjectionProviderFactory
             }
         }
 
-        protected Iterable<ServiceReference<Object>> getServiceReferences( final InjectionContext context )
+        protected Stream<ServiceReference<Object>> getServiceReferences( final InjectionContext context )
         {
             if( serviceQualifier == null )
             {
@@ -221,7 +217,7 @@ public final class ServiceInjectionProviderFactory
             }
             else
             {
-                return Iterables.filter( serviceQualifier, context.module().instance().findServices( serviceType ) );
+                return context.module().instance().findServices( serviceType ).filter( serviceQualifier );
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
index 36a2f46..d3461d0 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
@@ -22,14 +22,13 @@ package org.apache.zest.runtime.structure;
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
-import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.zest.api.activation.Activation;
 import org.apache.zest.api.activation.ActivationEventListener;
 import org.apache.zest.api.activation.ActivationException;
@@ -386,26 +385,25 @@ public class ModuleInstance
     }
 
     @Override
-    public <T> Iterable<ServiceReference<T>> findServices( Class<T> serviceType )
+    public <T> Stream<ServiceReference<T>> findServices( final Class<T> serviceType )
     {
         return findServices( (Type) serviceType );
     }
 
     @Override
-    public <T> Iterable<ServiceReference<T>> findServices( Type serviceType )
+    public <T> Stream<ServiceReference<T>> findServices( final Type serviceType )
     {
         List<? extends ModelDescriptor> serviceModels = typeLookup.lookupServiceModels( serviceType );
         if( serviceModels == null )
         {
-            return Collections.emptyList();
+            return Stream.empty();
         }
         //noinspection unchecked
         return serviceModels.stream()
-            .map( this::findServiceReferenceInstance )
-            .filter( Objects::nonNull )
-            .filter( ref -> ref.hasType( serviceType ) )
-            .map( ref -> (ServiceReference<T>) ref )
-            .collect( Collectors.toList() );
+                            .map( this::findServiceReferenceInstance )
+                            .filter( Objects::nonNull )
+                            .filter( ref -> ref.hasType( serviceType ) )
+                            .map( ref -> (ServiceReference<T>) ref );
     }
 
     private <T> ServiceReference<T> findServiceReferenceInstance( ModelDescriptor model )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/test/java/org/apache/zest/runtime/mixin/JDKMixinTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/mixin/JDKMixinTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/mixin/JDKMixinTest.java
index aaa9b33..b57e16e 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/mixin/JDKMixinTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/mixin/JDKMixinTest.java
@@ -25,23 +25,23 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
-import org.apache.zest.api.identity.Identity;
-import org.apache.zest.api.identity.StringIdentity;
-import org.json.JSONObject;
-import org.junit.Before;
-import org.junit.Test;
+import java.util.stream.Collectors;
 import org.apache.zest.api.common.Visibility;
 import org.apache.zest.api.concern.Concerns;
 import org.apache.zest.api.concern.GenericConcern;
+import org.apache.zest.api.identity.Identity;
+import org.apache.zest.api.identity.StringIdentity;
 import org.apache.zest.api.injection.scope.This;
 import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.test.AbstractZestTest;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
 
-import static org.hamcrest.core.IsEqual.*;
-import static org.junit.Assert.*;
-import static org.apache.zest.functional.Iterables.*;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
 
 /**
  * Assert that JDK classes are usable as Mixins.
@@ -138,9 +138,9 @@ public class JDKMixinTest
     @Test
     public void testMixinExtendsJDK()
     {
-        List<ServiceReference<JSONSerializableMap>> services = toList(
-            filter( EXTENDS_IDENTITY_SPEC,
-                    serviceFinder.findServices( JSONSerializableMap.class ) ) );
+        List<ServiceReference<JSONSerializableMap>> services = serviceFinder.findServices( JSONSerializableMap.class )
+                                                                            .filter( EXTENDS_IDENTITY_SPEC )
+                                                                            .collect( Collectors.toList() );
 
         assertThat( services.size(), equalTo( 1 ) );
         assertThat( services.get( 0 ).identity(), equalTo( EXTENDS_IDENTITY ) );
@@ -158,9 +158,9 @@ public class JDKMixinTest
     @Test
     public void testComposeJDKMixin()
     {
-        List<ServiceReference<JSONSerializableMap>> services = toList(
-            filter( COMPOSE_IDENTITY_SPEC,
-                    serviceFinder.findServices( JSONSerializableMap.class ) ) );
+        List<ServiceReference<JSONSerializableMap>> services = serviceFinder.findServices( JSONSerializableMap.class )
+                                                                            .filter( COMPOSE_IDENTITY_SPEC )
+                                                                            .collect( Collectors.toList() );
 
         assertThat( services.size(), equalTo( 1 ) );
         assertThat( services.get( 0 ).identity(), equalTo( COMPOSE_IDENTITY ) );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/test/java/org/apache/zest/runtime/service/PassivationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/service/PassivationTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/service/PassivationTest.java
index 71b0319..04cdf91 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/service/PassivationTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/service/PassivationTest.java
@@ -52,13 +52,14 @@ public class PassivationTest
             }
         };
 
-        Iterable<ServiceReference<DataAccess>> iterable = assembly.module().findServices( DataAccess.class );
-        for( ServiceReference<DataAccess> service : iterable )
-        {
-            assertTrue( "Service should not be Active before accessed", !service.isActive() );
-            assertTrue( service.get().data().activated );
-            assertTrue( "Service should be Active after access.", service.isActive() );
-        }
+        assembly.module().findServices( DataAccess.class ).forEach(
+            service ->
+            {
+                assertTrue( "Service should not be Active before accessed", !service.isActive() );
+                assertTrue( service.get().data().activated );
+                assertTrue( "Service should be Active after access.", service.isActive() );
+            }
+        );
         assembly.application().passivate();
     }
 
@@ -89,19 +90,20 @@ public class PassivationTest
 
         ArrayList<Data> datas = new ArrayList<Data>();
 
-        Iterable<ServiceReference<DataAccess>> iterable = assembly.module().findServices( DataAccess.class );
-        for( ServiceReference<DataAccess> service : iterable )
-        {
-            assertTrue( "Service should not be Active before accessed", !service.isActive() );
-            Data data = service.get().data();
-            if( DataAccessService.class.isInstance( service.get() ) )
+        assembly.module().findServices( DataAccess.class ).forEach(
+            service ->
             {
-                // Collect the expected successes.
-                datas.add( data );
+                assertTrue( "Service should not be Active before accessed", !service.isActive() );
+                Data data = service.get().data();
+                if( DataAccessService.class.isInstance( service.get() ) )
+                {
+                    // Collect the expected successes.
+                    datas.add( data );
+                }
+                assertTrue( "Data should indicate that the service is activated", data.activated );
+                assertTrue( "Service should be Active after access.", service.isActive() );
             }
-            assertTrue( "Data should indicate that the service is activated", data.activated );
-            assertTrue( "Service should be Active after access.", service.isActive() );
-        }
+        );
         try
         {
             assembly.application().passivate();
@@ -113,10 +115,12 @@ public class PassivationTest
         }
 
         // Still ensure that all services have been shutdown.
-        for( ServiceReference<DataAccess> service : iterable )
-        {
-            assertFalse( "All services should have been shutdown", service.isActive() );
-        }
+        assembly.module().findServices( DataAccess.class ).forEach(
+            service ->
+            {
+                assertFalse( "All services should have been shutdown", service.isActive() );
+            }
+        );
     }
 
     @Test(expected = PassivationException.class)
@@ -133,13 +137,14 @@ public class PassivationTest
             }
         };
 
-        Iterable<ServiceReference<DataAccess>> iterable = assembly.module().findServices( DataAccess.class );
-        for( ServiceReference<DataAccess> service : iterable )
-        {
-            assertTrue( "Service should not be Active before accessed", !service.isActive() );
-            assertTrue( service.get().data().activated );
-            assertTrue( "Service should be Active after access.", service.isActive() );
-        }
+        assembly.module().findServices( DataAccess.class ).forEach(
+            service ->
+            {
+                assertTrue( "Service should not be Active before accessed", !service.isActive() );
+                assertTrue( service.get().data().activated );
+                assertTrue( "Service should be Active after access.", service.isActive() );
+            }
+        );
         assembly.application().passivate();
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/test/java/org/apache/zest/runtime/service/ServiceIdSelectorTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/service/ServiceIdSelectorTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/service/ServiceIdSelectorTest.java
index 60e75d9..6f8c253 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/service/ServiceIdSelectorTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/service/ServiceIdSelectorTest.java
@@ -20,7 +20,7 @@
 
 package org.apache.zest.runtime.service;
 
-import org.junit.Test;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.activation.ActivationException;
 import org.apache.zest.api.injection.scope.Service;
 import org.apache.zest.api.injection.scope.Uses;
@@ -31,11 +31,11 @@ import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.bootstrap.SingletonAssembler;
+import org.junit.Test;
 
+import static org.apache.zest.api.service.qualifier.ServiceQualifier.withId;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertThat;
-import static org.apache.zest.api.service.qualifier.ServiceQualifier.firstService;
-import static org.apache.zest.api.service.qualifier.ServiceQualifier.withId;
 
 /**
  * JAVADOC
@@ -70,7 +70,9 @@ public class ServiceIdSelectorTest
 
         public ServiceConsumer( @Uses String serviceId, @Service Iterable<ServiceReference<TestService>> serviceRefs )
         {
-            service = firstService( withId( serviceId ), serviceRefs );
+            service = StreamSupport.stream( serviceRefs.spliterator(), false )
+                                   .filter( withId( serviceId ) )
+                                   .findFirst().map( ServiceReference::get ).orElse( null );
         }
 
         public TestService getService()

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/core/runtime/src/test/java/org/apache/zest/runtime/structure/TypeToCompositeLookupTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/structure/TypeToCompositeLookupTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/structure/TypeToCompositeLookupTest.java
index f7da054..cf0a36f 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/structure/TypeToCompositeLookupTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/structure/TypeToCompositeLookupTest.java
@@ -20,25 +20,26 @@
 package org.apache.zest.runtime.structure;
 
 import java.util.Iterator;
-import org.apache.zest.api.identity.HasIdentity;
-import org.apache.zest.api.identity.Identity;
-import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
-import org.apache.zest.bootstrap.unitofwork.DefaultUnitOfWorkAssembler;
-import org.junit.Test;
 import org.apache.zest.api.activation.ActivationException;
 import org.apache.zest.api.composite.AmbiguousTypeException;
+import org.apache.zest.api.identity.HasIdentity;
+import org.apache.zest.api.identity.Identity;
 import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.api.structure.Module;
 import org.apache.zest.api.unitofwork.UnitOfWork;
 import org.apache.zest.api.unitofwork.UnitOfWorkCompletionException;
+import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.bootstrap.SingletonAssembler;
-import org.apache.zest.functional.Iterables;
+import org.apache.zest.bootstrap.unitofwork.DefaultUnitOfWorkAssembler;
 import org.apache.zest.test.EntityTestAssembler;
+import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
 
 /**
  * Theses tests ensure that Type to Composite lookup work as expected for
@@ -379,9 +380,9 @@ public class TypeToCompositeLookupTest
 
         }.module();
 
-        assertEquals( 1, Iterables.count( module.findServices( SomeOtherFoo.class ) ) );
-        assertEquals( 2, Iterables.count( module.findServices( BasicFoo.class ) ) );
-        assertEquals( 2, Iterables.count( module.findServices( Foo.class ) ) );
+        assertEquals( 1, module.findServices( SomeOtherFoo.class ).count() );
+        assertEquals( 2, module.findServices( BasicFoo.class ).count() );
+        assertEquals( 2, module.findServices( Foo.class ).count() );
 
         assertEquals( CATHEDRAL, module.findService( SomeOtherFoo.class ).get().bar() );
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/libraries/http/src/test/java/org/apache/zest/library/http/JettyServiceTest.java
----------------------------------------------------------------------
diff --git a/libraries/http/src/test/java/org/apache/zest/library/http/JettyServiceTest.java b/libraries/http/src/test/java/org/apache/zest/library/http/JettyServiceTest.java
index 54f2135..9ef83b2 100644
--- a/libraries/http/src/test/java/org/apache/zest/library/http/JettyServiceTest.java
+++ b/libraries/http/src/test/java/org/apache/zest/library/http/JettyServiceTest.java
@@ -20,6 +20,7 @@
 package org.apache.zest.library.http;
 
 import java.util.Iterator;
+import java.util.stream.Collectors;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.zest.test.util.FreePortFinder;
 import org.junit.Test;
@@ -71,7 +72,8 @@ public final class JettyServiceTest
     public final void testInstantiation()
         throws Throwable
     {
-        Iterable<ServiceReference<JettyService>> services = serviceFinder.findServices( JettyService.class );
+        Iterable<ServiceReference<JettyService>> services = serviceFinder.findServices( JettyService.class )
+                                                                         .collect( Collectors.toList() );
         assertNotNull( services );
 
         Iterator<ServiceReference<JettyService>> iterator = services.iterator();

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/libraries/jmx/src/main/java/org/apache/zest/library/jmx/ApplicationManagerService.java
----------------------------------------------------------------------
diff --git a/libraries/jmx/src/main/java/org/apache/zest/library/jmx/ApplicationManagerService.java b/libraries/jmx/src/main/java/org/apache/zest/library/jmx/ApplicationManagerService.java
index bd49b92..137b428 100644
--- a/libraries/jmx/src/main/java/org/apache/zest/library/jmx/ApplicationManagerService.java
+++ b/libraries/jmx/src/main/java/org/apache/zest/library/jmx/ApplicationManagerService.java
@@ -48,8 +48,6 @@ import org.apache.zest.api.structure.ModuleDescriptor;
 import org.apache.zest.functional.HierarchicalVisitorAdapter;
 
 import static org.apache.zest.api.service.qualifier.ServiceQualifier.withId;
-import static org.apache.zest.functional.Iterables.filter;
-import static org.apache.zest.functional.Iterables.first;
 
 /**
  * Expose the Zest app as a "tree" of MBeans.
@@ -310,27 +308,27 @@ public interface ApplicationManagerService
         public boolean isActive()
         {
             Class<?> mainType = serviceDescriptor.types().findFirst().orElse( null );
-            ServiceReference<?> first = first( filter( withId( serviceDescriptor.identity().toString() ),
-                                                       module.findServices( mainType ) )
-            );
+            ServiceReference<?> first = module.findServices( mainType )
+                                              .filter( withId( serviceDescriptor.identity().toString() ) )
+                                              .findFirst().orElse( null );
             return first != null && first.isActive();
         }
 
         public boolean isAvailable()
         {
             Class<?> mainType = serviceDescriptor.types().findFirst().orElse( null );
-            ServiceReference<?> first = first( filter( withId( serviceDescriptor.identity().toString() ),
-                                                       module.findServices( mainType ) )
-            );
+            ServiceReference<?> first = module.findServices( mainType )
+                                              .filter( withId( serviceDescriptor.identity().toString() ) )
+                                              .findFirst().orElse( null );
             return first != null && first.isAvailable();
         }
 
         public String restart()
         {
-            Iterable<?> services = module.findServices( serviceDescriptor.types().findFirst().orElse( null ) );
-            ServiceReference<?> serviceRef = (ServiceReference) first( filter( withId( serviceDescriptor.identity().toString() ),
-                                                                               services )
-            );
+            ServiceReference<?> serviceRef = module.findServices( serviceDescriptor.types()
+                                                                                   .findFirst().orElse( null ) )
+                                                   .filter( withId( serviceDescriptor.identity().toString() ) )
+                                                   .findFirst().orElse( null );
             if( serviceRef != null )
             {
                 try

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/libraries/osgi/src/main/java/org/apache/zest/library/osgi/OSGiEnabledService.java
----------------------------------------------------------------------
diff --git a/libraries/osgi/src/main/java/org/apache/zest/library/osgi/OSGiEnabledService.java b/libraries/osgi/src/main/java/org/apache/zest/library/osgi/OSGiEnabledService.java
index 8a3d6c7..b0a2a55 100644
--- a/libraries/osgi/src/main/java/org/apache/zest/library/osgi/OSGiEnabledService.java
+++ b/libraries/osgi/src/main/java/org/apache/zest/library/osgi/OSGiEnabledService.java
@@ -90,16 +90,17 @@ public interface OSGiEnabledService extends ServiceComposite
             {
                 return;
             }
-            for( ServiceReference ref : module.findServices( descriptor.types().findFirst().orElse( null ) ) )
-            {
-                if( ref.identity().equals( identity().get() ) )
-                {
-                    Stream<? extends Type> classesSet = descriptor.types();
-                    Dictionary properties = descriptor.metaInfo( Dictionary.class );
-                    String[] clazzes = fetchInterfacesImplemented( classesSet );
-                    registration = context.registerService( clazzes, ref.get(), properties );
+            module.findServices( descriptor.types().findFirst().orElse( null ) ).forEach(
+                ref -> {
+                    if( ref.identity().equals( identity().get() ) )
+                    {
+                        Stream<? extends Type> classesSet = descriptor.types();
+                        Dictionary properties = descriptor.metaInfo( Dictionary.class );
+                        String[] clazzes = fetchInterfacesImplemented( classesSet );
+                        registration = context.registerService( clazzes, ref.get(), properties );
+                    }
                 }
-            }
+            );
         }
 
         private String[] fetchInterfacesImplemented( Stream<? extends Type> classesSet )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/libraries/spring/src/main/java/org/apache/zest/library/spring/bootstrap/internal/service/ServiceLocator.java
----------------------------------------------------------------------
diff --git a/libraries/spring/src/main/java/org/apache/zest/library/spring/bootstrap/internal/service/ServiceLocator.java b/libraries/spring/src/main/java/org/apache/zest/library/spring/bootstrap/internal/service/ServiceLocator.java
index 7bb8d6c..885b515 100644
--- a/libraries/spring/src/main/java/org/apache/zest/library/spring/bootstrap/internal/service/ServiceLocator.java
+++ b/libraries/spring/src/main/java/org/apache/zest/library/spring/bootstrap/internal/service/ServiceLocator.java
@@ -34,7 +34,7 @@ final class ServiceLocator
     implements HierarchicalVisitor<Object, Object, RuntimeException>
 {
     private final String serviceId;
-    private Class serviceType;
+    private Class<?> serviceType;
     private String moduleName;
     private String layerName;
 
@@ -115,16 +115,10 @@ final class ServiceLocator
         if( layerName != null )
         {
             Module module = anApplication.findModule( layerName, moduleName );
-            Iterable<ServiceReference<Object>> serviceRefs = module.findServices( serviceType );
-            for( ServiceReference<Object> serviceRef : serviceRefs )
-            {
-                if( serviceId.equals( serviceRef.identity().toString() ) )
-                {
-                    return serviceRef;
-                }
-            }
+            return module.findServices( serviceType )
+                         .filter( ref -> ref.identity().toString().equals( serviceId ) )
+                         .findFirst().orElse( null );
         }
-
         return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/libraries/spring/src/test/java/org/apache/zest/library/spring/importer/ZestImportServiceTest.java
----------------------------------------------------------------------
diff --git a/libraries/spring/src/test/java/org/apache/zest/library/spring/importer/ZestImportServiceTest.java b/libraries/spring/src/test/java/org/apache/zest/library/spring/importer/ZestImportServiceTest.java
index 04fff95..a68ec3a 100644
--- a/libraries/spring/src/test/java/org/apache/zest/library/spring/importer/ZestImportServiceTest.java
+++ b/libraries/spring/src/test/java/org/apache/zest/library/spring/importer/ZestImportServiceTest.java
@@ -19,26 +19,25 @@
  */
 package org.apache.zest.library.spring.importer;
 
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.activation.ActivationException;
 import org.apache.zest.api.injection.scope.Service;
 import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.service.ServiceFinder;
 import org.apache.zest.api.service.ServiceReference;
-import org.apache.zest.api.service.qualifier.ServiceQualifier;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
 import org.apache.zest.bootstrap.SingletonAssembler;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import static org.apache.zest.api.service.qualifier.ServiceQualifier.withId;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertThat;
-import static org.apache.zest.api.service.qualifier.ServiceQualifier.firstService;
-import static org.apache.zest.api.service.qualifier.ServiceQualifier.withId;
 
 @RunWith( SpringJUnit4ClassRunner.class )
 @ContextConfiguration
@@ -86,7 +85,9 @@ public final class ZestImportServiceTest
 
         assembler.module().injectTo(this);
 
-        CommentService service = firstService( withId( "commentService2" ), services );
+        CommentService service = StreamSupport.stream( services.spliterator(), false )
+                                              .filter( withId( "commentService2" ) )
+                                              .findFirst().map( ServiceReference::get ).orElse( null );
         assertThat( "service with correct id has been selected", service.comment( "pizza" ), equalTo( "pizza is good." ) );
     }
 
@@ -108,7 +109,10 @@ public final class ZestImportServiceTest
 
         assembler.module().injectTo( this );
 
-        CommentService foundService = ServiceQualifier.firstService( withId( "commentService2" ), finder.<CommentService>findServices( CommentService.class ));
+        CommentService foundService = finder.findServices( CommentService.class )
+                                            .filter( withId( "commentService2" ) )
+                                            .findFirst().map( ServiceReference::get )
+                                            .orElse( null );
         assertThat( "service with correct id has been selected", foundService.comment( "pizza" ), equalTo( "pizza is good." ) );
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-java/blob/f8cd4f58/samples/rental/src/main/java/org/apache/zest/sample/rental/web/QuikitServlet.java
----------------------------------------------------------------------
diff --git a/samples/rental/src/main/java/org/apache/zest/sample/rental/web/QuikitServlet.java b/samples/rental/src/main/java/org/apache/zest/sample/rental/web/QuikitServlet.java
index 338f335..b7529e8 100644
--- a/samples/rental/src/main/java/org/apache/zest/sample/rental/web/QuikitServlet.java
+++ b/samples/rental/src/main/java/org/apache/zest/sample/rental/web/QuikitServlet.java
@@ -49,7 +49,6 @@ import javax.xml.validation.SchemaFactory;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.service.ServiceFinder;
-import org.apache.zest.api.service.ServiceReference;
 import org.apache.zest.api.structure.Application;
 import org.apache.zest.api.structure.Module;
 import org.apache.zest.bootstrap.ApplicationAssembler;
@@ -98,13 +97,14 @@ public class QuikitServlet
                 DataInitializer initializer = module.newTransient( DataInitializer.class );
                 initializer.initialize();
             }
-            Iterable<ServiceReference<Page>> iterable = finder.findServices( Page.class );
-            for( ServiceReference<Page> page : iterable )
-            {
-                PageMetaInfo pageMetaInfo = page.metaInfo( PageMetaInfo.class );
-                String mountPoint = pageMetaInfo.mountPoint();
-                mountPoints.put( mountPoint, page.get() );
-            }
+            finder.findServices( Page.class ).forEach(
+                page ->
+                {
+                    PageMetaInfo pageMetaInfo = page.metaInfo( PageMetaInfo.class );
+                    String mountPoint = pageMetaInfo.mountPoint();
+                    mountPoints.put( mountPoint, page.get() );
+                }
+            );
         }
         catch( Exception e )
         {


[07/13] zest-java git commit: spi: EntityFinder returns Stream

Posted by pa...@apache.org.
spi: EntityFinder returns Stream<EntityReference>


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/2d485e3a
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/2d485e3a
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/2d485e3a

Branch: refs/heads/develop
Commit: 2d485e3ae18dd1e9cac351d780d8b61bc29e03df
Parents: 47cbc7b
Author: Paul Merlin <pa...@apache.org>
Authored: Thu Dec 8 10:32:53 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Thu Dec 8 10:32:53 2016 +0100

----------------------------------------------------------------------
 .../java/org/apache/zest/api/query/Query.java   |   6 +
 .../org/apache/zest/functional/Iterables.java   |  60 ---------
 .../apache/zest/functional/IterablesTest.java   |   9 --
 .../zest/runtime/query/IterableQuerySource.java |  23 ++--
 .../apache/zest/runtime/query/QueryImpl.java    |  24 ++--
 .../runtime/unitofwork/ModuleUnitOfWork.java    |  84 ++++--------
 .../org/apache/zest/spi/query/EntityFinder.java |  17 +--
 .../org/apache/zest/spi/query/QuerySource.java  |  19 +--
 .../test/indexing/AbstractEntityFinderTest.java | 127 +++++++++----------
 .../elasticsearch/ElasticSearchFinder.java      |  30 ++---
 .../zest/index/rdf/query/RdfQueryParser.java    |   3 +-
 .../zest/index/rdf/query/RdfQueryService.java   |  22 ++--
 .../rdf/query/internal/RdfQueryParserImpl.java  |   7 +-
 .../solr/internal/SolrEntityQueryMixin.java     |  25 ++--
 .../index/sql/internal/SQLEntityFinder.java     |  26 ++--
 .../zest/index/sql/support/api/SQLQuerying.java |   2 +-
 .../support/postgresql/PostgreSQLQuerying.java  |   2 +-
 .../support/skeletons/AbstractSQLQuerying.java  |  16 +--
 .../library/rest/admin/EntitiesResource.java    |  50 ++++----
 19 files changed, 226 insertions(+), 326 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/api/src/main/java/org/apache/zest/api/query/Query.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/Query.java b/core/api/src/main/java/org/apache/zest/api/query/Query.java
index a64dd03..4e985b8 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/Query.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/Query.java
@@ -20,6 +20,7 @@
 package org.apache.zest.api.query;
 
 import java.io.Serializable;
+import java.util.stream.Stream;
 import org.apache.zest.api.property.Property;
 import org.apache.zest.api.query.grammar.OrderBy;
 
@@ -134,4 +135,9 @@ public interface Query<T>
      */
     long count()
         throws QueryExecutionException;
+
+    /**
+     * @return Stream results
+     */
+    Stream<T> stream();
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
index ae1d66c..46c26a3 100644
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
@@ -19,7 +19,6 @@
  */
 package org.apache.zest.functional;
 
-import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -122,70 +121,11 @@ public final class Iterables
         };
     }
 
-    public static <T> Iterable<T> append( final T item, final Iterable<T> iterable )
-    {
-        return new Iterable<T>()
-        {
-            @Override
-            public Iterator<T> iterator()
-            {
-                final Iterator<T> iterator = iterable.iterator();
-
-                return new Iterator<T>()
-                {
-                    T last = item;
-
-                    @Override
-                    public boolean hasNext()
-                    {
-                        return iterator.hasNext() || last != null;
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        if( iterator.hasNext() )
-                        {
-                            return iterator.next();
-                        }
-                        else
-                        {
-                            try
-                            {
-                                return last;
-                            }
-                            finally
-                            {
-                                last = null;
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                    }
-                };
-            }
-        };
-    }
-
     public static <T> List<T> toList( Iterable<T> iterable )
     {
         return addAll( new ArrayList<>(), iterable );
     }
 
-    @SuppressWarnings( "unchecked" )
-    public static <T> T[] toArray( Class<T> componentType, Iterable<T> iterable )
-    {
-        if( iterable == null )
-        {
-            return null;
-        }
-        List<T> list = toList( iterable );
-        return list.toArray( (T[]) Array.newInstance( componentType, list.size() ) );
-    }
-
     private static class MapIterable<FROM, TO>
         implements Iterable<TO>
     {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
index 063d067..ffa7d88 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
@@ -25,9 +25,7 @@ import java.util.List;
 import java.util.function.Function;
 import org.junit.Test;
 
-import static java.util.Collections.emptyList;
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
 /**
@@ -53,13 +51,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testAppend()
-    {
-        assertThat( Iterables.toList( Iterables.append( "C", Iterables.iterable( "A", "B" ) ) ).toString(),
-                    equalTo( "[A, B, C]" ) );
-    }
-
-    @Test
     public void testMap()
     {
         assertThat( Iterables.toList( Iterables.map( new Function<String, String>()

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/runtime/src/main/java/org/apache/zest/runtime/query/IterableQuerySource.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/query/IterableQuerySource.java b/core/runtime/src/main/java/org/apache/zest/runtime/query/IterableQuerySource.java
index c619f18..3d0020d 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/query/IterableQuerySource.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/query/IterableQuerySource.java
@@ -22,7 +22,6 @@ package org.apache.zest.runtime.query;
 
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
@@ -58,24 +57,20 @@ public class IterableQuerySource
     @Override
     public <T> T find( Class<T> resultType,
                        Predicate<Composite> whereClause,
-                       Iterable<OrderBy> orderBySegments,
+                       List<OrderBy> orderBySegments,
                        Integer firstResult,
                        Integer maxResults,
                        Map<String, Object> variables
     )
     {
-        final Iterator<T> iterator = iterator( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
-        if( iterator.hasNext() )
-        {
-            return iterator.next();
-        }
-        return null;
+        return stream( resultType, whereClause, orderBySegments, firstResult, maxResults, variables )
+            .findFirst().orElse( null );
     }
 
     @Override
     public <T> long count( Class<T> resultType,
                            Predicate<Composite> whereClause,
-                           Iterable<OrderBy> orderBySegments,
+                           List<OrderBy> orderBySegments,
                            Integer firstResult,
                            Integer maxResults,
                            Map<String, Object> variables
@@ -85,21 +80,21 @@ public class IterableQuerySource
     }
 
     @Override
-    public <T> Iterator<T> iterator( Class<T> resultType,
+    public <T> Stream<T> stream( Class<T> resultType,
                                      Predicate<Composite> whereClause,
-                                     Iterable<OrderBy> orderBySegments,
+                                     List<OrderBy> orderBySegments,
                                      Integer firstResult,
                                      Integer maxResults,
                                      Map<String, Object> variables
     )
     {
-        return list( resultType, whereClause, orderBySegments, firstResult, maxResults, variables ).iterator();
+        return list( resultType, whereClause, orderBySegments, firstResult, maxResults, variables ).stream();
     }
 
     @SuppressWarnings( {"raw", "unchecked"} )
     private <T> List<T> list( Class<T> resultType,
                               Predicate<Composite> whereClause,
-                              Iterable<OrderBy> orderBySegments,
+                              List<OrderBy> orderBySegments,
                               Integer firstResult,
                               Integer maxResults,
                               Map<String, Object> variables
@@ -112,7 +107,7 @@ public class IterableQuerySource
         if( orderBySegments != null )
         {
             // Sort it
-            Collections.sort( list, new OrderByComparator( orderBySegments ) );
+            list.sort( new OrderByComparator( orderBySegments ) );
         }
 
         // Cut results

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/runtime/src/main/java/org/apache/zest/runtime/query/QueryImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/query/QueryImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/query/QueryImpl.java
index cd65f49..4846dae 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/query/QueryImpl.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/query/QueryImpl.java
@@ -19,17 +19,20 @@
  */
 package org.apache.zest.runtime.query;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.property.Property;
 import org.apache.zest.api.query.Query;
 import org.apache.zest.api.query.QueryExecutionException;
 import org.apache.zest.api.query.QueryExpressions;
 import org.apache.zest.api.query.grammar.OrderBy;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.spi.query.QuerySource;
 
 /**
@@ -52,7 +55,7 @@ import org.apache.zest.spi.query.QuerySource;
     /**
      * Order by clause segments.
      */
-    private Iterable<OrderBy> orderBySegments;
+    private List<OrderBy> orderBySegments;
     /**
      * First result to be returned.
      */
@@ -88,7 +91,7 @@ import org.apache.zest.spi.query.QuerySource;
     @Override
     public Query<T> orderBy( final OrderBy... segments )
     {
-        orderBySegments = Iterables.iterable( segments );
+        orderBySegments = Arrays.asList( segments );
         return this;
     }
 
@@ -100,12 +103,9 @@ import org.apache.zest.spi.query.QuerySource;
     {
         if( orderBySegments == null )
         {
-            orderBySegments = Iterables.iterable( new OrderBy( QueryExpressions.property( property ), order ) );
-        }
-        else
-        {
-            orderBySegments = Iterables.append( new OrderBy( QueryExpressions.property( property ), order ), orderBySegments );
+            orderBySegments = new ArrayList<>();
         }
+        orderBySegments.add( new OrderBy( QueryExpressions.property( property ), order ) );
         return this;
     }
 
@@ -195,7 +195,13 @@ import org.apache.zest.spi.query.QuerySource;
     @Override
     public Iterator<T> iterator()
     {
-        return querySource.iterator( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
+        return stream().iterator();
+    }
+
+    @Override
+    public Stream<T> stream()
+    {
+        return querySource.stream( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
index 0d1e3bb..4f22d69 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
@@ -23,13 +23,13 @@ package org.apache.zest.runtime.unitofwork;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.AssociationStateHolder;
@@ -68,7 +68,6 @@ import org.apache.zest.api.usecase.Usecase;
 import org.apache.zest.api.util.NullArgumentException;
 import org.apache.zest.api.value.ValueBuilder;
 import org.apache.zest.api.value.ValueComposite;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.runtime.association.AssociationInstance;
 import org.apache.zest.runtime.association.ManyAssociationInstance;
 import org.apache.zest.runtime.association.NamedAssociationInstance;
@@ -529,7 +528,7 @@ public class ModuleUnitOfWork
         @Override
         public <T> T find( Class<T> resultType,
                            Predicate<Composite> whereClause,
-                           Iterable<OrderBy> orderBySegments,
+                           List<OrderBy> orderBySegments,
                            Integer firstResult,
                            Integer maxResults,
                            Map<String, Object> variables
@@ -566,7 +565,7 @@ public class ModuleUnitOfWork
         @Override
         public <T> long count( Class<T> resultType,
                                Predicate<Composite> whereClause,
-                               Iterable<OrderBy> orderBySegments,
+                               List<OrderBy> orderBySegments,
                                Integer firstResult,
                                Integer maxResults,
                                Map<String, Object> variables
@@ -586,69 +585,42 @@ public class ModuleUnitOfWork
         }
 
         @Override
-        public <T> Iterator<T> iterator( final Class<T> resultType,
-                                         Predicate<Composite> whereClause,
-                                         Iterable<OrderBy> orderBySegments,
-                                         Integer firstResult,
-                                         Integer maxResults,
-                                         Map<String, Object> variables
-        )
+        public <T> Stream<T> stream( Class<T> resultType,
+                                     Predicate<Composite> whereClause,
+                                     List<OrderBy> orderBySegments,
+                                     Integer firstResult,
+                                     Integer maxResults,
+                                     Map<String, Object> variables )
         {
             EntityFinder entityFinder = moduleUnitOfWork.module().instance().findService( EntityFinder.class ).get();
 
             try
             {
-                final Iterator<EntityReference> foundEntities =
-                    entityFinder.findEntities(
-                        resultType,
-                        whereClause,
-                        Iterables.toArray( OrderBy.class, orderBySegments ),
-                        firstResult,
-                        maxResults,
-                        variables == null ? Collections.emptyMap() : variables
-                    ).iterator();
-
-                return new Iterator<T>()
-                {
-                    @Override
-                    public boolean hasNext()
-                    {
-                        return foundEntities.hasNext();
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        final EntityReference foundEntity = foundEntities.next();
-                        try
-                        {
-                            return moduleUnitOfWork.get( resultType, foundEntity.identity() );
-                        }
-                        catch( NoSuchEntityException e )
-                        {
-                            // Index is out of sync - entity has been removed
-                            return null;
-                        }
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                        throw new UnsupportedOperationException();
-                    }
-                };
+                return entityFinder.findEntities(
+                    resultType,
+                    whereClause,
+                    orderBySegments,
+                    firstResult,
+                    maxResults,
+                    variables == null ? Collections.emptyMap() : variables
+                ).map( ref ->
+                       {
+                           try
+                           {
+                               return moduleUnitOfWork.get( resultType, ref.identity() );
+                           }
+                           catch( NoSuchEntityException e )
+                           {
+                               // Index is out of sync - entity has been removed
+                               return null;
+                           }
+                       } );
             }
             catch( EntityFinderException e )
             {
                 throw new QueryExecutionException( "Query '" + toString() + "' could not be executed", e );
             }
         }
-
-        @Override
-        public String toString()
-        {
-            return "UnitOfWork( " + moduleUnitOfWork.usecase().name() + " )";
-        }
     }
 
     private class ToValuePropertyMappingFunction

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/spi/src/main/java/org/apache/zest/spi/query/EntityFinder.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/query/EntityFinder.java b/core/spi/src/main/java/org/apache/zest/spi/query/EntityFinder.java
index c0be61b..ebe828f 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/query/EntityFinder.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/query/EntityFinder.java
@@ -19,8 +19,10 @@
  */
 package org.apache.zest.spi.query;
 
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import org.apache.zest.api.common.Optional;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.entity.EntityReference;
@@ -40,16 +42,15 @@ public interface EntityFinder
      * @param firstResult       Index of the first returned entity.
      * @param maxResults        Maximum returned entities.
      * @param variables         Query variables
-     * @return Single entity matching the query criterion.
+     * @return Entities matching the query criterion.
      * @throws EntityFinderException on error
      */
-    Iterable<EntityReference> findEntities( Class<?> resultType,
-                                            @Optional Predicate<Composite> whereClause,
-                                            @Optional OrderBy[] orderBySegments,
-                                            @Optional Integer firstResult,
-                                            @Optional Integer maxResults,
-                                            Map<String, Object> variables
-    )
+    Stream<EntityReference> findEntities( Class<?> resultType,
+                                          @Optional Predicate<Composite> whereClause,
+                                          @Optional List<OrderBy> orderBySegments,
+                                          @Optional Integer firstResult,
+                                          @Optional Integer maxResults,
+                                          Map<String, Object> variables )
         throws EntityFinderException;
 
     /**

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/spi/src/main/java/org/apache/zest/spi/query/QuerySource.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/query/QuerySource.java b/core/spi/src/main/java/org/apache/zest/spi/query/QuerySource.java
index e6bd4b9..8ead1b4 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/query/QuerySource.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/query/QuerySource.java
@@ -19,9 +19,10 @@
  */
 package org.apache.zest.spi.query;
 
-import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.query.grammar.OrderBy;
 
@@ -32,7 +33,7 @@ public interface QuerySource
 {
     <T> T find( Class<T> resultType,
                 Predicate<Composite> whereClause,
-                Iterable<OrderBy> orderBySegments,
+                List<OrderBy> orderBySegments,
                 Integer firstResult,
                 Integer maxResults,
                 Map<String, Object> variables
@@ -40,17 +41,17 @@ public interface QuerySource
 
     <T> long count( Class<T> resultType,
                     Predicate<Composite> whereClause,
-                    Iterable<OrderBy> orderBySegments,
+                    List<OrderBy> orderBySegments,
                     Integer firstResult,
                     Integer maxResults,
                     Map<String, Object> variables
     );
 
-    <T> Iterator<T> iterator( Class<T> resultType,
-                              Predicate<Composite> whereClause,
-                              Iterable<OrderBy> orderBySegments,
-                              Integer firstResult,
-                              Integer maxResults,
-                              Map<String, Object> variables
+    <T> Stream<T> stream( Class<T> resultType,
+                          Predicate<Composite> whereClause,
+                          List<OrderBy> orderBySegments,
+                          Integer firstResult,
+                          Integer maxResults,
+                          Map<String, Object> variables
     );
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/core/testsupport/src/main/java/org/apache/zest/test/indexing/AbstractEntityFinderTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/zest/test/indexing/AbstractEntityFinderTest.java b/core/testsupport/src/main/java/org/apache/zest/test/indexing/AbstractEntityFinderTest.java
index a7af4c3..2fae4d5 100644
--- a/core/testsupport/src/main/java/org/apache/zest/test/indexing/AbstractEntityFinderTest.java
+++ b/core/testsupport/src/main/java/org/apache/zest/test/indexing/AbstractEntityFinderTest.java
@@ -27,7 +27,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
-import java.util.stream.StreamSupport;
+import java.util.stream.Stream;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Structure;
@@ -70,6 +70,7 @@ public abstract class AbstractEntityFinderTest
     private static final Predicate<Composite> ALL = null;
 
     private static final OrderBy[] NO_SORTING = null;
+    private static final List<OrderBy> NO_SORTING2 = null;
 
     private static final Integer NO_FIRST_RESULT = null;
 
@@ -115,9 +116,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             ALL,
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE, JACK, ANN );
     }
 
@@ -129,9 +130,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Domain.class,
             eq( nameable.name(), "Gaming" ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, "Gaming" );
     }
 
@@ -142,9 +143,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Nameable.class,
             ALL,
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, NameableAssert.allNames() );
     }
 
@@ -156,9 +157,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             eq( person.placeOfBirth().get().name(), "Kuala Lumpur" ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE, ANN );
     }
 
@@ -170,9 +171,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             eq( person.mother().get().placeOfBirth().get().name(), "Kuala Lumpur" ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE );
     }
 
@@ -184,9 +185,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             ge( person.yearOfBirth(), 1973 ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE, ANN );
     }
 
@@ -199,9 +200,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Nameable.class,
             and( ge( person.yearOfBirth(), 1900 ), eq( person.placeOfBirth().get().name(), "Penang" ) ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JACK );
     }
 
@@ -214,9 +215,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             or( eq( person.yearOfBirth(), 1970 ), eq( person.yearOfBirth(), 1975 ) ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JACK, ANN );
     }
 
@@ -229,9 +230,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Female.class,
             or( eq( person.yearOfBirth(), 1970 ), eq( person.yearOfBirth(), 1975 ) ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, ANN );
     }
 
@@ -243,9 +244,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             not( eq( person.yearOfBirth(), 1975 ) ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE, JACK );
     }
 
@@ -257,9 +258,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             isNotNull( person.email() ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE );
     }
 
@@ -271,9 +272,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             isNull( person.email() ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, ANN, JACK );
     }
 
@@ -285,9 +286,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             isNotNull( person.wife() ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JACK );
     }
 
@@ -299,9 +300,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Male.class,
             isNull( person.wife() ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JOE );
     }
 
@@ -313,9 +314,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             isNull( person.wife() ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, ANN, JOE );
     }
 
@@ -323,26 +324,26 @@ public abstract class AbstractEntityFinderTest
     public void script16()
     {
         // should return only 2 entities
-        final List<EntityReference> references = StreamSupport.stream(
-            entityFinder.findEntities( Nameable.class,
-                                       ALL,
-                                       NO_SORTING,
-                                       NO_FIRST_RESULT, 2,
-                                       NO_VARIABLES ).spliterator(), false ).collect( toList() );
-        assertEquals( "2 identitities", 2, references.size() );
+        Stream<EntityReference> references = entityFinder.findEntities(
+            Nameable.class,
+            ALL,
+            NO_SORTING2,
+            NO_FIRST_RESULT, 2,
+            NO_VARIABLES );
+        assertEquals( "2 identities", 2, references.count() );
     }
 
     @Test
     public void script17()
     {
         // should return only 2 entities starting with third one
-        final List<EntityReference> references = StreamSupport.stream(
-            entityFinder.findEntities( Nameable.class,
-                                       ALL,
-                                       NO_SORTING,
-                                       3, 2,
-                                       NO_VARIABLES ).spliterator(), false ).collect( toList() );
-        assertEquals( "2 identitities", 2, references.size() );
+        Stream<EntityReference> references = entityFinder.findEntities(
+            Nameable.class,
+            ALL,
+            NO_SORTING2,
+            3, 2,
+            NO_VARIABLES );
+        assertEquals( "2 identitities", 2, references.count() );
     }
 
     @Test
@@ -356,12 +357,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Nameable.class,
             ALL,
-            new OrderBy[]
-        {
-            orderBy( nameable.name() )
-            },
+            Arrays.asList(orderBy( nameable.name() )),
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( false, entities, allNames );
     }
 
@@ -382,12 +380,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Nameable.class,
             gt( nameable.name(), "B" ),
-            new OrderBy[]
-        {
-            orderBy( nameable.name() )
-            },
+            Arrays.asList( orderBy( nameable.name() ) ),
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( false, entities, largerThanB.toArray( new String[ largerThanB.size() ] ) );
     }
 
@@ -399,12 +394,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             gt( person.yearOfBirth(), 1973 ),
-            new OrderBy[]
-        {
-            orderBy( person.name(), OrderBy.Order.DESCENDING )
-            },
+            Arrays.asList( orderBy( person.name(), OrderBy.Order.DESCENDING ) ),
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( false, entities, JOE, ANN );
     }
 
@@ -416,12 +408,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Person.class,
             ALL,
-            new OrderBy[]
-        {
-            orderBy( person.placeOfBirth().get().name() ), orderBy( person.name() )
-            },
+            Arrays.asList( orderBy( person.placeOfBirth().get().name() ), orderBy( person.name() ) ),
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( false, entities, ANN, JOE, JACK );
     }
 
@@ -433,9 +422,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Nameable.class,
             matches( nameable.name(), "J.*Doe" ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            NO_VARIABLES );
+            NO_VARIABLES ).collect( toList() );
         assertNames( entities, JACK, JOE );
     }
 
@@ -449,9 +438,9 @@ public abstract class AbstractEntityFinderTest
         Iterable<EntityReference> entities = entityFinder.findEntities(
             Domain.class,
             eq( nameable.name(), variable( "domain" ) ),
-            NO_SORTING,
+            NO_SORTING2,
             NO_FIRST_RESULT, NO_MAX_RESULTS,
-            variables );
+            variables ).collect( toList() );
         assertNames( entities, "Gaming" );
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
index ebec4bd..ff568d3 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
@@ -21,8 +21,11 @@ package org.apache.zest.index.elasticsearch;
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.This;
@@ -51,7 +54,6 @@ import org.apache.zest.api.query.grammar.PropertyNotNullPredicate;
 import org.apache.zest.api.query.grammar.PropertyNullPredicate;
 import org.apache.zest.api.query.grammar.QuerySpecification;
 import org.apache.zest.api.value.ValueComposite;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.elasticsearch.ElasticSearchFinderSupport.ComplexTypeSupport;
 import org.apache.zest.spi.query.EntityFinder;
 import org.apache.zest.spi.query.EntityFinderException;
@@ -59,7 +61,6 @@ import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.sort.SortOrder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -87,12 +88,12 @@ public interface ElasticSearchFinder
         private ElasticSearchSupport support;
 
         @Override
-        public Iterable<EntityReference> findEntities( Class<?> resultType,
-                                                       Predicate<Composite> whereClause,
-                                                       OrderBy[] orderBySegments,
-                                                       Integer firstResult, Integer maxResults,
-                                                       Map<String, Object> variables )
-            throws EntityFinderException
+        public Stream<EntityReference> findEntities( Class<?> resultType,
+                                                     Predicate<Composite> whereClause,
+                                                     List<OrderBy> orderBySegments,
+                                                     Integer firstResult,
+                                                     Integer maxResults,
+                                                     Map<String, Object> variables ) throws EntityFinderException
         {
             // Prepare request
             SearchRequestBuilder request = support.client().prepareSearch( support.index() );
@@ -128,7 +129,8 @@ public interface ElasticSearchFinder
             // Execute
             SearchResponse response = request.execute().actionGet();
 
-            return Iterables.map( (SearchHit from) -> EntityReference.parseEntityReference( from.id() ), response.getHits() );
+            return StreamSupport.stream( response.getHits().spliterator(), false )
+                                .map( hit -> EntityReference.parseEntityReference( hit.id() ) );
         }
 
         @Override
@@ -167,12 +169,12 @@ public interface ElasticSearchFinder
             throws EntityFinderException
         {
             // Prepare request
-            SearchRequestBuilder request = support.client().prepareSearch(support.index()).setSize(0);
+            SearchRequestBuilder request = support.client().prepareSearch( support.index() ).setSize( 0 );
 
             BoolQueryBuilder baseQueryBuilder = baseQuery( resultType );
             QueryBuilder whereQueryBuilder = processWhereSpecification( baseQueryBuilder, whereClause, variables );
 
-            request.setQuery( boolQuery().must(whereQueryBuilder).filter(baseQueryBuilder) );
+            request.setQuery( boolQuery().must( whereQueryBuilder ).filter( baseQueryBuilder ) );
 
             // Log
             LOGGER.debug( "Will count Entities: {}", request );
@@ -272,14 +274,13 @@ public interface ElasticSearchFinder
 
                 NamedAssociationContainsPredicate<?> namedAssContSpec = (NamedAssociationContainsPredicate) spec;
                 processNamedAssociationContainsSpecification( queryBuilder, namedAssContSpec, variables );
-
             }
             else if( spec instanceof NamedAssociationContainsNamePredicate )
             {
 
-                NamedAssociationContainsNamePredicate<?> namedAssContNameSpec = (NamedAssociationContainsNamePredicate) spec;
+                NamedAssociationContainsNamePredicate<?> namedAssContNameSpec
+                    = (NamedAssociationContainsNamePredicate) spec;
                 processNamedAssociationContainsNameSpecification( queryBuilder, namedAssContNameSpec, variables );
-
             }
             else
             {
@@ -519,5 +520,4 @@ public interface ElasticSearchFinder
             queryBuilder.must( termQuery( name, value ) );
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParser.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParser.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParser.java
index b9d9806..b8236f0 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParser.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParser.java
@@ -20,6 +20,7 @@
 
 package org.apache.zest.index.rdf.query;
 
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
@@ -29,7 +30,7 @@ public interface RdfQueryParser
 {
     String constructQuery( Class<?> resultType,
                            Predicate<Composite> whereClause,
-                           OrderBy[] orderBySegments,
+                           List<OrderBy> orderBySegments,
                            Integer firstResult,
                            Integer maxResults,
                            Map<String, Object> variables

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryService.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryService.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryService.java
index b0c3341..f8c08e6 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryService.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryService.java
@@ -20,9 +20,10 @@
 
 package org.apache.zest.index.rdf.query;
 
+import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
-import org.openrdf.query.QueryLanguage;
+import java.util.stream.Stream;
 import org.apache.zest.api.composite.Composite;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Service;
@@ -33,6 +34,7 @@ import org.apache.zest.api.query.grammar.QuerySpecification;
 import org.apache.zest.api.service.ServiceComposite;
 import org.apache.zest.spi.query.EntityFinder;
 import org.apache.zest.spi.query.EntityFinderException;
+import org.openrdf.query.QueryLanguage;
 
 /**
  * JAVADOC Add JavaDoc
@@ -57,14 +59,12 @@ public interface RdfQueryService
         TupleQueryExecutor tupleExecutor;
 
         @Override
-        public Iterable<EntityReference> findEntities( Class<?> resultType,
-                                                       Predicate<Composite> whereClause,
-                                                       OrderBy[] orderBySegments,
-                                                       Integer firstResult,
-                                                       Integer maxResults,
-                                                       Map<String, Object> variables
-        )
-            throws EntityFinderException
+        public Stream<EntityReference> findEntities( Class<?> resultType,
+                                                     Predicate<Composite> whereClause,
+                                                     List<OrderBy> orderBySegments,
+                                                     Integer firstResult,
+                                                     Integer maxResults,
+                                                     Map<String, Object> variables ) throws EntityFinderException
         {
             CollectingQualifiedIdentityResultCallback collectingCallback = new CollectingQualifiedIdentityResultCallback();
 
@@ -72,7 +72,7 @@ public interface RdfQueryService
             {
                 String query = ((QuerySpecification)whereClause).query();
                 tupleExecutor.performTupleQuery( QueryLanguage.SERQL, query, variables, collectingCallback );
-                return collectingCallback.entities();
+                return collectingCallback.entities().stream();
 
             } else
             {
@@ -80,7 +80,7 @@ public interface RdfQueryService
                 String query = rdfQueryParser.constructQuery( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
 
                 tupleExecutor.performTupleQuery( language, query, variables, collectingCallback );
-                return collectingCallback.entities();
+                return collectingCallback.entities().stream();
             }
         }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
index 8163237..d665c9d 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -99,7 +100,7 @@ public class RdfQueryParserImpl
     @Override
     public String constructQuery( final Class<?> resultType,
                                   final Predicate<Composite> specification,
-                                  final OrderBy[] orderBySegments,
+                                  final List<OrderBy> orderBySegments,
                                   final Integer firstResult,
                                   final Integer maxResults,
                                   final Map<String, Object> variables
@@ -497,9 +498,9 @@ public class RdfQueryParserImpl
         }
     }
 
-    private void processOrderBy( OrderBy[] orderBySegments, StringBuilder builder )
+    private void processOrderBy( List<OrderBy> orderBySegments, StringBuilder builder )
     {
-        if( orderBySegments != null && orderBySegments.length > 0 )
+        if( orderBySegments != null && orderBySegments.size() > 0 )
         {
             for( OrderBy orderBySegment : orderBySegments )
             {

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-solr/src/main/java/org/apache/zest/index/solr/internal/SolrEntityQueryMixin.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-solr/src/main/java/org/apache/zest/index/solr/internal/SolrEntityQueryMixin.java b/extensions/indexing-solr/src/main/java/org/apache/zest/index/solr/internal/SolrEntityQueryMixin.java
index db57c6f..ef26c04 100644
--- a/extensions/indexing-solr/src/main/java/org/apache/zest/index/solr/internal/SolrEntityQueryMixin.java
+++ b/extensions/indexing-solr/src/main/java/org/apache/zest/index/solr/internal/SolrEntityQueryMixin.java
@@ -22,10 +22,10 @@ package org.apache.zest.index.solr.internal;
 
 import java.lang.reflect.Member;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -39,7 +39,6 @@ import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Service;
 import org.apache.zest.api.query.grammar.OrderBy;
 import org.apache.zest.api.query.grammar.QuerySpecification;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.solr.EmbeddedSolrService;
 import org.apache.zest.index.solr.SolrSearch;
 import org.apache.zest.spi.query.EntityFinder;
@@ -59,7 +58,12 @@ public class SolrEntityQueryMixin
     private Logger logger = LoggerFactory.getLogger( SolrEntityQueryMixin.class );
 
     @Override
-    public Iterable<EntityReference> findEntities( Class<?> resultType, @Optional Predicate<Composite> whereClause, @Optional OrderBy[] orderBySegments, @Optional Integer firstResult, @Optional Integer maxResults, Map<String, Object> variables ) throws EntityFinderException
+    public Stream<EntityReference> findEntities( Class<?> resultType,
+                                                 Predicate<Composite> whereClause,
+                                                 List<OrderBy> orderBySegments,
+                                                 Integer firstResult,
+                                                 Integer maxResults,
+                                                 Map<String, Object> variables ) throws EntityFinderException
     {
         try
         {
@@ -73,7 +77,7 @@ public class SolrEntityQueryMixin
             list.add( "rows", maxResults != 0 ? maxResults : 10000 );
             list.add( "start", firstResult );
 
-            if( orderBySegments != null && orderBySegments.length > 0 )
+            if( orderBySegments != null && orderBySegments.size() > 0 )
             {
                 for( OrderBy orderBySegment : orderBySegments )
                 {
@@ -96,7 +100,7 @@ public class SolrEntityQueryMixin
             {
                 references.add( EntityReference.parseEntityReference( result.getFirstValue( "id" ).toString() ) );
             }
-            return references;
+            return references.stream();
 
         } catch( SolrServerException e )
         {
@@ -107,18 +111,15 @@ public class SolrEntityQueryMixin
     @Override
     public EntityReference findEntity( Class<?> resultType, @Optional Predicate<Composite> whereClause, Map<String, Object> variables ) throws EntityFinderException
     {
-        Iterator<EntityReference> iter = findEntities( resultType, whereClause, null, 0, 1, variables ).iterator();
-
-        if( iter.hasNext() )
-            return iter.next();
-        else
-            return null;
+        return findEntities( resultType, whereClause, null, 0, 1, variables )
+            .findFirst().orElse( null );
     }
 
     @Override
     public long countEntities( Class<?> resultType, @Optional Predicate<Composite> whereClause, Map<String, Object> variables ) throws EntityFinderException
     {
-        return Iterables.count( findEntities( resultType, whereClause, null, 0, 1, variables ) );
+        return findEntities( resultType, whereClause, null, 0, 1, variables )
+            .count();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/internal/SQLEntityFinder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/internal/SQLEntityFinder.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/internal/SQLEntityFinder.java
index 54e3baf..db2dd3a 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/internal/SQLEntityFinder.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/internal/SQLEntityFinder.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 import javax.sql.DataSource;
 import org.apache.zest.api.common.Optional;
 import org.apache.zest.api.composite.Composite;
@@ -93,17 +94,15 @@ public class SQLEntityFinder
     }
 
     @Override
-    public Iterable<EntityReference> findEntities( Class<?> resultType,
-                                                   @Optional Predicate<Composite> whereClause,
-                                                   @Optional OrderBy[] orderBySegments,
-                                                   @Optional final Integer firstResult,
-                                                   @Optional final Integer maxResults,
-                                                   Map<String, Object> variables )
-        throws EntityFinderException
+    public Stream<EntityReference> findEntities( Class<?> resultType,
+                                                 Predicate<Composite> whereClause,
+                                                 List<OrderBy> orderBySegments,
+                                                 Integer firstResult,
+                                                 Integer maxResults,
+                                                 Map<String, Object> variables ) throws EntityFinderException
     {
         // TODO what is Zest's policy on negative firstResult and/or maxResults? JDBC has its own way of interpreting
         // these values - does it match with Zest's way?
-        Iterable<EntityReference> result;
         if( maxResults == null || maxResults > 0 )
         {
             final List<Object> values = new ArrayList<>();
@@ -111,10 +110,10 @@ public class SQLEntityFinder
             final String query = this.parser.constructQuery( resultType, whereClause, orderBySegments, firstResult,
                                                              maxResults, variables, values, valueSQLTypes, false );
 
-            result = this.performQuery( new DoQuery<Iterable<EntityReference>>()
+            List<EntityReference> result = this.performQuery( new DoQuery<List<EntityReference>>()
             {
                 @Override
-                public Iterable<EntityReference> doIt( Connection connection )
+                public List<EntityReference> doIt( Connection connection )
                     throws SQLException
                 {
                     PreparedStatement ps = null;
@@ -148,16 +147,13 @@ public class SQLEntityFinder
 
                     return resultList;
                 }
-
             } );
-
+            return result.stream();
         }
         else
         {
-            result = new ArrayList<>( 0 );
+            return Stream.of();
         }
-
-        return result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/api/SQLQuerying.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/api/SQLQuerying.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/api/SQLQuerying.java
index 694b08e..13ce4fe 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/api/SQLQuerying.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/api/SQLQuerying.java
@@ -56,7 +56,7 @@ public interface SQLQuerying
     public String constructQuery( //
         Class<?> resultType, //
         @Optional Predicate<Composite> whereClause, //
-        @Optional OrderBy[] orderBySegments, //
+        @Optional List<OrderBy> orderBySegments, //
         @Optional Integer firstResult, //
         @Optional Integer maxResults, //
         Map<String, Object> variables,

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/postgresql/PostgreSQLQuerying.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/postgresql/PostgreSQLQuerying.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/postgresql/PostgreSQLQuerying.java
index b83c928..7fe6514 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/postgresql/PostgreSQLQuerying.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/postgresql/PostgreSQLQuerying.java
@@ -38,7 +38,7 @@ public class PostgreSQLQuerying
             SQLVendor sqlVendor, QuerySpecificationBuilder specBuilder,
             Class<?> resultType,
             Predicate<Composite> whereClause,
-            OrderBy[] orderBySegments,
+            List<OrderBy> orderBySegments,
             Integer firstResult,
             Integer maxResults,
             Map<String, Object> variables,

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
index 38ba1f8..587bf30 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
@@ -779,7 +779,7 @@ public abstract class AbstractSQLQuerying
     @Override
     public String constructQuery( Class<?> resultType, //
                                   Predicate<Composite> whereClause, //
-                                  OrderBy[] orderBySegments, //
+                                  List<OrderBy> orderBySegments, //
                                   Integer firstResult, //
                                   Integer maxResults, //
                                   Map<String, Object> variables, //
@@ -849,7 +849,7 @@ public abstract class AbstractSQLQuerying
         SQLVendor sqlVendor, QuerySpecificationBuilder specBuilder,
         Class<?> resultType,
         Predicate<Composite> whereClause,
-        OrderBy[] orderBySegments,
+        List<OrderBy> orderBySegments,
         Integer firstResult,
         Integer maxResults,
         Map<String, Object> variables,
@@ -1454,23 +1454,23 @@ public abstract class AbstractSQLQuerying
         return javaRegexp;
     }
 
-    protected void processOrderBySegments( OrderBy[] orderBy, SQLVendor vendor,
+    protected void processOrderBySegments( List<OrderBy> orderBy, SQLVendor vendor,
                                            QuerySpecificationBuilder builder
     )
     {
         if( orderBy != null )
         {
-            QNameInfo[] qNames = new QNameInfo[ orderBy.length ];
+            QNameInfo[] qNames = new QNameInfo[ orderBy.size() ];
 
             QueryFactory q = vendor.getQueryFactory();
             ColumnsFactory c = vendor.getColumnsFactory();
 
             Integer tableIndex = 0;
-            for( Integer idx = 0; idx < orderBy.length; ++idx )
+            for( Integer idx = 0; idx < orderBy.size(); ++idx )
             {
-                if( orderBy[ idx ] != null )
+                if( orderBy.get( idx ) != null )
                 {
-                    PropertyFunction<?> ref = orderBy[ idx ].property();
+                    PropertyFunction<?> ref = orderBy.get( idx ).property();
                     QualifiedName qName = QualifiedName.fromAccessor( ref.accessor() );
                     QNameInfo info = this._state.qNameInfos().get().get( qName );
                     qNames[ idx ] = info;
@@ -1496,7 +1496,7 @@ public abstract class AbstractSQLQuerying
                         tableIdx = tableIndex;
                     }
                     Ordering ordering = Ordering.ASCENDING;
-                    if( orderBy[ idx ].order() == Order.DESCENDING )
+                    if( orderBy.get( idx ).order() == Order.DESCENDING )
                     {
                         ordering = Ordering.DESCENDING;
                     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/2d485e3a/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntitiesResource.java
----------------------------------------------------------------------
diff --git a/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntitiesResource.java b/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntitiesResource.java
index 22bff3e..f379a78 100644
--- a/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntitiesResource.java
+++ b/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntitiesResource.java
@@ -27,6 +27,7 @@ import java.io.Writer;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityComposite;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Service;
@@ -48,6 +49,8 @@ import org.restlet.representation.WriterRepresentation;
 import org.restlet.resource.ResourceException;
 import org.restlet.resource.ServerResource;
 
+import static java.util.stream.Collectors.toList;
+
 /**
  * Listing of all Entities.
  * <p>
@@ -106,7 +109,8 @@ public class EntitiesResource
     {
         try
         {
-            final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
+            final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.emptyMap() )
+                                                                .collect( toList() );
             return new OutputRepresentation( MediaType.APPLICATION_JSON )
             {
                 @Override
@@ -128,7 +132,7 @@ public class EntitiesResource
     {
         try
         {
-            final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
+            final Stream<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.emptyMap() );
 
             WriterRepresentation representation = new WriterRepresentation( MediaType.APPLICATION_RDF_XML )
             {
@@ -141,11 +145,9 @@ public class EntitiesResource
                                  + "\txmlns=\"urn:zest:\"\n" + "\txmlns:zest=\"http://zest.apache.org/rdf/model/1.0/\"\n"
                                  + "\txmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n"
                                  + "\txmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\">" );
-                    for( EntityReference qualifiedIdentity : query )
-                    {
-                        out.println( "<zest:entity rdf:about=\"" + getRequest().getResourceRef().getPath() + "/"
-                                     + qualifiedIdentity.identity() + ".rdf\"/>" );
-                    }
+                    query.forEach( qualifiedIdentity -> out.println( "<zest:entity rdf:about=\""
+                                                                     + getRequest().getResourceRef().getPath() + "/"
+                                                                     + qualifiedIdentity.identity() + ".rdf\"/>" ) );
 
                     out.println( "</rdf:RDF>" );
                 }
@@ -165,7 +167,7 @@ public class EntitiesResource
     {
         try
         {
-            final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
+            Stream<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.emptyMap() );
             Representation representation = new WriterRepresentation( MediaType.TEXT_HTML )
             {
                 @Override
@@ -175,12 +177,9 @@ public class EntitiesResource
                     PrintWriter out = new PrintWriter( buf );
                     out.println( "<html><head><title>All entities</title></head><body><h1>All entities</h1><ul>" );
 
-                    for( EntityReference entity : query )
-                    {
-                        out.println( "<li><a href=\""
-                                     + getRequest().getResourceRef().clone().addSegment( entity.identity() + ".html" )
-                                     + "\">" + entity.identity() + "</a></li>" );
-                    }
+                    query.forEach( entity -> out.println( "<li><a href=\""
+                                                          + getRequest().getResourceRef().clone().addSegment( entity.identity() + ".html" )
+                                                          + "\">" + entity.identity() + "</a></li>" ) );
                     out.println( "</ul></body></html>" );
                 }
             };
@@ -201,17 +200,18 @@ public class EntitiesResource
             Feed feed = new Feed();
             feed.setTitle( new Text( MediaType.TEXT_PLAIN, "All entities" ) );
             List<Entry> entries = feed.getEntries();
-            final Iterable<EntityReference> query = entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.<String, Object>emptyMap() );
-            for( EntityReference entityReference : query )
-            {
-                Entry entry = new Entry();
-                entry.setTitle( new Text( MediaType.TEXT_PLAIN, entityReference.toString() ) );
-                Link link = new Link();
-                link.setHref( getRequest().getResourceRef().clone().addSegment( entityReference.identity().toString() ) );
-                entry.getLinks().add( link );
-                entries.add( entry );
-            }
-
+            entityFinder.findEntities( EntityComposite.class, null, null, null, null, Collections.emptyMap() )
+                        .forEach(
+                            entityReference ->
+                            {
+                                Entry entry = new Entry();
+                                entry.setTitle( new Text( MediaType.TEXT_PLAIN, entityReference.toString() ) );
+                                Link link = new Link();
+                                link.setHref( getRequest().getResourceRef().clone()
+                                                          .addSegment( entityReference.identity().toString() ) );
+                                entry.getLinks().add( link );
+                                entries.add( entry );
+                            } );
             return feed;
         }
         catch( Exception e )


[04/13] zest-java git commit: testsupport: remove a port range, seen busy on ci

Posted by pa...@apache.org.
testsupport: remove a port range, seen busy on ci


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/401f70f2
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/401f70f2
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/401f70f2

Branch: refs/heads/develop
Commit: 401f70f20e3626dfc772ea60987c0789b068b028
Parents: 0f956c8
Author: Paul Merlin <pa...@apache.org>
Authored: Wed Dec 7 09:32:20 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Wed Dec 7 09:32:20 2016 +0100

----------------------------------------------------------------------
 .../src/main/java/org/apache/zest/test/util/FreePortFinder.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/401f70f2/core/testsupport/src/main/java/org/apache/zest/test/util/FreePortFinder.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/zest/test/util/FreePortFinder.java b/core/testsupport/src/main/java/org/apache/zest/test/util/FreePortFinder.java
index 1ff33f8..70754eb 100644
--- a/core/testsupport/src/main/java/org/apache/zest/test/util/FreePortFinder.java
+++ b/core/testsupport/src/main/java/org/apache/zest/test/util/FreePortFinder.java
@@ -63,7 +63,7 @@ public class FreePortFinder
         new Range( 38204, 38799 ),
         new Range( 33657, 34248 ),
         new Range( 30261, 30831 ),
-        new Range( 41231, 41793 ),
+        // new Range( 41231, 41793 ), // 41652 seen busy
         new Range( 21011, 21552 ),
         new Range( 28590, 29117 ),
         new Range( 14415, 14935 ),


[10/13] zest-java git commit: io: fix i/o test

Posted by pa...@apache.org.
io: fix i/o test


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/ff0f3bee
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/ff0f3bee
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/ff0f3bee

Branch: refs/heads/develop
Commit: ff0f3bee6718ae927c83fa956a1417151b4a55ba
Parents: 3c34b37
Author: Paul Merlin <pa...@apache.org>
Authored: Fri Dec 9 00:11:42 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Fri Dec 9 00:11:42 2016 +0100

----------------------------------------------------------------------
 core/io/src/test/java/org/apache/zest/io/InputOutputTest.java | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/ff0f3bee/core/io/src/test/java/org/apache/zest/io/InputOutputTest.java
----------------------------------------------------------------------
diff --git a/core/io/src/test/java/org/apache/zest/io/InputOutputTest.java b/core/io/src/test/java/org/apache/zest/io/InputOutputTest.java
index 844acef..28d52b0 100644
--- a/core/io/src/test/java/org/apache/zest/io/InputOutputTest.java
+++ b/core/io/src/test/java/org/apache/zest/io/InputOutputTest.java
@@ -47,7 +47,6 @@ import org.junit.Test;
 import org.apache.zest.functional.Visitor;
 
 import static java.util.Arrays.asList;
-import static org.apache.zest.functional.Iterables.iterable;
 import static org.apache.zest.io.Inputs.text;
 import static org.apache.zest.io.Transforms.lock;
 import static org.apache.zest.test.util.Assume.assumeConnectivity;
@@ -162,11 +161,11 @@ public class InputOutputTest
         Integer[] data = new Integer[ 105 ];
         Arrays.fill( data, 42 );
 
-        Inputs.iterable( iterable( data ) ).transferTo(
+        Inputs.iterable( Arrays.asList( data ) ).transferTo(
             Transforms.map(
-                new Transforms.ProgressLog<Integer>(
+                new Transforms.ProgressLog<>(
                     Logger.getLogger( InputOutputTest.class.getName() ), "Data transferred: {0}", 10 ),
-                Outputs.<Integer>noop() ) );
+                Outputs.noop() ) );
     }
 
     @Test


[03/13] zest-java git commit: functional: remove now unused Iterables methods

Posted by pa...@apache.org.
functional: remove now unused Iterables methods


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/0f956c80
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/0f956c80
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/0f956c80

Branch: refs/heads/develop
Commit: 0f956c805b43d4d9e1e99989b3e51fd086971d00
Parents: a6ba8b5
Author: Paul Merlin <pa...@apache.org>
Authored: Tue Dec 6 19:37:12 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Tue Dec 6 19:40:30 2016 +0100

----------------------------------------------------------------------
 .../org/apache/zest/functional/Iterables.java   | 559 +------------------
 .../apache/zest/functional/IterablesTest.java   | 117 +---
 2 files changed, 8 insertions(+), 668 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/0f956c80/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
----------------------------------------------------------------------
diff --git a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
index 8ecc9fb..0cdcd63 100644
--- a/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
+++ b/core/functional/src/main/java/org/apache/zest/functional/Iterables.java
@@ -20,18 +20,11 @@
 package org.apache.zest.functional;
 
 import java.lang.reflect.Array;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
@@ -40,128 +33,7 @@ import java.util.function.Predicate;
  */
 public final class Iterables
 {
-    @SuppressWarnings( "raw" )
-    private static final Iterable EMPTY = new Iterable()
-    {
-        Iterator iterator = new Iterator()
-        {
-            @Override
-            public boolean hasNext()
-            {
-                return false;
-            }
-
-            @Override
-            public Object next()
-            {
-                throw new NoSuchElementException();
-            }
-
-            @Override
-            public void remove()
-            {
-            }
-        };
-
-        @Override
-        public Iterator iterator()
-        {
-            return iterator;
-        }
-    };
-
-    @SuppressWarnings( "unchecked" )
-    public static <T> Iterable<T> empty()
-    {
-        return EMPTY;
-    }
-
-    public static <T> Iterable<T> limit( final int limitItems, final Iterable<T> iterable )
-    {
-        return new Iterable<T>()
-        {
-            @Override
-            public Iterator<T> iterator()
-            {
-                final Iterator<T> iterator = iterable.iterator();
-
-                return new Iterator<T>()
-                {
-                    int count;
-
-                    @Override
-                    public boolean hasNext()
-                    {
-                        return count < limitItems && iterator.hasNext();
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        count++;
-                        return iterator.next();
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                        iterator.remove();
-                    }
-                };
-            }
-        };
-    }
-
-    public static <T> Iterable<T> unique( final Iterable<T> iterable )
-    {
-        return new Iterable<T>()
-        {
-            @Override
-            public Iterator<T> iterator()
-            {
-                final Iterator<T> iterator = iterable.iterator();
-
-                return new Iterator<T>()
-                {
-                    private final Set<T> items = new HashSet<>();
-                    private T nextItem;
-
-                    @Override
-                    public boolean hasNext()
-                    {
-                        while( iterator.hasNext() )
-                        {
-                            nextItem = iterator.next();
-                            if( items.add( nextItem ) )
-                            {
-                                return true;
-                            }
-                        }
-
-                        return false;
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        if( nextItem == null && !hasNext() )
-                        {
-                            throw new NoSuchElementException();
-                        }
-
-                        return nextItem;
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                    }
-                };
-            }
-        };
-    }
-
-    public static <T, C extends Collection<T>> C addAll( C collection, Iterable<? extends T> iterable )
+    private static <T, C extends Collection<T>> C addAll( C collection, Iterable<? extends T> iterable )
     {
         for( T item : iterable )
         {
@@ -199,52 +71,6 @@ public final class Iterables
         }
     }
 
-    public static <X> X single( Iterable<X> i )
-    {
-        Iterator<X> iter = i.iterator();
-        if( iter.hasNext() )
-        {
-            X result = iter.next();
-
-            if( iter.hasNext() )
-            {
-                throw new IllegalArgumentException( "More than one element in iterable" );
-            }
-
-            return result;
-        }
-        else
-        {
-            throw new IllegalArgumentException( "No elements in iterable" );
-        }
-    }
-
-    public static <X> Iterable<X> skip( final int skip, final Iterable<X> iterable )
-    {
-        return new Iterable<X>()
-        {
-            @Override
-            public Iterator<X> iterator()
-            {
-                Iterator<X> iterator = iterable.iterator();
-
-                for( int i = 0; i < skip; i++ )
-                {
-                    if( iterator.hasNext() )
-                    {
-                        iterator.next();
-                    }
-                    else
-                    {
-                        return Iterables.<X>empty().iterator();
-                    }
-                }
-
-                return iterator;
-            }
-        };
-    }
-
     public static <X> X last( Iterable<X> i )
     {
         Iterator<X> iter = i.iterator();
@@ -257,176 +83,18 @@ public final class Iterables
         return item;
     }
 
-    public static <X> Iterable<X> reverse( Iterable<X> iterable )
-    {
-        List<X> list = toList( iterable );
-        Collections.reverse( list );
-        return list;
-    }
-
-    public static <T> boolean matchesAny( Predicate<? super T> specification, Iterable<T> iterable )
-    {
-        boolean result = false;
-
-        for( T item : iterable )
-        {
-            if( ( (Predicate<? super T>) specification ).test( item ) )
-            {
-                result = true;
-                break;
-            }
-        }
-
-        return result;
-    }
-
-    public static <T> boolean matchesAll( Predicate<? super T> specification, Iterable<T> iterable )
-    {
-        boolean result = true;
-        for( T item : iterable )
-        {
-            if( !specification.test( item ) )
-            {
-                result = false;
-            }
-        }
-
-        return result;
-    }
-
-    public static <X> Iterable<X> flatten( Iterable<?>... multiIterator )
-    {
-        return new FlattenIterable<>( Iterables.<Iterable<X>>cast( Arrays.asList( multiIterator ) ) );
-    }
-
-    public static <X, I extends Iterable<? extends X>> Iterable<X> flattenIterables( Iterable<I> multiIterator )
-    // public static <X> Iterable<X> flattenIterables( Iterable<Iterable<?>> multiIterator )
-    {
-        return new FlattenIterable<>( Iterables.<Iterable<X>>cast( multiIterator ) );
-    }
-
-    @SafeVarargs
-    public static <T> Iterable<T> mix( final Iterable<T>... iterables )
-    {
-        return new Iterable<T>()
-        {
-            @Override
-            public Iterator<T> iterator()
-            {
-                final Iterable<Iterator<T>> iterators = toList( map( new Function<Iterable<T>, Iterator<T>>()
-                {
-                    @Override
-                    public Iterator<T> apply( Iterable<T> iterable )
-                    {
-                        return iterable.iterator();
-                    }
-                }, Iterables.iterable( iterables ) ) );
-
-                return new Iterator<T>()
-                {
-                    Iterator<Iterator<T>> iterator;
-
-                    Iterator<T> iter;
-
-                    @Override
-                    public boolean hasNext()
-                    {
-                        for( Iterator<T> iterator : iterators )
-                        {
-                            if( iterator.hasNext() )
-                            {
-                                return true;
-                            }
-                        }
-
-                        return false;
-                    }
-
-                    @Override
-                    public T next()
-                    {
-                        if( iterator == null )
-                        {
-                            iterator = iterators.iterator();
-                        }
-
-                        while( iterator.hasNext() )
-                        {
-                            iter = iterator.next();
-
-                            if( iter.hasNext() )
-                            {
-                                return iter.next();
-                            }
-                        }
-
-                        iterator = null;
-
-                        return next();
-                    }
-
-                    @Override
-                    public void remove()
-                    {
-                        if( iter != null )
-                        {
-                            iter.remove();
-                        }
-                    }
-                };
-            }
-        };
-    }
-
     @SuppressWarnings( "unchecked" )
     public static <FROM, TO> Iterable<TO> map( Function<? /* super FROM */, TO> function, Iterable<FROM> from )
     {
         return new MapIterable<>( from, (Function<FROM, TO>) function );
     }
 
-    public static <T> Iterable<T> iterable( Enumeration<T> enumeration )
-    {
-        List<T> list = new ArrayList<>();
-        while( enumeration.hasMoreElements() )
-        {
-            T item = enumeration.nextElement();
-            list.add( item );
-        }
-
-        return list;
-    }
-
     @SafeVarargs
     public static <T> Iterable<T> iterable( T... items )
     {
         return Arrays.asList( items );
     }
 
-    @SuppressWarnings( {"raw", "unchecked"} )
-    public static <T> Iterable<T> cast( Iterable<?> iterable )
-    {
-        Iterable iter = iterable;
-        return iter;
-    }
-
-    public static <FROM, TO> Function<FROM, TO> cast()
-    {
-        return new Function<FROM, TO>()
-        {
-            @Override
-            @SuppressWarnings( "unchecked" )
-            public TO apply( FROM from )
-            {
-                return (TO) from;
-            }
-        };
-    }
-
-    public static <FROM, TO> TO fold( Function<? super FROM, TO> function, Iterable<? extends FROM> i )
-    {
-        return last( map( function, i ) );
-    }
-
     public static <T> Iterable<T> prepend( final T item, final Iterable<T> iterable )
     {
         return () -> new Iterator<T>()
@@ -495,14 +163,7 @@ public final class Iterables
                     @Override
                     public boolean hasNext()
                     {
-                        if( iterator.hasNext() )
-                        {
-                            return true;
-                        }
-                        else
-                        {
-                            return last != null;
-                        }
+                        return iterator.hasNext() || last != null;
                     }
 
                     @Override
@@ -534,74 +195,9 @@ public final class Iterables
         };
     }
 
-    @SafeVarargs
-    public static <T> Iterable<T> debug( String format,
-                                         final Iterable<T> iterable,
-                                         final Function<T, String>... functions
-    )
-    {
-        final MessageFormat msgFormat = new MessageFormat( format );
-
-        return map( new Function<T, T>()
-        {
-            @Override
-            public T apply( T t )
-            {
-                if( functions.length != 0 )
-                {
-                    String[] mapped = new String[ functions.length ];
-                    for( int i = 0; i < functions.length; i++ )
-                    {
-                        Function<T, String> function = functions[ i ];
-                        mapped[ i ] = function.apply( t );
-                    }
-                }
-                return t;
-            }
-        }, iterable );
-    }
-
-    public static <T> Iterable<T> cache( Iterable<T> iterable )
-    {
-        return new CacheIterable<>( iterable );
-    }
-
-    public static <T> String toString( Iterable<T> iterable )
-    {
-        return toString( iterable, new Function<T, String>()
-        {
-            @Override
-            public String apply( T t )
-            {
-                return t == null ? "[null]" : t.toString();
-            }
-        }, "," );
-    }
-
-    public static <T> String toString( Iterable<T> iterable, Function<T, String> toStringFunction, String separator )
-    {
-        StringBuilder builder = new StringBuilder();
-        boolean first = true;
-        for( T item : iterable )
-        {
-            if( !first )
-            {
-                builder.append( separator );
-            }
-            builder.append( toStringFunction.apply( item ) );
-            first = false;
-        }
-        return builder.toString();
-    }
-
     public static <T> List<T> toList( Iterable<T> iterable )
     {
-        return addAll( new ArrayList<T>(), iterable );
-    }
-
-    public static Object[] toArray( Iterable<Object> iterable )
-    {
-        return toArray( Object.class, iterable );
+        return addAll( new ArrayList<>(), iterable );
     }
 
     @SuppressWarnings( "unchecked" )
@@ -615,21 +211,6 @@ public final class Iterables
         return list.toArray( (T[]) Array.newInstance( componentType, list.size() ) );
     }
 
-    @SuppressWarnings( {"raw", "unchecked"} )
-    public static <X extends Comparable> Iterable<X> sort( Iterable<X> iterable )
-    {
-        List<X> list = toList( iterable );
-        Collections.sort( list );
-        return list;
-    }
-
-    public static <X> Iterable<X> sort( Comparator<? super X> comparator, Iterable<X> iterable )
-    {
-        List<X> list = toList( iterable );
-        Collections.sort( list, comparator );
-        return list;
-    }
-
     private static class MapIterable<FROM, TO>
         implements Iterable<TO>
     {
@@ -679,7 +260,6 @@ public final class Iterables
                 fromIterator.remove();
             }
         }
-
     }
 
     private static class FilterIterable<T>
@@ -718,7 +298,7 @@ public final class Iterables
                 this.iterator = iterator;
             }
 
-            public boolean moveToNextValid()
+            private boolean moveToNextValid()
             {
                 boolean found = false;
                 while( !found && iterator.hasNext() )
@@ -765,146 +345,17 @@ public final class Iterables
             @Override
             public boolean hasNext()
             {
-                return !finished
-                       && ( !nextConsumed || moveToNextValid() );
-            }
-
-            @Override
-            public void remove()
-            {
-            }
-        }
-
-    }
-
-    private static class FlattenIterable<T, I extends Iterable<? extends T>>
-        implements Iterable<T>
-    {
-        private final Iterable<I> iterable;
-
-        private FlattenIterable( Iterable<I> iterable )
-        {
-            this.iterable = iterable;
-        }
-
-        @Override
-        public Iterator<T> iterator()
-        {
-            return new FlattenIterator<>( iterable.iterator() );
-        }
-
-        static class FlattenIterator<T, I extends Iterable<? extends T>>
-            implements Iterator<T>
-        {
-            private final Iterator<I> iterator;
-            private Iterator<? extends T> currentIterator;
-
-            private FlattenIterator( Iterator<I> iterator )
-            {
-                this.iterator = iterator;
-                currentIterator = null;
-            }
-
-            @Override
-            public boolean hasNext()
-            {
-                if( currentIterator == null )
-                {
-                    if( iterator.hasNext() )
-                    {
-                        I next = iterator.next();
-                        currentIterator = next.iterator();
-                    }
-                    else
-                    {
-                        return false;
-                    }
-                }
-
-                while( !currentIterator.hasNext()
-                       && iterator.hasNext() )
-                {
-                    currentIterator = iterator.next().iterator();
-                }
-
-                return currentIterator.hasNext();
-            }
-
-            @Override
-            public T next()
-            {
-                return currentIterator.next();
+                return !finished && ( !nextConsumed || moveToNextValid() );
             }
 
             @Override
             public void remove()
             {
-                if( currentIterator == null )
-                {
-                    throw new IllegalStateException();
-                }
-
-                currentIterator.remove();
-            }
-        }
-
-    }
-
-    private static class CacheIterable<T>
-        implements Iterable<T>
-    {
-        private final Iterable<T> iterable;
-        private Iterable<T> cache;
-
-        private CacheIterable( Iterable<T> iterable )
-        {
-            this.iterable = iterable;
-        }
-
-        @Override
-        public Iterator<T> iterator()
-        {
-            if( cache != null )
-            {
-                return cache.iterator();
             }
-
-            final Iterator<T> source = iterable.iterator();
-
-            return new Iterator<T>()
-            {
-                List<T> iteratorCache = new ArrayList<>();
-
-                @Override
-                public boolean hasNext()
-                {
-                    boolean hasNext = source.hasNext();
-                    if( !hasNext )
-                    {
-                        cache = iteratorCache;
-                    }
-                    return hasNext;
-                }
-
-                @Override
-                public T next()
-                {
-                    T next = source.next();
-                    iteratorCache.add( next );
-                    return next;
-                }
-
-                @Override
-                public void remove()
-                {
-
-                }
-            };
         }
     }
 
     private Iterables()
     {
     }
-
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/0f956c80/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
----------------------------------------------------------------------
diff --git a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
index b8376c8..84787d7 100644
--- a/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
+++ b/core/functional/src/test/java/org/apache/zest/functional/IterablesTest.java
@@ -21,15 +21,13 @@ package org.apache.zest.functional;
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Comparator;
-import java.util.Enumeration;
 import java.util.List;
 import java.util.function.Function;
-import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
-import static java.util.Collections.*;
-import static org.hamcrest.CoreMatchers.*;
+import static java.util.Collections.emptyList;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
 /**
@@ -37,22 +35,8 @@ import static org.junit.Assert.assertThat;
  */
 public class IterablesTest
 {
-
     private List<String> numbers = Arrays.asList( "1", "2", "3" );
     private Iterable<Long> numberLongs = Arrays.asList( 1L, 2L, 3L );
-    private Iterable<Integer> numberIntegers = Arrays.asList( 1, 2, 3 );
-
-    @Test
-    public void testUnique()
-    {
-        String str = "";
-
-        for( String string : Iterables.unique( Iterables.<String>flatten( numbers, numbers, numbers ) ) )
-        {
-            str += string;
-        }
-        assertThat( str, CoreMatchers.equalTo( "123" ) );
-    }
 
     @Test
     public void testAddAll()
@@ -76,30 +60,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testLast()
-    {
-        assertThat( Iterables.last( numbers ), equalTo( "3" ) );
-        assertThat( Iterables.last( emptyList() ), nullValue() );
-    }
-
-    @Test
-    public void testFolding()
-    {
-        assertThat( Iterables.fold( new Function<Integer, Integer>()
-        {
-
-            int sum = 0;
-
-            @Override
-            public Integer apply( Integer number )
-            {
-                return sum += number;
-            }
-
-        }, numberIntegers ), equalTo( 6 ) );
-    }
-
-    @Test
     public void testAppend()
     {
         assertThat( Iterables.toList( Iterables.append( "C", Iterables.iterable( "A", "B" ) ) ).toString(),
@@ -107,40 +67,6 @@ public class IterablesTest
     }
 
     @Test
-    public void testReverse()
-    {
-        assertThat( Iterables.reverse( numbers ).toString(), equalTo( "[3, 2, 1]" ) );
-        assertThat( Iterables.reverse( emptyList() ), equalTo( (Object) emptyList() ) );
-    }
-
-    @Test
-    public void testFlatten()
-    {
-        assertThat( Iterables.toList( Iterables.flatten( numbers, numbers ) ).toString(),
-                    equalTo( "[1, 2, 3, 1, 2, 3]" ) );
-
-        Iterable<? extends Number> flatten = Iterables.flatten( numberIntegers, numberLongs );
-        assertThat( Iterables.toList( flatten ).toString(), equalTo( "[1, 2, 3, 1, 2, 3]" ) );
-    }
-
-    @Test
-    public void testFlattenIterables()
-    {
-        Iterable<List<String>> iterable = Iterables.iterable( numbers, numbers );
-        assertThat( Iterables.toList( Iterables.flattenIterables( iterable ) ).toString(),
-                    equalTo( "[1, 2, 3, 1, 2, 3]" ) );
-    }
-
-    @Test
-    public void testMix()
-    {
-        assertThat( Iterables.toList( Iterables.mix( Iterables.iterable( "A", "B", "C" ),
-                                                     Iterables.iterable( "1", "2", "3", "4", "5" ),
-                                                     Iterables.iterable( "X", "Y", "Z" ) ) ).toString(),
-                    equalTo( "[A, 1, X, B, 2, Y, C, 3, Z, 4, 5]" ) );
-    }
-
-    @Test
     public void testMap()
     {
         assertThat( Iterables.toList( Iterables.map( new Function<String, String>()
@@ -150,7 +76,6 @@ public class IterablesTest
             {
                 return s + s;
             }
-
         }, numbers ) ).toString(), equalTo( "[11, 22, 33]" ) );
 
         Iterable<List<String>> numberIterable = Iterables.iterable( numbers, numbers, numbers );
@@ -162,49 +87,13 @@ public class IterablesTest
             {
                 return collection.size();
             }
-
         }, numberIterable ) ).toString(), equalTo( "[3, 3, 3]" ) );
     }
 
     @Test
-    public void testIterableEnumeration()
-    {
-
-        Enumeration<String> enumeration = enumeration( numbers );
-        assertThat( Iterables.toList( Iterables.iterable( enumeration ) ).toString(),
-                    equalTo( "[1, 2, 3]" ) );
-    }
-
-    @Test
     public void testIterableVarArg()
     {
         assertThat( Iterables.toList( Iterables.iterable( "1", "2", "3" ) ).toString(),
                     equalTo( "[1, 2, 3]" ) );
     }
-
-    @Test
-    public void testCast()
-    {
-        Iterable<Long> values = numberLongs;
-        Iterable<Number> numbers = Iterables.cast( values );
-    }
-
-    @Test
-    public void testSort()
-    {
-        assertThat( Iterables.sort( Iterables.reverse( numberLongs ) ).toString(), equalTo( "[1, 2, 3]" ) );
-
-        Comparator<Long> inverseLongComparator = new Comparator<Long>()
-        {
-
-            @Override
-            public int compare( Long left, Long right )
-            {
-                return left.compareTo( right ) * -1;
-            }
-
-        };
-        assertThat( Iterables.sort( inverseLongComparator, numberLongs ).toString(), equalTo( "[3, 2, 1]" ) );
-    }
-
 }


[11/13] zest-java git commit: rest: remove Iterables usage

Posted by pa...@apache.org.
rest: remove Iterables usage


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/df8636b7
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/df8636b7
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/df8636b7

Branch: refs/heads/develop
Commit: df8636b7f8cfb62db5d6ea4aa218d55d2eb8f09b
Parents: ff0f3be
Author: Paul Merlin <pa...@apache.org>
Authored: Fri Dec 9 00:18:44 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Fri Dec 9 00:21:14 2016 +0100

----------------------------------------------------------------------
 .../server/restlet/freemarker/ValueCompositeTemplateModel.java  | 1 -
 .../java/org/apache/zest/library/rest/admin/EntityResource.java | 5 ++---
 2 files changed, 2 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/df8636b7/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/freemarker/ValueCompositeTemplateModel.java
----------------------------------------------------------------------
diff --git a/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/freemarker/ValueCompositeTemplateModel.java b/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/freemarker/ValueCompositeTemplateModel.java
index 7a2b597..c9ce47f 100644
--- a/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/freemarker/ValueCompositeTemplateModel.java
+++ b/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/freemarker/ValueCompositeTemplateModel.java
@@ -32,7 +32,6 @@ import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.property.Property;
 import org.apache.zest.api.value.ValueComposite;
 import org.apache.zest.api.value.ValueDescriptor;
-import org.apache.zest.functional.Iterables;
 
 /**
  * TODO

http://git-wip-us.apache.org/repos/asf/zest-java/blob/df8636b7/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntityResource.java
----------------------------------------------------------------------
diff --git a/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntityResource.java b/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntityResource.java
index bd6d5e0..aae0384 100644
--- a/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntityResource.java
+++ b/libraries/rest/src/main/java/org/apache/zest/library/rest/admin/EntityResource.java
@@ -30,6 +30,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.entity.EntityDescriptor;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.identity.Identity;
@@ -43,7 +44,6 @@ import org.apache.zest.api.usecase.Usecase;
 import org.apache.zest.api.usecase.UsecaseBuilder;
 import org.apache.zest.api.value.ValueSerialization;
 import org.apache.zest.api.value.ValueSerializationException;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.library.rdf.entity.EntityStateSerializer;
 import org.apache.zest.library.rdf.serializer.RdfXmlSerializer;
 import org.apache.zest.spi.entity.EntityState;
@@ -492,8 +492,7 @@ public class EntityResource
                         }
 
                         // Remove "left-overs"
-                        Iterables.toList( namedAssociation )
-                            .stream()
+                        StreamSupport.stream( namedAssociation.spliterator(), false )
                             .filter( assocName -> !names.contains( assocName ) )
                             .forEach( namedAssociation::remove );
                     }


[02/13] zest-java git commit: bootstrap: minor, simplify

Posted by pa...@apache.org.
bootstrap: minor, simplify


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/a6ba8b55
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/a6ba8b55
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/a6ba8b55

Branch: refs/heads/develop
Commit: a6ba8b55d5539ba6fbe57884100f88567cb63b8a
Parents: 447695d
Author: Paul Merlin <pa...@apache.org>
Authored: Tue Dec 6 19:06:16 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Tue Dec 6 19:06:16 2016 +0100

----------------------------------------------------------------------
 .../java/org/apache/zest/bootstrap/builder/LayerDeclaration.java | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/a6ba8b55/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/LayerDeclaration.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/LayerDeclaration.java b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/LayerDeclaration.java
index 96e712f..710743e 100644
--- a/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/LayerDeclaration.java
+++ b/core/bootstrap/src/main/java/org/apache/zest/bootstrap/builder/LayerDeclaration.java
@@ -29,8 +29,6 @@ import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.LayerAssembly;
 import org.apache.zest.bootstrap.ModuleAssembly;
 
-import static java.util.stream.Collectors.toCollection;
-
 /**
  * Provides declared {@link org.apache.zest.api.structure.Layer} information that the {@link ApplicationBuilder} can use.
  */
@@ -65,7 +63,7 @@ public class LayerDeclaration
     public LayerDeclaration using( Iterable<String> layerNames )
     {
         StreamSupport.stream( layerNames.spliterator(), false )
-                     .collect( toCollection( () -> using ) );
+                     .forEach( using::add );
         return this;
     }
 


[13/13] zest-java git commit: core: unify value creation shallow copying

Posted by pa...@apache.org.
core: unify value creation shallow copying

State shallow copying on value creation was spread across
- ValueBuilderWithPrototype
- StateResolver & various FunctionStateResolvers

It\u2019s now done on ValueStateInstance creation only

StateResolver now only returns Streams. Using Streams all along the way
allowed to remove duplicate shallow copying and make things more clean.

Added a few stream helpers to deal with Maps, used for NamedAssociation


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/8854b130
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/8854b130
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/8854b130

Branch: refs/heads/develop
Commit: 8854b130634569c8a3ccae2efcc30fe3c3079c5c
Parents: 516f005
Author: Paul Merlin <pa...@apache.org>
Authored: Fri Dec 9 00:40:52 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Fri Dec 9 00:40:52 2016 +0100

----------------------------------------------------------------------
 .../zest/api/association/ManyAssociation.java   |  5 +-
 .../api/association/ManyAssociationWrapper.java |  3 +-
 .../zest/api/association/NamedAssociation.java  |  5 +-
 .../association/NamedAssociationWrapper.java    |  3 +-
 .../apache/zest/api/unitofwork/UnitOfWork.java  |  9 ++-
 .../org/apache/zest/api/util/Collectors.java    | 63 +++++++++++++--
 .../zest/api/value/ValueBuilderFactory.java     |  5 +-
 .../apache/zest/api/util/CollectorsTest.java    | 29 ++++---
 .../apache/zest/runtime/ZestRuntimeImpl.java    | 18 ++---
 .../association/ManyAssociationInstance.java    |  7 +-
 .../association/NamedAssociationInstance.java   |  7 +-
 .../composite/FunctionStateResolver.java        | 80 +++++++++-----------
 .../zest/runtime/composite/StateResolver.java   |  6 +-
 .../zest/runtime/structure/ModuleInstance.java  | 12 +--
 .../BuilderNamedAssociationState.java           |  4 +-
 .../runtime/unitofwork/ModuleUnitOfWork.java    | 63 ++++++---------
 .../value/ValueBuilderWithPrototype.java        | 36 ++-------
 .../zest/runtime/value/ValueStateInstance.java  | 15 ++--
 .../entity/EntityBuilderWithStateTest.java      | 12 +--
 .../runtime/value/ValueWithAssociationTest.java |  4 +-
 .../main/java/org/apache/zest/spi/ZestSPI.java  | 12 +--
 .../zest/spi/entity/ManyAssociationState.java   |  6 ++
 .../zest/spi/entity/NamedAssociationState.java  | 10 +++
 .../spi/value/ValueDeserializerAdapter.java     | 10 ++-
 .../zest/spi/value/ValueSerializerAdapter.java  |  5 +-
 .../requestreader/DefaultRequestReader.java     | 15 ++--
 .../binding/internal/BoundManyAssociation.java  |  3 +-
 .../binding/internal/BoundNamedAssociation.java |  3 +-
 28 files changed, 241 insertions(+), 209 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/association/ManyAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/association/ManyAssociation.java b/core/api/src/main/java/org/apache/zest/api/association/ManyAssociation.java
index 78c0ff9..0283d62 100644
--- a/core/api/src/main/java/org/apache/zest/api/association/ManyAssociation.java
+++ b/core/api/src/main/java/org/apache/zest/api/association/ManyAssociation.java
@@ -22,6 +22,7 @@ package org.apache.zest.api.association;
 
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -50,8 +51,8 @@ public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation
     Set<T> toSet();
 
     /**
-     * Returns an unmodifiable Iterable of the references to the associated entities.
+     * Returns a stream of the references to the associated entities.
      * @return the references to the associated entities.
      */
-    Iterable<EntityReference> references();
+    Stream<EntityReference> references();
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/association/ManyAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/association/ManyAssociationWrapper.java b/core/api/src/main/java/org/apache/zest/api/association/ManyAssociationWrapper.java
index e9e5a10..eda0fd7 100644
--- a/core/api/src/main/java/org/apache/zest/api/association/ManyAssociationWrapper.java
+++ b/core/api/src/main/java/org/apache/zest/api/association/ManyAssociationWrapper.java
@@ -22,6 +22,7 @@ package org.apache.zest.api.association;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -93,7 +94,7 @@ public class ManyAssociationWrapper
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<EntityReference> references()
     {
         return next.references();
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/association/NamedAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/association/NamedAssociation.java b/core/api/src/main/java/org/apache/zest/api/association/NamedAssociation.java
index fa61948..aced892 100644
--- a/core/api/src/main/java/org/apache/zest/api/association/NamedAssociation.java
+++ b/core/api/src/main/java/org/apache/zest/api/association/NamedAssociation.java
@@ -20,6 +20,7 @@
 package org.apache.zest.api.association;
 
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -78,10 +79,10 @@ public interface NamedAssociation<T>
     Map<String, T> toMap();
 
     /**
-     * Returns an unmodifiable Iterable of the references to the associated entities.
+     * Returns a stream of the references to the associated entities.
      * @return the references to the associated entities.
      */
-    Iterable<EntityReference> references();
+    Stream<Map.Entry<String, EntityReference>> references();
 
     /** Returns the EntityReference for the Association with the given name.
      *

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/association/NamedAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/association/NamedAssociationWrapper.java b/core/api/src/main/java/org/apache/zest/api/association/NamedAssociationWrapper.java
index 42ee180..d67dbbf 100644
--- a/core/api/src/main/java/org/apache/zest/api/association/NamedAssociationWrapper.java
+++ b/core/api/src/main/java/org/apache/zest/api/association/NamedAssociationWrapper.java
@@ -21,6 +21,7 @@ package org.apache.zest.api.association;
 
 import java.util.Iterator;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -92,7 +93,7 @@ public class NamedAssociationWrapper
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<Map.Entry<String, EntityReference>> references()
     {
         return next.references();
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/unitofwork/UnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/unitofwork/UnitOfWork.java b/core/api/src/main/java/org/apache/zest/api/unitofwork/UnitOfWork.java
index b8c2338..844562c 100644
--- a/core/api/src/main/java/org/apache/zest/api/unitofwork/UnitOfWork.java
+++ b/core/api/src/main/java/org/apache/zest/api/unitofwork/UnitOfWork.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.association.NamedAssociation;
@@ -217,8 +218,8 @@ public interface UnitOfWork extends MetaInfoHolder, AutoCloseable
     <T> EntityBuilder<T> newEntityBuilderWithState( Class<T> type,
                                                     Function<PropertyDescriptor, Object> propertyFunction,
                                                     Function<AssociationDescriptor, EntityReference> associationFunction,
-                                                    Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                                    Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+                                                    Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+                                                    Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction
     )
         throws NoSuchEntityTypeException, AmbiguousTypeException;
 
@@ -245,8 +246,8 @@ public interface UnitOfWork extends MetaInfoHolder, AutoCloseable
     <T> EntityBuilder<T> newEntityBuilderWithState( Class<T> type, @Optional Identity identity,
                                                     Function<PropertyDescriptor, Object> propertyFunction,
                                                     Function<AssociationDescriptor, EntityReference> associationFunction,
-                                                    Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                                    Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+                                                    Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+                                                    Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction
     )
         throws NoSuchEntityTypeException, AmbiguousTypeException;
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/util/Collectors.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/util/Collectors.java b/core/api/src/main/java/org/apache/zest/api/util/Collectors.java
index c977059..d77bc0d 100644
--- a/core/api/src/main/java/org/apache/zest/api/util/Collectors.java
+++ b/core/api/src/main/java/org/apache/zest/api/util/Collectors.java
@@ -17,7 +17,10 @@
  */
 package org.apache.zest.api.util;
 
+import java.util.Map;
 import java.util.Optional;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collector;
 
@@ -29,25 +32,73 @@ public class Collectors
      * @return The single element
      * @throws IllegalArgumentException if no or more than one element
      */
-    public static <T> Collector<T, ?, T> single()
+    public static <T>
+    Collector<T, ?, T> single()
         throws IllegalArgumentException
     {
         Supplier<T> thrower = () ->
         {
             throw new IllegalArgumentException( "No or more than one element in stream" );
         };
-        return java.util.stream.Collectors.collectingAndThen( singleOrEmpty(),
+        return java.util.stream.Collectors.collectingAndThen( java.util.stream.Collectors.reducing( ( a, b ) -> null ),
                                                               optional -> optional.orElseGet( thrower ) );
     }
 
     /**
-     * Collect an optional single element.
+     * Eventually collect a single element.
      * @param <T> Element type
-     * @return An optional single element, empty if no or more than one element
+     * @return The single element, optional
+     * @throws IllegalArgumentException if more than one element
      */
-    public static <T> Collector<T, ?, Optional<T>> singleOrEmpty()
+    public static <T>
+    Collector<T, ?, Optional<T>> singleOrEmpty()
+        throws IllegalArgumentException
+    {
+        return java.util.stream.Collectors.reducing(
+            ( left, right ) ->
+            {
+                if( left != null && right != null )
+                {
+                    throw new IllegalArgumentException( "More than one element in stream" );
+                }
+                if( left != null )
+                {
+                    return left;
+                }
+                return right;
+            } );
+    }
+
+    public static <T, K, U, M extends Map<K, U>>
+    Collector<T, ?, M> toMap( Function<? super T, ? extends K> keyMapper,
+                              Function<? super T, ? extends U> valueMapper,
+                              Supplier<M> mapSupplier )
+    {
+        return java.util.stream.Collectors.toMap( keyMapper,
+                                                  valueMapper,
+                                                  throwingMerger(),
+                                                  mapSupplier );
+    }
+
+
+    public static <T extends Map.Entry<K, U>, K, U>
+    Collector<T, ?, Map<K, U>> toMap()
     {
-        return java.util.stream.Collectors.reducing( ( a, b ) -> null );
+        return java.util.stream.Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue );
+    }
+
+    public static <T extends Map.Entry<K, U>, K, U, M extends Map<K, U>>
+    Collector<T, ?, M> toMap( Supplier<M> mapSupplier )
+    {
+        return toMap( Map.Entry::getKey, Map.Entry::getValue, mapSupplier );
+    }
+
+    private static <T> BinaryOperator<T> throwingMerger()
+    {
+        return ( left, right ) ->
+        {
+            throw new IllegalStateException( String.format( "Duplicate key %s", left ) );
+        };
     }
 
     private Collectors() {}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/main/java/org/apache/zest/api/value/ValueBuilderFactory.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/value/ValueBuilderFactory.java b/core/api/src/main/java/org/apache/zest/api/value/ValueBuilderFactory.java
index 040f3d4..3a61b1a 100644
--- a/core/api/src/main/java/org/apache/zest/api/value/ValueBuilderFactory.java
+++ b/core/api/src/main/java/org/apache/zest/api/value/ValueBuilderFactory.java
@@ -21,6 +21,7 @@ package org.apache.zest.api.value;
 
 import java.util.Map;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.common.ConstructionException;
 import org.apache.zest.api.entity.EntityReference;
@@ -87,8 +88,8 @@ public interface ValueBuilderFactory
     <T> ValueBuilder<T> newValueBuilderWithState( Class<T> mixinType,
                                                   Function<PropertyDescriptor, Object> propertyFunction,
                                                   Function<AssociationDescriptor, EntityReference> associationFunction,
-                                                  Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                                  Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction );
+                                                  Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+                                                  Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction );
 
     /**
      * Instantiate a Value of the given type using the serialized state given as String.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/api/src/test/java/org/apache/zest/api/util/CollectorsTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/zest/api/util/CollectorsTest.java b/core/api/src/test/java/org/apache/zest/api/util/CollectorsTest.java
index 6aeb871..7d9ade2 100644
--- a/core/api/src/test/java/org/apache/zest/api/util/CollectorsTest.java
+++ b/core/api/src/test/java/org/apache/zest/api/util/CollectorsTest.java
@@ -29,15 +29,6 @@ import static org.junit.Assert.fail;
 public class CollectorsTest
 {
     @Test
-    public void singleOrEmpty()
-    {
-        assertEquals( Optional.empty(), Stream.of().collect( Collectors.singleOrEmpty() ) );
-        assertEquals( Optional.of( 1 ), Stream.of( 1 ).collect( Collectors.singleOrEmpty() ) );
-        assertEquals( Optional.empty(), Stream.of( 1, 1 ).collect( Collectors.singleOrEmpty() ) );
-        assertEquals( Optional.empty(), Stream.of( 1, 1, 1 ).collect( Collectors.singleOrEmpty() ) );
-    }
-
-    @Test
     public void single()
     {
         assertThat( Stream.of( 1L ).collect( Collectors.single() ), is( 1L ) );
@@ -61,4 +52,24 @@ public class CollectorsTest
         }
         catch( IllegalArgumentException ex ) {}
     }
+
+    @Test
+    public void singleOrEmpty()
+    {
+        assertEquals( Optional.empty(), Stream.of().collect( Collectors.singleOrEmpty() ) );
+        assertEquals( Optional.of( 1 ), Stream.of( 1 ).collect( Collectors.singleOrEmpty() ) );
+
+        try
+        {
+            Stream.of( 1, 1 ).collect( Collectors.singleOrEmpty() );
+            fail( "Should have failed" );
+        }
+        catch( IllegalArgumentException ex ) {}
+        try
+        {
+            Stream.of( 1, 1, 1 ).collect( Collectors.singleOrEmpty() );
+            fail( "Should have failed" );
+        }
+        catch( IllegalArgumentException ex ) {}
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/ZestRuntimeImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/ZestRuntimeImpl.java b/core/runtime/src/main/java/org/apache/zest/runtime/ZestRuntimeImpl.java
index 46531e1..d705546 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/ZestRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/ZestRuntimeImpl.java
@@ -22,6 +22,7 @@ package org.apache.zest.runtime;
 import java.lang.reflect.InvocationHandler;
 import java.util.Arrays;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.association.AbstractAssociation;
 import org.apache.zest.api.association.Association;
@@ -56,9 +57,6 @@ import org.apache.zest.bootstrap.ApplicationAssemblyFactory;
 import org.apache.zest.bootstrap.ApplicationModelFactory;
 import org.apache.zest.bootstrap.ZestRuntime;
 import org.apache.zest.runtime.association.AbstractAssociationInstance;
-import org.apache.zest.runtime.association.AssociationInstance;
-import org.apache.zest.runtime.association.ManyAssociationInstance;
-import org.apache.zest.runtime.association.NamedAssociationInstance;
 import org.apache.zest.runtime.bootstrap.ApplicationAssemblyFactoryImpl;
 import org.apache.zest.runtime.bootstrap.ApplicationModelFactoryImpl;
 import org.apache.zest.runtime.composite.ProxyReferenceInvocationHandler;
@@ -343,22 +341,20 @@ public final class ZestRuntimeImpl
     }
 
     @Override
-    public EntityReference entityReferenceOf( Association assoc )
+    public EntityReference entityReferenceOf( Association<?> assoc )
     {
-        @SuppressWarnings( "unchecked" )
-        Property<EntityReference> associationState = ( (AssociationInstance) assoc ).getAssociationState();
-        return associationState.get();
+        return assoc.reference();
     }
 
     @Override
-    public Iterable<EntityReference> entityReferenceOf( ManyAssociation assoc )
+    public Stream<EntityReference> entityReferencesOf( ManyAssociation<?> assoc )
     {
-        return ( (ManyAssociationInstance) assoc ).getManyAssociationState();
+        return assoc.references();
     }
 
     @Override
-    public Iterable<Map.Entry<String, EntityReference>> entityReferenceOf( NamedAssociation assoc )
+    public Stream<Map.Entry<String, EntityReference>> entityReferencesOf( NamedAssociation<?> assoc )
     {
-        return ( (NamedAssociationInstance) assoc ).getEntityReferences();
+        return assoc.references();
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
index 1d21029..6a50ee9 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/ManyAssociationInstance.java
@@ -26,8 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.BiFunction;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.association.ManyAssociationWrapper;
@@ -123,9 +122,9 @@ public class ManyAssociationInstance<T>
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<EntityReference> references()
     {
-        return StreamSupport.stream( manyAssociationState.spliterator(), false ).collect( Collectors.toList() );
+        return manyAssociationState.stream();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
index 147fcc2..27e2826 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/association/NamedAssociationInstance.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.NamedAssociation;
@@ -111,11 +112,9 @@ public class NamedAssociationInstance<T>
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<Map.Entry<String, EntityReference>> references()
     {
-        return StreamSupport.stream( namedAssociationState.spliterator(), false )
-                            .map( namedAssociationState::get )
-                            .collect( Collectors.toList() );
+        return namedAssociationState.stream();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
index 73bc4a8..10ceeed 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/FunctionStateResolver.java
@@ -19,9 +19,9 @@
  */
 package org.apache.zest.runtime.composite;
 
-import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.property.PropertyDescriptor;
@@ -30,9 +30,6 @@ import org.apache.zest.spi.entity.EntityState;
 import org.apache.zest.spi.entity.ManyAssociationState;
 import org.apache.zest.spi.entity.NamedAssociationState;
 
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.StreamSupport.stream;
-
 /**
  * Function based StateResolver.
  */
@@ -41,13 +38,13 @@ public class FunctionStateResolver
 {
     final Function<PropertyDescriptor, Object> propertyFunction;
     final Function<AssociationDescriptor, EntityReference> associationFunction;
-    final Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction;
-    final Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction;
+    final Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction;
+    final Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction;
 
     public FunctionStateResolver( Function<PropertyDescriptor, Object> propertyFunction,
                                   Function<AssociationDescriptor, EntityReference> associationFunction,
-                                  Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                  Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction )
+                                  Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+                                  Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction )
     {
         this.propertyFunction = propertyFunction;
         this.associationFunction = associationFunction;
@@ -68,54 +65,51 @@ public class FunctionStateResolver
     }
 
     @Override
-    public List<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor )
+    public Stream<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor )
     {
-        // FIXME Do not shallow copy here
-        return stream( manyAssociationFunction.apply( associationDescriptor ).spliterator(), false )
-            .collect( toList() );
+        return manyAssociationFunction.apply( associationDescriptor );
     }
 
     @Override
-    public Map<String, EntityReference> getNamedAssociationState( AssociationDescriptor associationDescriptor )
+    public Stream<Map.Entry<String, EntityReference>> getNamedAssociationState(
+        AssociationDescriptor associationDescriptor )
     {
         return namedAssociationFunction.apply( associationDescriptor );
     }
 
     public void populateState( EntityModel model, EntityState state )
     {
-        model.state().properties().forEach( propDesc -> {
-            Object value = getPropertyState( propDesc );
-            state.setPropertyValue( propDesc.qualifiedName(), value );
-        } );
-        model.state().associations().forEach( assDesc -> {
-            EntityReference ref = getAssociationState( assDesc );
-            state.setAssociationValue( assDesc.qualifiedName(), ref );
-        } );
-        model.state().manyAssociations().forEach( manyAssDesc -> {
-            ManyAssociationState associationState = state.manyAssociationValueOf( manyAssDesc.qualifiedName() );
-            // First clear existing ones
-            for( EntityReference ref : associationState )
+        model.state().properties().forEach(
+            propDesc ->
             {
-                associationState.remove( ref );
-            }
-            // then add the new ones.
-            for( EntityReference ref : getManyAssociationState( manyAssDesc ) )
+                Object value = getPropertyState( propDesc );
+                state.setPropertyValue( propDesc.qualifiedName(), value );
+            } );
+        model.state().associations().forEach(
+            assDesc ->
             {
-                associationState.add( 0, ref );
-            }
-        } );
-        model.state().namedAssociations().forEach( namedAssDesc -> {
-            NamedAssociationState associationState = state.namedAssociationValueOf( namedAssDesc.qualifiedName() );
-            // First clear existing ones
-            for( String name : associationState )
+                EntityReference ref = getAssociationState( assDesc );
+                state.setAssociationValue( assDesc.qualifiedName(), ref );
+            } );
+        model.state().manyAssociations().forEach(
+            manyAssDesc ->
             {
-                associationState.remove( name );
-            }
-            // then add the new ones.
-            for( Map.Entry<String, EntityReference> entry : getNamedAssociationState( namedAssDesc ).entrySet() )
+                ManyAssociationState associationState = state.manyAssociationValueOf( manyAssDesc.qualifiedName() );
+                // First clear existing ones
+                associationState.forEach( associationState::remove );
+                // then add the new ones.
+                getManyAssociationState( manyAssDesc )
+                    .forEach( ref -> associationState.add( 0, ref ) );
+            } );
+        model.state().namedAssociations().forEach(
+            namedAssDesc ->
             {
-                associationState.put( entry.getKey(), entry.getValue() );
-            }
-        } );
+                NamedAssociationState associationState = state.namedAssociationValueOf( namedAssDesc.qualifiedName() );
+                // First clear existing ones
+                associationState.forEach( associationState::remove );
+                // then add the new ones.
+                getNamedAssociationState( namedAssDesc )
+                    .forEach( entry -> associationState.put( entry.getKey(), entry.getValue() ) );
+            } );
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateResolver.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateResolver.java
index 129a27b..0e7408b 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateResolver.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/StateResolver.java
@@ -19,8 +19,8 @@
  */
 package org.apache.zest.runtime.composite;
 
-import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.property.PropertyDescriptor;
@@ -34,7 +34,7 @@ public interface StateResolver
 
     EntityReference getAssociationState( AssociationDescriptor associationDescriptor );
 
-    List<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor );
+    Stream<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor );
 
-    Map<String, EntityReference> getNamedAssociationState( AssociationDescriptor associationDescriptor );
+    Stream<Map.Entry<String, EntityReference>> getNamedAssociationState( AssociationDescriptor associationDescriptor );
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
index 7a8a72d..b101716 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/structure/ModuleInstance.java
@@ -261,8 +261,8 @@ public class ModuleInstance
     public <T> ValueBuilder<T> newValueBuilderWithState( Class<T> mixinType,
                                                          Function<PropertyDescriptor, Object> propertyFunction,
                                                          Function<AssociationDescriptor, EntityReference> associationFunction,
-                                                         Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-                                                         Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+                                                         Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+                                                         Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction
     )
     {
         NullArgumentException.validateNotNull( "propertyFunction", propertyFunction );
@@ -306,15 +306,15 @@ public class ModuleInstance
         }
 
         @Override
-        public List<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor )
+        public Stream<EntityReference> getManyAssociationState( AssociationDescriptor associationDescriptor )
         {
-            return new ArrayList<>();
+            return new ArrayList<EntityReference>().stream();
         }
 
         @Override
-        public Map<String, EntityReference> getNamedAssociationState( AssociationDescriptor associationDescriptor )
+        public Stream<Map.Entry<String, EntityReference>> getNamedAssociationState( AssociationDescriptor associationDescriptor )
         {
-            return new HashMap<>();
+            return new HashMap<String, EntityReference>().entrySet().stream();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/BuilderNamedAssociationState.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/BuilderNamedAssociationState.java b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/BuilderNamedAssociationState.java
index 932388f..fc02340 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/BuilderNamedAssociationState.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/BuilderNamedAssociationState.java
@@ -19,8 +19,8 @@
  */
 package org.apache.zest.runtime.unitofwork;
 
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.spi.entity.NamedAssociationState;
@@ -36,7 +36,7 @@ public final class BuilderNamedAssociationState
 
     public BuilderNamedAssociationState()
     {
-        references = new HashMap<>();
+        references = new LinkedHashMap<>();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
index 4f22d69..19fea5d 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/unitofwork/ModuleUnitOfWork.java
@@ -22,7 +22,6 @@ package org.apache.zest.runtime.unitofwork;
 
 import java.time.Instant;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -69,8 +68,6 @@ import org.apache.zest.api.util.NullArgumentException;
 import org.apache.zest.api.value.ValueBuilder;
 import org.apache.zest.api.value.ValueComposite;
 import org.apache.zest.runtime.association.AssociationInstance;
-import org.apache.zest.runtime.association.ManyAssociationInstance;
-import org.apache.zest.runtime.association.NamedAssociationInstance;
 import org.apache.zest.runtime.composite.FunctionStateResolver;
 import org.apache.zest.runtime.entity.EntityInstance;
 import org.apache.zest.runtime.entity.EntityModel;
@@ -78,7 +75,6 @@ import org.apache.zest.runtime.property.PropertyModel;
 import org.apache.zest.runtime.value.ValueInstance;
 import org.apache.zest.spi.entity.EntityState;
 import org.apache.zest.spi.entity.EntityStatus;
-import org.apache.zest.spi.entity.NamedAssociationState;
 import org.apache.zest.spi.entitystore.EntityStore;
 import org.apache.zest.spi.module.ModuleSpi;
 import org.apache.zest.spi.query.EntityFinder;
@@ -215,8 +211,8 @@ public class ModuleUnitOfWork
         Class<T> type,
         Function<PropertyDescriptor, Object> propertyFunction,
         Function<AssociationDescriptor, EntityReference> associationFunction,
-        Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-        Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+        Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+        Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction
     )
         throws NoSuchEntityTypeException
     {
@@ -232,8 +228,8 @@ public class ModuleUnitOfWork
         Class<T> type, Identity identity,
         Function<PropertyDescriptor, Object> propertyFunction,
         Function<AssociationDescriptor, EntityReference> associationFunction,
-        Function<AssociationDescriptor, Iterable<EntityReference>> manyAssociationFunction,
-        Function<AssociationDescriptor, Map<String, EntityReference>> namedAssociationFunction
+        Function<AssociationDescriptor, Stream<EntityReference>> manyAssociationFunction,
+        Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssociationFunction
     )
         throws NoSuchEntityTypeException
     {
@@ -434,8 +430,8 @@ public class ModuleUnitOfWork
     {
         Function<PropertyDescriptor, Object> propertyFunction = new ToValuePropertyMappingFunction( entityComposite );
         Function<AssociationDescriptor, EntityReference> assocationFunction = new ToValueAssociationMappingFunction<>( entityComposite );
-        Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToValueManyAssociationMappingFunction<>( entityComposite );
-        Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToValueNameAssociationMappingFunction<>( entityComposite );
+        Function<AssociationDescriptor, Stream<EntityReference>> manyAssocFunction = new ToValueManyAssociationMappingFunction<>( entityComposite );
+        Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssocFunction = new ToValueNameAssociationMappingFunction<>( entityComposite );
 
         @SuppressWarnings( "unchecked" )
         ValueBuilder<T> builder = module().instance().newValueBuilderWithState(
@@ -487,8 +483,8 @@ public class ModuleUnitOfWork
     {
         Function<PropertyDescriptor, Object> propertyFunction = new ToEntityPropertyMappingFunction<>( valueComposite );
         Function<AssociationDescriptor, EntityReference> assocationFunction = new ToEntityAssociationMappingFunction<>( valueComposite );
-        Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToEntityManyAssociationMappingFunction<>( valueComposite );
-        Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToEntityNameAssociationMappingFunction<>( valueComposite );
+        Function<AssociationDescriptor, Stream<EntityReference>> manyAssocFunction = new ToEntityManyAssociationMappingFunction<>( valueComposite );
+        Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>> namedAssocFunction = new ToEntityNameAssociationMappingFunction<>( valueComposite );
 
         try
         {
@@ -660,7 +656,7 @@ public class ModuleUnitOfWork
     }
 
     private class ToValueManyAssociationMappingFunction<T>
-        implements Function<AssociationDescriptor, Iterable<EntityReference>>
+        implements Function<AssociationDescriptor, Stream<EntityReference>>
     {
         private final T entity;
 
@@ -670,15 +666,15 @@ public class ModuleUnitOfWork
         }
 
         @Override
-        public Iterable<EntityReference> apply( AssociationDescriptor associationDescriptor )
+        public Stream<EntityReference> apply( AssociationDescriptor associationDescriptor )
         {
             EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
-            return entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() );
+            return entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() ).stream();
         }
     }
 
     private class ToValueNameAssociationMappingFunction<T>
-        implements Function<AssociationDescriptor, Map<String, EntityReference>>
+        implements Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>>
     {
         private final T entity;
 
@@ -688,16 +684,10 @@ public class ModuleUnitOfWork
         }
 
         @Override
-        public Map<String, EntityReference> apply( AssociationDescriptor associationDescriptor )
+        public Stream<Map.Entry<String, EntityReference>> apply( AssociationDescriptor associationDescriptor )
         {
-            Map<String, EntityReference> result = new HashMap<>();
             EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
-            final NamedAssociationState state = entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() );
-            for( String name : state )
-            {
-                result.put( name, state.get( name ) );
-            }
-            return result;
+            return entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() ).stream();
         }
     }
 
@@ -741,7 +731,7 @@ public class ModuleUnitOfWork
     }
 
     private class ToEntityManyAssociationMappingFunction<T>
-        implements Function<AssociationDescriptor, Iterable<EntityReference>>
+        implements Function<AssociationDescriptor, Stream<EntityReference>>
     {
 
         private final T value;
@@ -752,17 +742,15 @@ public class ModuleUnitOfWork
         }
 
         @Override
-        public Iterable<EntityReference> apply( AssociationDescriptor associationDescriptor )
+        public Stream<EntityReference> apply( AssociationDescriptor associationDescriptor )
         {
-            AssociationStateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
-            ManyAssociationInstance<T> association =
-                (ManyAssociationInstance<T>) state.manyAssociationFor( associationDescriptor.accessor() );
-            return association.getManyAssociationState();
+            ValueInstance valueInstance = ValueInstance.valueInstanceOf( (ValueComposite) value );
+            return valueInstance.state().manyAssociationFor( associationDescriptor.accessor() ).references();
         }
     }
 
     private class ToEntityNameAssociationMappingFunction<T>
-        implements Function<AssociationDescriptor, Map<String, EntityReference>>
+        implements Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>>
     {
         private final T value;
 
@@ -772,17 +760,10 @@ public class ModuleUnitOfWork
         }
 
         @Override
-        public Map<String, EntityReference> apply( AssociationDescriptor associationDescriptor )
+        public Stream<Map.Entry<String, EntityReference>> apply( AssociationDescriptor associationDescriptor )
         {
-            AssociationStateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
-            NamedAssociationInstance<T> association =
-                (NamedAssociationInstance<T>) state.namedAssociationFor( associationDescriptor.accessor() );
-            HashMap<String, EntityReference> result = new HashMap<>();
-            for( Map.Entry<String, EntityReference> entry : association.getEntityReferences() )
-            {
-                result.put( entry.getKey(), entry.getValue() );
-            }
-            return result;
+            ValueInstance valueInstance = ValueInstance.valueInstanceOf( (ValueComposite) value );
+            return valueInstance.state().namedAssociationFor( associationDescriptor.accessor() ).references();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderWithPrototype.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderWithPrototype.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderWithPrototype.java
index 7891986..b72706b 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderWithPrototype.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueBuilderWithPrototype.java
@@ -19,12 +19,11 @@
  */
 package org.apache.zest.runtime.value;
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.AssociationDescriptor;
 import org.apache.zest.api.association.AssociationStateHolder;
-import org.apache.zest.api.association.NamedAssociation;
 import org.apache.zest.api.common.ConstructionException;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.property.PropertyDescriptor;
@@ -54,8 +53,6 @@ public class ValueBuilderWithPrototype<T>
     )
     {
         valueModel = (ValueModel) compositeModelModule;
-        // Only shallow clone, as all generic types of the ValueComposites are expected to be Immutable.
-
         MixinsModel mixinsModel = valueModel.mixinsModel();
         Object[] mixins = mixinsModel.newMixinHolder();
         final ValueStateInstance prototypeState = ValueInstance.valueInstanceOf( (ValueComposite) prototype ).state();
@@ -79,21 +76,6 @@ public class ValueBuilderWithPrototype<T>
             mixins[ i++ ] = mixinModel.newInstance( injectionContext );
         }
 
-//        // Use serialization-deserialization to make a copy of the prototype
-//        final Object value;
-//        try
-//        {
-//            // @TODO there is probably a more efficient way to do this
-//            ValueSerialization valueSerialization = currentModule.valueSerialization();
-//            String serialized = valueSerialization.serialize( prototype );
-//            value = valueSerialization.deserialize( valueModel.valueType(), serialized);
-//        }
-//        catch( ValueSerializationException e )
-//        {
-//            throw new IllegalStateException( "Could not serialize-copy Value", e );
-//        }
-
-//        ValueInstance valueInstance = ValueInstance.valueInstanceOf( (ValueComposite) value );
         valueInstance.prepareToBuild();
         this.prototypeInstance = valueInstance;
     }
@@ -185,7 +167,7 @@ public class ValueBuilderWithPrototype<T>
     }
 
     private static class AssociationDescriptorIterableFunction
-        implements Function<AssociationDescriptor, Iterable<EntityReference>>
+        implements Function<AssociationDescriptor, Stream<EntityReference>>
     {
         private final ValueStateInstance prototypeState;
 
@@ -195,14 +177,14 @@ public class ValueBuilderWithPrototype<T>
         }
 
         @Override
-        public Iterable<EntityReference> apply( AssociationDescriptor descriptor )
+        public Stream<EntityReference> apply( AssociationDescriptor descriptor )
         {
             return prototypeState.manyAssociationFor( descriptor.accessor() ).references();
         }
     }
 
     private static class AssociationDescriptorMapFunction
-        implements Function<AssociationDescriptor, Map<String, EntityReference>>
+        implements Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>>
     {
         private final ValueStateInstance prototypeState;
 
@@ -212,15 +194,9 @@ public class ValueBuilderWithPrototype<T>
         }
 
         @Override
-        public Map<String, EntityReference> apply( AssociationDescriptor descriptor )
+        public Stream<Map.Entry<String, EntityReference>> apply( AssociationDescriptor descriptor )
         {
-            Map<String, EntityReference> result = new HashMap<>();
-            NamedAssociation<?> namedAssociation = prototypeState.namedAssociationFor( descriptor.accessor() );
-            for( String name : namedAssociation )
-            {
-                result.put( name, namedAssociation.referenceOf( name ) );
-            }
-            return result;
+            return prototypeState.namedAssociationFor( descriptor.accessor() ).references();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
index d6bca20..f12f57c 100644
--- a/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
+++ b/core/runtime/src/main/java/org/apache/zest/runtime/value/ValueStateInstance.java
@@ -37,6 +37,9 @@ import org.apache.zest.runtime.property.PropertyInstance;
 import org.apache.zest.runtime.structure.ModuleInstance;
 import org.apache.zest.runtime.unitofwork.EntityFunction;
 
+import static java.util.stream.Collectors.toList;
+import static org.apache.zest.api.util.Collectors.toMap;
+
 /**
  * TODO
  */
@@ -89,9 +92,9 @@ public final class ValueStateInstance
 
         this.manyAssociations = new LinkedHashMap<>();
         valueModel.state().manyAssociations().forEach( associationDescriptor -> {
-            AssociationInfo builderInfo = associationDescriptor
-                .getBuilderInfo();
-            List<EntityReference> value = stateResolver.getManyAssociationState( associationDescriptor );
+            AssociationInfo builderInfo = associationDescriptor.getBuilderInfo();
+            List<EntityReference> value = stateResolver.getManyAssociationState( associationDescriptor )
+                                                       .collect( toList() );
             ManyAssociationValueState manyAssociationState = new ManyAssociationValueState( value );
             ManyAssociationInstance<Object> associationInstance = new ManyAssociationInstance<>(
                 builderInfo,
@@ -102,9 +105,9 @@ public final class ValueStateInstance
 
         this.namedAssociations = new LinkedHashMap<>();
         valueModel.state().namedAssociations().forEach( associationDescriptor -> {
-            AssociationInfo builderInfo = associationDescriptor
-                .getBuilderInfo();
-            Map<String, EntityReference> value = stateResolver.getNamedAssociationState( associationDescriptor );
+            AssociationInfo builderInfo = associationDescriptor.getBuilderInfo();
+            Map<String, EntityReference> value = stateResolver.getNamedAssociationState( associationDescriptor )
+                                                              .collect( toMap( LinkedHashMap::new ) );
             NamedAssociationValueState namedAssociationState = new NamedAssociationValueState( value );
             NamedAssociationInstance<Object> associationInstance = new NamedAssociationInstance<>(
                 builderInfo,

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/test/java/org/apache/zest/runtime/entity/EntityBuilderWithStateTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/entity/EntityBuilderWithStateTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/entity/EntityBuilderWithStateTest.java
index fddcf53..6858062 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/entity/EntityBuilderWithStateTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/entity/EntityBuilderWithStateTest.java
@@ -19,11 +19,8 @@
  */
 package org.apache.zest.runtime.entity;
 
-import java.util.Arrays;
 import java.util.Collections;
-import org.apache.zest.api.identity.Identity;
-import org.apache.zest.bootstrap.unitofwork.DefaultUnitOfWorkAssembler;
-import org.junit.Test;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.association.NamedAssociation;
@@ -31,13 +28,16 @@ import org.apache.zest.api.common.Optional;
 import org.apache.zest.api.entity.EntityBuilder;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.identity.HasIdentity;
+import org.apache.zest.api.identity.Identity;
 import org.apache.zest.api.property.Property;
 import org.apache.zest.api.unitofwork.UnitOfWork;
 import org.apache.zest.api.unitofwork.UnitOfWorkCompletionException;
 import org.apache.zest.bootstrap.AssemblyException;
 import org.apache.zest.bootstrap.ModuleAssembly;
+import org.apache.zest.bootstrap.unitofwork.DefaultUnitOfWorkAssembler;
 import org.apache.zest.test.AbstractZestTest;
 import org.apache.zest.test.EntityTestAssembler;
+import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -91,7 +91,7 @@ public class EntityBuilderWithStateTest
                 descriptor -> {
                     if( "manyAss".equals( descriptor.qualifiedName().name() ) )
                     {
-                        return Arrays.asList( EntityReference.create( associatedIdentity ) );
+                        return Stream.of( EntityReference.create( associatedIdentity ) );
                     }
                     return null;
                 },
@@ -101,7 +101,7 @@ public class EntityBuilderWithStateTest
                         return Collections.singletonMap(
                             "foo",
                             EntityReference.create( associatedIdentity )
-                        );
+                        ).entrySet().stream();
                     }
                     return null;
                 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/runtime/src/test/java/org/apache/zest/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/zest/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/apache/zest/runtime/value/ValueWithAssociationTest.java
index 00de555..13ac968 100644
--- a/core/runtime/src/test/java/org/apache/zest/runtime/value/ValueWithAssociationTest.java
+++ b/core/runtime/src/test/java/org/apache/zest/runtime/value/ValueWithAssociationTest.java
@@ -95,10 +95,10 @@ public class ValueWithAssociationTest extends AbstractZestTest
             NamedAssociation<?> namedSimples = holder.allNamedAssociations().iterator().next();
 
             assertThat( spi.entityReferenceOf( simple ), equalTo( EntityReference.create( identity1 ) ) );
-            assertThat( spi.entityReferenceOf( simples )
+            assertThat( spi.entityReferencesOf( simples )
                             .iterator()
                             .next(), equalTo( EntityReference.create( identity1 ) ) );
-            assertThat( spi.entityReferenceOf( namedSimples )
+            assertThat( spi.entityReferencesOf( namedSimples )
                             .iterator()
                             .next()
                             .getValue(), equalTo( EntityReference.create( identity1 ) ) );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/spi/src/main/java/org/apache/zest/spi/ZestSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/ZestSPI.java b/core/spi/src/main/java/org/apache/zest/spi/ZestSPI.java
index 668565e..4a95c2d 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/ZestSPI.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/ZestSPI.java
@@ -21,6 +21,7 @@
 package org.apache.zest.spi;
 
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.ZestAPI;
 import org.apache.zest.api.association.Association;
 import org.apache.zest.api.association.AssociationStateHolder;
@@ -54,22 +55,21 @@ public interface ZestSPI
      * @param assoc The Association for which we want to obtain the EntityReference
      * @return The EntityReference of the given Association.
      */
-    EntityReference entityReferenceOf( Association assoc );
+    EntityReference entityReferenceOf( Association<?> assoc );
 
     /**
      * Fetches the EntityReferences without loading the referenced entities.
      *
      * @param assoc The ManyAssociation for which we want to obtain the EntityReferences.
-     * @return An Iteranble of all the EntityReferences of the given ManyAssociation.
+     * @return A stream of all the EntityReferences of the given ManyAssociation.
      */
-    Iterable<EntityReference> entityReferenceOf( ManyAssociation assoc );
+    Stream<EntityReference> entityReferencesOf( ManyAssociation<?> assoc );
 
     /**
      * Fetches the EntityReferences without loading the referenced entities.
      *
      * @param assoc The NamedAssociation for which we want to obtain the EntityReference
-     * @return An Iteranble of Map.Entry with the name and EntityReference of the given NamedAssociation.
+     * @return A stream of Map.Entry with the names and EntityReferences of the given NamedAssociation.
      */
-    Iterable<Map.Entry<String,EntityReference>> entityReferenceOf( NamedAssociation assoc );
-
+    Stream<Map.Entry<String, EntityReference>> entityReferencesOf( NamedAssociation<?> assoc );
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/spi/src/main/java/org/apache/zest/spi/entity/ManyAssociationState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/entity/ManyAssociationState.java b/core/spi/src/main/java/org/apache/zest/spi/entity/ManyAssociationState.java
index cf0bd01..5fd5232 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/entity/ManyAssociationState.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/entity/ManyAssociationState.java
@@ -20,6 +20,8 @@
 
 package org.apache.zest.spi.entity;
 
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -38,4 +40,8 @@ public interface ManyAssociationState
     boolean remove( EntityReference entityReference );
 
     EntityReference get( int index );
+
+    default Stream<EntityReference> stream() {
+        return StreamSupport.stream( spliterator(), false );
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/spi/src/main/java/org/apache/zest/spi/entity/NamedAssociationState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/entity/NamedAssociationState.java b/core/spi/src/main/java/org/apache/zest/spi/entity/NamedAssociationState.java
index f96f536..a9c0d94 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/entity/NamedAssociationState.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/entity/NamedAssociationState.java
@@ -19,6 +19,10 @@
  */
 package org.apache.zest.spi.entity;
 
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.entity.EntityReference;
 
 /**
@@ -41,4 +45,10 @@ public interface NamedAssociationState
     EntityReference get( String name );
 
     String nameOf( EntityReference entityReference );
+
+    default Stream<Map.Entry<String, EntityReference>> stream()
+    {
+        return StreamSupport.stream( spliterator(), false )
+                            .map( name -> new AbstractMap.SimpleImmutableEntry<>( name, get( name ) ) );
+    }
 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java
index 85884ae..e9b8019 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java
@@ -43,6 +43,8 @@ import java.util.Map;
 import java.util.Scanner;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.identity.Identity;
 import org.apache.zest.api.identity.StringIdentity;
@@ -671,19 +673,19 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
                 Object entityRefs = stateMap.get( manyAssociation.qualifiedName().name() );
                 if( entityRefs == null )
                 {
-                    return Collections.emptySet();
+                    return Stream.empty();
                 }
                 //noinspection unchecked
-                return (Iterable<EntityReference>) entityRefs;
+                return StreamSupport.stream( ( (Iterable<EntityReference>) entityRefs ).spliterator(), false );
             },
             namedAssociation -> {
                 Object entityRefs = stateMap.get( namedAssociation.qualifiedName().name() );
                 if( entityRefs == null )
                 {
-                    return Collections.emptyMap();
+                    return Stream.empty();
                 }
                 //noinspection unchecked
-                return (Map<String, EntityReference>) entityRefs;
+                return ( (Map<String, EntityReference>) entityRefs ).entrySet().stream();
             } );
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java
index 60093fc..cda5e67 100644
--- a/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java
@@ -34,6 +34,7 @@ import java.time.Period;
 import java.time.ZonedDateTime;
 import java.util.Base64;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.function.Function;
@@ -416,10 +417,10 @@ public abstract class ValueSerializerAdapter<OutputType>
                 onFieldStart( output, associationDescriptor.qualifiedName().name() );
                 onValueStart( output );
                 onArrayStart( output );
-                for( EntityReference ref : manyAssociation.references() )
+                for( Iterator<EntityReference> it = manyAssociation.references().iterator(); it.hasNext(); )
                 {
                     onValueStart( output );
-                    onValue( output, ref.identity().toString() );
+                    onValue( output, it.next().identity().toString() );
                     onValueEnd( output );
                 }
                 onArrayEnd( output );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/requestreader/DefaultRequestReader.java
----------------------------------------------------------------------
diff --git a/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/requestreader/DefaultRequestReader.java b/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/requestreader/DefaultRequestReader.java
index b96cc29..9d6cec3 100644
--- a/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/requestreader/DefaultRequestReader.java
+++ b/libraries/rest-server/src/main/java/org/apache/zest/library/rest/server/restlet/requestreader/DefaultRequestReader.java
@@ -28,7 +28,6 @@ import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.time.Period;
 import java.time.ZonedDateTime;
-import java.util.Collections;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Stream;
@@ -332,18 +331,14 @@ public class DefaultRequestReader
                     return null;
                 }
             },
-            (Function<AssociationDescriptor, Iterable<EntityReference>>) associationDescriptor -> {
+            (Function<AssociationDescriptor, Stream<EntityReference>>) associationDescriptor -> {
                 // TODO
-                return Collections.emptySet();
+                return Stream.empty();
             },
-            new Function<AssociationDescriptor, Map<String, EntityReference>>()
+            (Function<AssociationDescriptor, Stream<Map.Entry<String, EntityReference>>>) associationDescriptor ->
             {
-                @Override
-                public Map<String, EntityReference> apply( AssociationDescriptor from )
-                {
-                    // TODO
-                    return Collections.emptyMap();
-                }
+                // TODO
+                return Stream.empty();
             }
         );
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundManyAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundManyAssociation.java b/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundManyAssociation.java
index 0f5870d..6b2e437 100644
--- a/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundManyAssociation.java
+++ b/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundManyAssociation.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.ManyAssociation;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Service;
@@ -79,7 +80,7 @@ public class BoundManyAssociation<T> extends AbstractBinding<T>
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<EntityReference> references()
     {
         return actualAssociations.references();
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/8854b130/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundNamedAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundNamedAssociation.java b/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundNamedAssociation.java
index ecfbf3b..6fc953a 100644
--- a/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundNamedAssociation.java
+++ b/samples/swing/src/main/java/org/apache/zest/sample/swing/binding/internal/BoundNamedAssociation.java
@@ -22,6 +22,7 @@ package org.apache.zest.sample.swing.binding.internal;
 import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.stream.Stream;
 import org.apache.zest.api.association.NamedAssociation;
 import org.apache.zest.api.entity.EntityReference;
 import org.apache.zest.api.injection.scope.Service;
@@ -95,7 +96,7 @@ public class BoundNamedAssociation<T>
     }
 
     @Override
-    public Iterable<EntityReference> references()
+    public Stream<Map.Entry<String, EntityReference>> references()
     {
         return actualAssociations.references();
     }


[09/13] zest-java git commit: query expressions: remove usages of Iterable(s)

Posted by pa...@apache.org.
query expressions: remove usages of Iterable(s)


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/3c34b37e
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/3c34b37e
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/3c34b37e

Branch: refs/heads/develop
Commit: 3c34b37e5921820c5113a432704b7902852a4fd1
Parents: d91227a
Author: Paul Merlin <pa...@apache.org>
Authored: Thu Dec 8 20:18:37 2016 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Thu Dec 8 20:18:37 2016 +0100

----------------------------------------------------------------------
 .../org/apache/zest/api/query/QueryExpressions.java  |  4 ++--
 .../apache/zest/api/query/grammar/AndPredicate.java  |  3 ++-
 .../zest/api/query/grammar/BinaryPredicate.java      | 10 ++++++----
 .../zest/api/query/grammar/ContainsAllPredicate.java | 10 ++++++----
 .../apache/zest/api/query/grammar/OrPredicate.java   |  3 ++-
 .../index/elasticsearch/ElasticSearchFinder.java     | 10 +++++-----
 .../index/rdf/query/internal/RdfQueryParserImpl.java | 15 +++------------
 .../sql/support/skeletons/AbstractSQLQuerying.java   |  5 ++---
 8 files changed, 28 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
index 17137d1..ffd29eb 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/QueryExpressions.java
@@ -598,7 +598,7 @@ public final class QueryExpressions
      * @return a new CONTAINS ALL specification for a Collection Property.
      */
     public static <T> ContainsAllPredicate<T> containsAll( Property<? extends Collection<T>> collectionProperty,
-                                                               Iterable<T> values )
+                                                           Collection<T> values )
     {
         NullArgumentException.validateNotNull( "Values", values );
         return new ContainsAllPredicate<>( property( collectionProperty ), values );
@@ -615,7 +615,7 @@ public final class QueryExpressions
     @SuppressWarnings( {"raw", "unchecked"} )
     public static <T> ContainsAllPredicate<T> containsAllVariables(
         Property<? extends Collection<T>> collectionProperty,
-        Iterable<Variable> variables )
+        Collection<Variable> variables )
     {
         NullArgumentException.validateNotNull( "Variables", variables );
         return new ContainsAllPredicate( property( collectionProperty ), variables );

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java b/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
index 425b61f..bd6c694 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/AndPredicate.java
@@ -19,6 +19,7 @@
  */
 package org.apache.zest.api.query.grammar;
 
+import java.util.Collection;
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
 
@@ -28,7 +29,7 @@ import org.apache.zest.api.composite.Composite;
 public class AndPredicate
     extends BinaryPredicate
 {
-    public AndPredicate( Iterable<Predicate<Composite>> operands )
+    public AndPredicate( Collection<Predicate<Composite>> operands )
     {
         super( operands );
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/core/api/src/main/java/org/apache/zest/api/query/grammar/BinaryPredicate.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/grammar/BinaryPredicate.java b/core/api/src/main/java/org/apache/zest/api/query/grammar/BinaryPredicate.java
index 39f81a7..4e2e218 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/BinaryPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/BinaryPredicate.java
@@ -19,6 +19,8 @@
  */
 package org.apache.zest.api.query.grammar;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
 
@@ -28,14 +30,14 @@ import org.apache.zest.api.composite.Composite;
 public abstract class BinaryPredicate
     extends ExpressionPredicate
 {
-    protected final Iterable<Predicate<Composite>> operands;
+    protected final Collection<Predicate<Composite>> operands;
 
-    protected BinaryPredicate( Iterable<Predicate<Composite>> operands )
+    protected BinaryPredicate( Collection<Predicate<Composite>> operands )
     {
-        this.operands = operands;
+        this.operands = Collections.unmodifiableCollection( operands );
     }
 
-    public Iterable<Predicate<Composite>> operands()
+    public Collection<Predicate<Composite>> operands()
     {
         return operands;
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java b/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
index 0bed02b..52a1b27 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/ContainsAllPredicate.java
@@ -20,6 +20,8 @@
 package org.apache.zest.api.query.grammar;
 
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import org.apache.zest.api.composite.Composite;
 
 /**
@@ -29,14 +31,14 @@ public class ContainsAllPredicate<T>
     extends ExpressionPredicate
 {
     private PropertyFunction<? extends Collection<T>> collectionProperty;
-    private Iterable<T> valueCollection;
+    private Collection<T> valueCollection;
 
     public ContainsAllPredicate( PropertyFunction<? extends Collection<T>> collectionProperty,
-                                 Iterable<T> valueCollection
+                                 Collection<T> valueCollection
     )
     {
         this.collectionProperty = collectionProperty;
-        this.valueCollection = valueCollection;
+        this.valueCollection = Collections.unmodifiableCollection( valueCollection );
     }
 
     public PropertyFunction<? extends Collection<T>> collectionProperty()
@@ -44,7 +46,7 @@ public class ContainsAllPredicate<T>
         return collectionProperty;
     }
 
-    public Iterable<T> containedValues()
+    public Collection<T> containedValues()
     {
         return valueCollection;
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java b/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
index d8eb863..70cb7a0 100644
--- a/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
+++ b/core/api/src/main/java/org/apache/zest/api/query/grammar/OrPredicate.java
@@ -19,6 +19,7 @@
  */
 package org.apache.zest.api.query.grammar;
 
+import java.util.Collection;
 import java.util.function.Predicate;
 import org.apache.zest.api.composite.Composite;
 
@@ -29,7 +30,7 @@ public class OrPredicate
     extends BinaryPredicate
 {
 
-    public OrPredicate( Iterable<Predicate<Composite>> operands )
+    public OrPredicate( Collection<Predicate<Composite>> operands )
     {
         super( operands );
     }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
index ff568d3..917042e 100644
--- a/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
+++ b/extensions/indexing-elasticsearch/src/main/java/org/apache/zest/index/elasticsearch/ElasticSearchFinder.java
@@ -19,8 +19,8 @@
  */
 package org.apache.zest.index.elasticsearch;
 
+import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
@@ -398,13 +398,13 @@ public interface ElasticSearchFinder
                                                       Map<String, Object> variables )
         {
             LOGGER.trace( "Processing ContainsAllSpecification {}", spec );
-            Iterator<?> iterator = spec.containedValues().iterator();
-            if( !iterator.hasNext() )
+            Collection<?> values = spec.containedValues();
+            if( values.isEmpty() )
             {
                 // Ignore empty contains all spec
                 return;
             }
-            Object firstValue = iterator.next();
+            Object firstValue = values.iterator().next();
             if( firstValue instanceof ValueComposite )
             {
                 // Query by complex property "example value"
@@ -420,7 +420,7 @@ public interface ElasticSearchFinder
             {
                 String name = spec.collectionProperty().toString();
                 BoolQueryBuilder contAllBuilder = boolQuery();
-                for( Object value : spec.containedValues() )
+                for( Object value : values )
                 {
                     contAllBuilder.must( termQuery( name, resolveVariable( value, variables ) ) );
                 }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
index d665c9d..71433c1 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
@@ -54,7 +54,6 @@ import org.apache.zest.api.query.grammar.QuerySpecification;
 import org.apache.zest.api.query.grammar.Variable;
 import org.apache.zest.api.value.ValueSerializer;
 import org.apache.zest.api.value.ValueSerializer.Options;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.rdf.query.RdfQueryParser;
 import org.apache.zest.spi.ZestSPI;
 import org.slf4j.LoggerFactory;
@@ -368,19 +367,11 @@ public class RdfQueryParserImpl
 
     private void processContainsAllPredicate( final ContainsAllPredicate<?> predicate, StringBuilder builder )
     {
-        Iterable<?> values = predicate.containedValues();
+        Collection<?> values = predicate.containedValues();
         String valueVariable = triples.addTriple( predicate.collectionProperty(), false ).value();
-        String[] strings;
-        if( values instanceof Collection )
-        {
-            strings = new String[ ( (Collection<?>) values ).size() ];
-        }
-        else
-        {
-            strings = new String[ ( (int) Iterables.count( values ) ) ];
-        }
+        String[] strings = new String[ values.size() ];
         Integer x = 0;
-        for( Object item : (Collection<?>) values )
+        for( Object item : values )
         {
             String jsonStr = "";
             if( item != null )

http://git-wip-us.apache.org/repos/asf/zest-java/blob/3c34b37e/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
index 587bf30..2434302 100644
--- a/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
+++ b/extensions/indexing-sql/src/main/java/org/apache/zest/index/sql/support/skeletons/AbstractSQLQuerying.java
@@ -66,7 +66,6 @@ import org.apache.zest.api.query.grammar.Variable;
 import org.apache.zest.api.service.ServiceDescriptor;
 import org.apache.zest.api.unitofwork.UnitOfWorkFactory;
 import org.apache.zest.api.value.ValueComposite;
-import org.apache.zest.functional.Iterables;
 import org.apache.zest.index.sql.support.api.SQLQuerying;
 import org.apache.zest.index.sql.support.common.DBNames;
 import org.apache.zest.index.sql.support.common.QNameInfo;
@@ -1256,7 +1255,7 @@ public abstract class AbstractSQLQuerying
                     LiteralFactory l = vendor.getLiteralFactory();
                     ColumnsFactory c = vendor.getColumnsFactory();
 
-                    Iterable<?> collection = predicate.containedValues();
+                    Collection<?> collection = predicate.containedValues();
                     List<QNameJoin> joins = new ArrayList<>();
                     for( Object value : collection )
                     {
@@ -1288,7 +1287,7 @@ public abstract class AbstractSQLQuerying
                             b.geq(
                                 l.func( "COUNT", c.colName( TABLE_NAME_PREFIX + lastTableIndex,
                                                             DBNames.QNAME_TABLE_VALUE_COLUMN_NAME ) ),
-                                l.n( Iterables.count( collection ) ) ) );
+                                l.n( collection.size() ) ) );
                 }
             } //
         );