From addeb0d0316887abe11319f8e714af3a4768ab6a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 16 Jul 2012 10:57:41 -0400 Subject: [PATCH] added concat to PagedIterable --- .../features/MetricApiExpectTest.java | 4 +- .../org/jclouds/collect/PagedIterable.java | 55 ++++++++++++++++++- .../jclouds/collect/PagedIterablesTest.java | 3 +- .../ELBListLoadBalancersStrategy.java | 16 +++--- .../features/LoadBalancerApiExpectTest.java | 2 +- .../ELBLoadBalancerServiceLiveTest.java | 7 +-- .../iam/features/UserApiExpectTest.java | 2 +- .../rds/features/InstanceApiExpectTest.java | 2 +- .../features/SecurityGroupApiExpectTest.java | 2 +- .../features/SubnetGroupApiExpectTest.java | 2 +- 10 files changed, 70 insertions(+), 25 deletions(-) diff --git a/apis/cloudwatch/src/test/java/org/jclouds/cloudwatch/features/MetricApiExpectTest.java b/apis/cloudwatch/src/test/java/org/jclouds/cloudwatch/features/MetricApiExpectTest.java index 24ca524415..25cae952fe 100644 --- a/apis/cloudwatch/src/test/java/org/jclouds/cloudwatch/features/MetricApiExpectTest.java +++ b/apis/cloudwatch/src/test/java/org/jclouds/cloudwatch/features/MetricApiExpectTest.java @@ -38,8 +38,6 @@ import org.jclouds.http.HttpResponse; import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; -import com.google.common.collect.Iterables; - /** * @author Jeremy Whitlock, Adrian Cole */ @@ -118,7 +116,7 @@ public class MetricApiExpectTest extends BaseCloudWatchApiExpectTest { CloudWatchApi apiWhenMetricsExist = requestsSendResponses( listMetrics, listMetricsResponse, listMetrics2, listMetrics2Response); - assertEquals(Iterables.concat(apiWhenMetricsExist.getMetricApiForRegion(null).list()).toString(), + assertEquals(apiWhenMetricsExist.getMetricApiForRegion(null).list().concat().toString(), "[Metric{namespace=AWS/EC2, metricName=CPUUtilization, dimension=[Dimension{name=InstanceId, value=i-689fcf0f}]}, Metric{namespace=AWS/EC2, metricName=CPUUtilization, dimension=[Dimension{name=InstanceId, value=i-689fcf0f}]}]"); } diff --git a/core/src/main/java/org/jclouds/collect/PagedIterable.java b/core/src/main/java/org/jclouds/collect/PagedIterable.java index cdffb6c455..09175469a6 100644 --- a/core/src/main/java/org/jclouds/collect/PagedIterable.java +++ b/core/src/main/java/org/jclouds/collect/PagedIterable.java @@ -18,10 +18,28 @@ */ package org.jclouds.collect; +import java.util.Iterator; + import com.google.common.annotations.Beta; import com.google.common.collect.FluentIterable; +import com.google.common.collect.Iterators; +import com.google.common.collect.UnmodifiableIterator; /** + * Allows you to advance through sequence of pages in a resultset. Typically + * used in apis that return only a certain number of records at a time. + * + * Simplest usage is to employ the {@link #concat} convenience function. + * + *
+ * FluentIterable blobs = blobstore.list(...).concat();
+ * for (StorageMetadata blob : blobs) {
+ *     process(blob);
+ * }
+ * 
+ * + * Some may be interested in each page, for example to + * *
  * PagedIterator blobs = blobstore.list(...).iterator();
  * while (blobs.hasNext()) {
@@ -36,9 +54,42 @@ import com.google.common.collect.FluentIterable;
  * @author Adrian Cole
  */
 @Beta
-public abstract class PagedIterable extends FluentIterable> {
+public abstract class PagedIterable extends FluentIterable> {
 
    @Override
-   public abstract PagedIterator iterator();
+   public abstract PagedIterator iterator();
+
+   /**
+    * Combines all the pages into a single unmodifiable iterable. ex.
+    * 
+    * 
+    * FluentIterable blobs = blobstore.list(...).concat();
+    * for (StorageMetadata blob : blobs) {
+    *     process(blob);
+    * }
+    * 
+ * + * @see Iterators#concat + */ + public FluentIterable concat() { + final PagedIterator iterator = iterator(); + final UnmodifiableIterator> unmodifiable = new UnmodifiableIterator>() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Iterator next() { + return iterator.next().iterator(); + } + }; + return new FluentIterable() { + @Override + public Iterator iterator() { + return Iterators.concat(unmodifiable); + } + }; + } } \ No newline at end of file diff --git a/core/src/test/java/org/jclouds/collect/PagedIterablesTest.java b/core/src/test/java/org/jclouds/collect/PagedIterablesTest.java index 73d8ad158b..e8a0cf933f 100644 --- a/core/src/test/java/org/jclouds/collect/PagedIterablesTest.java +++ b/core/src/test/java/org/jclouds/collect/PagedIterablesTest.java @@ -9,7 +9,6 @@ import org.testng.annotations.Test; import com.google.common.base.Function; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; /** * Tests behavior of {@code IterableWithMarkers}. @@ -51,7 +50,7 @@ public class PagedIterablesTest { PagedIterable iterable = PagedIterables.create(PagedIterators.advancing(initial, markerToNext)); - Assert.assertEquals(ImmutableSet.copyOf(Iterables.concat(iterable)), + Assert.assertEquals(iterable.concat().toImmutableSet(), ImmutableSet.of("foo", "bar", "boo", "baz", "ham", "cheeze")); EasyMock.verify(markerToNext); diff --git a/labs/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java b/labs/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java index ec11c1a7eb..87ef4b6efa 100644 --- a/labs/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java +++ b/labs/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java @@ -46,7 +46,6 @@ import org.jclouds.logging.Logger; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; import com.google.common.util.concurrent.ListenableFuture; /** @@ -88,14 +87,13 @@ public class ELBListLoadBalancersStrategy implements ListLoadBalancersStrategy { @Override public Iterable apply(PagedIterable input) { - return Iterables.transform(Iterables.concat(input), - new Function() { - - @Override - public LoadBalancerInRegion apply(LoadBalancer lb) { - return new LoadBalancerInRegion(lb, from); - } - }); + return input.concat() + .transform(new Function() { + @Override + public LoadBalancerInRegion apply(LoadBalancer lb) { + return new LoadBalancerInRegion(lb, from); + } + }); } }, executor); diff --git a/labs/elb/src/test/java/org/jclouds/elb/features/LoadBalancerApiExpectTest.java b/labs/elb/src/test/java/org/jclouds/elb/features/LoadBalancerApiExpectTest.java index 3d4a98cf2a..ab4ddb4778 100644 --- a/labs/elb/src/test/java/org/jclouds/elb/features/LoadBalancerApiExpectTest.java +++ b/labs/elb/src/test/java/org/jclouds/elb/features/LoadBalancerApiExpectTest.java @@ -145,7 +145,7 @@ public class LoadBalancerApiExpectTest extends BaseELBApiExpectTest { LoadBalancer lb1 = new GetLoadBalancerResponseTest().expected().toBuilder().name("my-load-balancer-1").build(); LoadBalancer lb2 = new GetLoadBalancerResponseTest().expected(); - assertEquals(ImmutableSet.copyOf(Iterables.concat(apiWhenExist.getLoadBalancerApi().list())), ImmutableSet.of(lb1, lb2)); + assertEquals(apiWhenExist.getLoadBalancerApi().list().concat().toImmutableSet(), ImmutableSet.of(lb1, lb2)); } public void testList2PagesWhenResponseIs2xxInEU() throws Exception { diff --git a/labs/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java b/labs/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java index e47cc479cb..b4172e83f8 100644 --- a/labs/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java +++ b/labs/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java @@ -20,7 +20,6 @@ package org.jclouds.elb.loadbalancer; import static org.testng.Assert.assertEquals; -import org.jclouds.collect.PagedIterable; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.elb.ELBApi; import org.jclouds.elb.ELBAsyncApi; @@ -30,9 +29,9 @@ import org.jclouds.rest.RestContext; import org.jclouds.sshj.config.SshjSshClientModule; import org.testng.annotations.Test; +import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; -import com.google.common.collect.Iterables; /** * @@ -61,8 +60,8 @@ public class ELBLoadBalancerServiceLiveTest extends BaseLoadBalancerServiceLiveT instanceIds.add(node.getProviderId()); } - PagedIterable elbs = elbApi.getLoadBalancerApi().list(); - for (LoadBalancer elb : Iterables.concat(elbs)) { + FluentIterable elbs = elbApi.getLoadBalancerApi().list().concat(); + for (LoadBalancer elb : elbs) { if (elb.getName().equals(group)) assertEquals(elb.getInstanceIds(), instanceIds.build()); } diff --git a/labs/iam/src/test/java/org/jclouds/iam/features/UserApiExpectTest.java b/labs/iam/src/test/java/org/jclouds/iam/features/UserApiExpectTest.java index ed554fd836..15000246aa 100644 --- a/labs/iam/src/test/java/org/jclouds/iam/features/UserApiExpectTest.java +++ b/labs/iam/src/test/java/org/jclouds/iam/features/UserApiExpectTest.java @@ -149,7 +149,7 @@ public class UserApiExpectTest extends BaseIAMApiExpectTest { IAMApi apiWhenExist = requestsSendResponses(list, listResponse, list2, list2Response); - assertEquals(ImmutableList.copyOf(Iterables.concat(apiWhenExist.getUserApi().list())), + assertEquals(apiWhenExist.getUserApi().list().concat().toImmutableList(), ImmutableList.copyOf(Iterables.concat(new ListUsersResponseTest().expected(), new ListUsersResponseTest().expected()))); } diff --git a/labs/rds/src/test/java/org/jclouds/rds/features/InstanceApiExpectTest.java b/labs/rds/src/test/java/org/jclouds/rds/features/InstanceApiExpectTest.java index 7a42aab7eb..18ef406a7f 100644 --- a/labs/rds/src/test/java/org/jclouds/rds/features/InstanceApiExpectTest.java +++ b/labs/rds/src/test/java/org/jclouds/rds/features/InstanceApiExpectTest.java @@ -140,7 +140,7 @@ public class InstanceApiExpectTest extends BaseRDSApiExpectTest { RDSApi apiWhenExist = requestsSendResponses( list, listResponse, list2, list2Response); - assertEquals(ImmutableList.copyOf(Iterables.concat(apiWhenExist.getInstanceApi().list())), + assertEquals(apiWhenExist.getInstanceApi().list().concat().toImmutableList(), ImmutableList.copyOf(Iterables.concat(new DescribeDBInstancesResponseTest().expected(), new DescribeDBInstancesResponseTest().expected()))); } diff --git a/labs/rds/src/test/java/org/jclouds/rds/features/SecurityGroupApiExpectTest.java b/labs/rds/src/test/java/org/jclouds/rds/features/SecurityGroupApiExpectTest.java index 5ae1882781..8a04e2b528 100644 --- a/labs/rds/src/test/java/org/jclouds/rds/features/SecurityGroupApiExpectTest.java +++ b/labs/rds/src/test/java/org/jclouds/rds/features/SecurityGroupApiExpectTest.java @@ -140,7 +140,7 @@ public class SecurityGroupApiExpectTest extends BaseRDSApiExpectTest { RDSApi apiWhenExist = requestsSendResponses( list, listResponse, list2, list2Response); - assertEquals(ImmutableList.copyOf(Iterables.concat(apiWhenExist.getSecurityGroupApi().list())), + assertEquals(apiWhenExist.getSecurityGroupApi().list().concat().toImmutableList(), ImmutableList.copyOf(Iterables.concat(new DescribeDBSecurityGroupsResponseTest().expected(), new DescribeDBSecurityGroupsResponseTest().expected()))); } diff --git a/labs/rds/src/test/java/org/jclouds/rds/features/SubnetGroupApiExpectTest.java b/labs/rds/src/test/java/org/jclouds/rds/features/SubnetGroupApiExpectTest.java index 18104519ba..64ab2b740b 100644 --- a/labs/rds/src/test/java/org/jclouds/rds/features/SubnetGroupApiExpectTest.java +++ b/labs/rds/src/test/java/org/jclouds/rds/features/SubnetGroupApiExpectTest.java @@ -141,7 +141,7 @@ public class SubnetGroupApiExpectTest extends BaseRDSApiExpectTest { RDSApi apiWhenExist = requestsSendResponses( list, listResponse, list2, list2Response); - assertEquals(ImmutableList.copyOf(Iterables.concat(apiWhenExist.getSubnetGroupApi().list())), + assertEquals(apiWhenExist.getSubnetGroupApi().list().concat().toImmutableList(), ImmutableList.copyOf(Iterables.concat(new DescribeDBSubnetGroupsResponseTest().expected(), new DescribeDBSubnetGroupsResponseTest().expected()))); }