mirror of https://github.com/apache/jclouds.git
Issue 1011: remove PagedIterator
This commit is contained in:
parent
addeb0d031
commit
3154371433
|
@ -26,7 +26,6 @@ import org.jclouds.cloudwatch.features.MetricApi;
|
||||||
import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
import org.jclouds.cloudwatch.options.ListMetricsOptions;
|
||||||
import org.jclouds.collect.IterableWithMarker;
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
import org.jclouds.collect.PagedIterables;
|
import org.jclouds.collect.PagedIterables;
|
||||||
import org.jclouds.collect.PagedIterators;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
@ -47,7 +46,7 @@ public class CloudWatch {
|
||||||
* @return iterable of metrics fitting the criteria
|
* @return iterable of metrics fitting the criteria
|
||||||
*/
|
*/
|
||||||
public static Iterable<Metric> listMetrics(final MetricApi metricApi, final ListMetricsOptions options) {
|
public static Iterable<Metric> listMetrics(final MetricApi metricApi, final ListMetricsOptions options) {
|
||||||
return Iterables.concat(PagedIterables.create(PagedIterators.advancing(metricApi.list(options),
|
return Iterables.concat(PagedIterables.advance(metricApi.list(options),
|
||||||
new Function<Object, IterableWithMarker<Metric>>() {
|
new Function<Object, IterableWithMarker<Metric>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -59,7 +58,7 @@ public class CloudWatch {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "listMetrics(" + options + ")";
|
return "listMetrics(" + options + ")";
|
||||||
}
|
}
|
||||||
})));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,27 +26,31 @@ import com.google.common.collect.Iterators;
|
||||||
import com.google.common.collect.UnmodifiableIterator;
|
import com.google.common.collect.UnmodifiableIterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows you to advance through sequence of pages in a resultset. Typically
|
* Extends {@link FluentIterable} allowing you to lazily advance through
|
||||||
* used in apis that return only a certain number of records at a time.
|
* 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.
|
* Simplest usage is to employ the {@link #concat} convenience function, and one
|
||||||
|
* of the methods from {@link FluentIterable}.
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* FluentIterable<StorageMetadata> blobs = blobstore.list(...).concat();
|
* // pull in new pages until it we see something interesting.
|
||||||
* for (StorageMetadata blob : blobs) {
|
* Optional<StorageMetadata> firstInterestingBlob = blobstore
|
||||||
* process(blob);
|
* .list(// options //)
|
||||||
* }
|
* .concat()
|
||||||
|
* .firstMatch(isInterestingBlob());
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Some may be interested in each page, for example to
|
* For those seeking manual control of page advances, don't use concat, and
|
||||||
|
* instead look at the value of {@link IterableWithMarker#nextToken}.
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* PagedIterator<StorageMetadata> blobs = blobstore.list(...).iterator();
|
* PagedIterator<StorageMetadata> blobs = blobstore.list(...).iterator();
|
||||||
* while (blobs.hasNext()) {
|
* while (blobs.hasNext()) {
|
||||||
* FluentIterable<StorageMetadata> page = blobs.next();
|
* IterableWithMarker<StorageMetadata> page = blobs.next();
|
||||||
* ProcessedResults results = process(page);
|
* ProcessedResults results = process(page);
|
||||||
* if (results.shouldBeBookmarked() && blobs.nextMarker().isPresent()) {
|
* if (results.shouldBeBookmarked() && page.nextMarker().isPresent()) {
|
||||||
* saveBookmark(blobs.nextMarker().get());
|
* saveBookmark(page.nextMarker().get());
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
* </pre>
|
* </pre>
|
||||||
|
@ -56,9 +60,6 @@ import com.google.common.collect.UnmodifiableIterator;
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class PagedIterable<E> extends FluentIterable<IterableWithMarker<E>> {
|
public abstract class PagedIterable<E> extends FluentIterable<IterableWithMarker<E>> {
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract PagedIterator<E> iterator();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Combines all the pages into a single unmodifiable iterable. ex.
|
* Combines all the pages into a single unmodifiable iterable. ex.
|
||||||
*
|
*
|
||||||
|
@ -72,7 +73,7 @@ public abstract class PagedIterable<E> extends FluentIterable<IterableWithMarker
|
||||||
* @see Iterators#concat
|
* @see Iterators#concat
|
||||||
*/
|
*/
|
||||||
public FluentIterable<E> concat() {
|
public FluentIterable<E> concat() {
|
||||||
final PagedIterator<E> iterator = iterator();
|
final Iterator<IterableWithMarker<E>> iterator = iterator();
|
||||||
final UnmodifiableIterator<Iterator<E>> unmodifiable = new UnmodifiableIterator<Iterator<E>>() {
|
final UnmodifiableIterator<Iterator<E>> unmodifiable = new UnmodifiableIterator<Iterator<E>>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
|
|
|
@ -18,7 +18,15 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.collect;
|
package org.jclouds.collect;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.collect.AbstractIterator;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for using {@link PagedIterable}s.
|
* Utilities for using {@link PagedIterable}s.
|
||||||
|
@ -27,23 +35,120 @@ import com.google.common.annotations.Beta;
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class PagedIterables {
|
public class PagedIterables {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param only
|
||||||
|
* the only page of data
|
||||||
*
|
*
|
||||||
* @param iterator
|
* @return iterable with only the one page
|
||||||
* how to advance pages
|
|
||||||
*
|
|
||||||
* @return iterable current data which continues if the user iterates beyond the first page
|
|
||||||
*/
|
*/
|
||||||
public static <T> PagedIterable<T> create(final PagedIterator<T> iterator) {
|
public static <T> PagedIterable<T> of(final IterableWithMarker<T> only) {
|
||||||
return new PagedIterable<T>() {
|
return new PagedIterable<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PagedIterator<T> iterator() {
|
public Iterator<IterableWithMarker<T>> iterator() {
|
||||||
return iterator;
|
return ImmutableSet.of(only).iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param initial
|
||||||
|
* the initial set current data
|
||||||
|
* @param markerToNext
|
||||||
|
* produces the next set based on the marker
|
||||||
|
*
|
||||||
|
* @return iterable current data which continues if the user iterates beyond
|
||||||
|
* the first page
|
||||||
|
*/
|
||||||
|
public static <T> PagedIterable<T> advance(final IterableWithMarker<T> initial,
|
||||||
|
final Function<Object, IterableWithMarker<T>> markerToNext) {
|
||||||
|
return new PagedIterable<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<IterableWithMarker<T>> iterator() {
|
||||||
|
return advancingIterator(initial, markerToNext);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AdvancingIterator<T> extends AbstractIterator<IterableWithMarker<T>> {
|
||||||
|
|
||||||
|
private final Function<Object, IterableWithMarker<T>> markerToNext;
|
||||||
|
private transient IterableWithMarker<T> current;
|
||||||
|
private transient boolean unread = true;
|
||||||
|
|
||||||
|
private AdvancingIterator(IterableWithMarker<T> initial, Function<Object, IterableWithMarker<T>> markerToNext) {
|
||||||
|
this.current = checkNotNull(initial, "initial iterable");
|
||||||
|
this.markerToNext = checkNotNull(markerToNext, "marker to next iterable");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IterableWithMarker<T> computeNext() {
|
||||||
|
if (unread)
|
||||||
|
try {
|
||||||
|
return current;
|
||||||
|
} finally {
|
||||||
|
unread = false;
|
||||||
|
}
|
||||||
|
else if (current.nextMarker().isPresent())
|
||||||
|
return current = markerToNext.apply(current.nextMarker().get());
|
||||||
|
else
|
||||||
|
return endOfData();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(current, unread);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
AdvancingIterator<?> other = AdvancingIterator.class.cast(obj);
|
||||||
|
return Objects.equal(this.current, other.current) && Objects.equal(this.unread, other.unread);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return Objects.toStringHelper("").add("current", current).add("unread", unread).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param initial
|
||||||
|
* the initial set current data
|
||||||
|
* @param markerToNext
|
||||||
|
* produces the next set based on the marker
|
||||||
|
*
|
||||||
|
* @return iterable current data which continues if the user iterates beyond
|
||||||
|
* the first page
|
||||||
|
*/
|
||||||
|
public static <T> Iterator<IterableWithMarker<T>> advancingIterator(IterableWithMarker<T> initial,
|
||||||
|
Function<Object, IterableWithMarker<T>> markerToNext) {
|
||||||
|
if (!initial.nextMarker().isPresent()) {
|
||||||
|
return ImmutableSet.of(initial).iterator();
|
||||||
|
}
|
||||||
|
return new AdvancingIterator<T>(initial, markerToNext);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
/**
|
|
||||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. jclouds 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.jclouds.collect;
|
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
|
||||||
import com.google.common.base.Optional;
|
|
||||||
import com.google.common.collect.AbstractIterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
public abstract class PagedIterator<T> extends AbstractIterator<IterableWithMarker<T>> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If there is a next marker, then the set is incomplete and you should issue another command to
|
|
||||||
* retrieve the rest, setting the option {@code marker} to this value
|
|
||||||
*
|
|
||||||
* @return next marker, or absent if list is complete
|
|
||||||
*/
|
|
||||||
public abstract Optional<Object> nextMarker();
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,184 +0,0 @@
|
||||||
/**
|
|
||||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file
|
|
||||||
* distributed with this work for additional information
|
|
||||||
* regarding copyright ownership. jclouds 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 current 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.jclouds.collect;
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Objects;
|
|
||||||
import com.google.common.base.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utilities for using {@link PagedIterator}s.
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@Beta
|
|
||||||
public class PagedIterators {
|
|
||||||
|
|
||||||
private static class AdvancingPagedIterator<T> extends PagedIterator<T> {
|
|
||||||
|
|
||||||
private final Function<Object, IterableWithMarker<T>> markerToNext;
|
|
||||||
private transient IterableWithMarker<T> current;
|
|
||||||
private transient boolean unread = true;
|
|
||||||
|
|
||||||
private AdvancingPagedIterator(IterableWithMarker<T> initial, Function<Object, IterableWithMarker<T>> markerToNext) {
|
|
||||||
this.current = checkNotNull(initial, "initial iterable");
|
|
||||||
this.markerToNext = checkNotNull(markerToNext, "marker to next iterable");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected IterableWithMarker<T> computeNext() {
|
|
||||||
if (unread)
|
|
||||||
try {
|
|
||||||
return current;
|
|
||||||
} finally {
|
|
||||||
unread = false;
|
|
||||||
}
|
|
||||||
else if (nextMarker().isPresent())
|
|
||||||
return current = markerToNext.apply(nextMarker().get());
|
|
||||||
else
|
|
||||||
return endOfData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Object> nextMarker() {
|
|
||||||
return current.nextMarker();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hashCode(current, unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null || getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
AdvancingPagedIterator<?> other = AdvancingPagedIterator.class.cast(obj);
|
|
||||||
return Objects.equal(this.current, other.current) && Objects.equal(this.unread, other.unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return Objects.toStringHelper("").add("current", current).add("unread", unread).toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param initial
|
|
||||||
* the initial set current data
|
|
||||||
* @param markerToNext
|
|
||||||
* produces the next set based on the marker
|
|
||||||
*
|
|
||||||
* @return iterable current data which continues if the user iterates beyond the first page
|
|
||||||
*/
|
|
||||||
public static <T> PagedIterator<T> advancing(IterableWithMarker<T> initial,
|
|
||||||
Function<Object, IterableWithMarker<T>> markerToNext) {
|
|
||||||
if (!initial.nextMarker().isPresent()) {
|
|
||||||
return of(initial);
|
|
||||||
}
|
|
||||||
return new AdvancingPagedIterator<T>(initial, markerToNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param initial
|
|
||||||
* the initial set current data
|
|
||||||
* @return iterable current data which only contains the single element
|
|
||||||
*/
|
|
||||||
public static <T> PagedIterator<T> of(IterableWithMarker<T> initial) {
|
|
||||||
return new OnlyElementIterator<T>(initial);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class OnlyElementIterator<T> extends PagedIterator<T> {
|
|
||||||
|
|
||||||
private transient IterableWithMarker<T> onlyElement;
|
|
||||||
private transient boolean unread = true;
|
|
||||||
|
|
||||||
private OnlyElementIterator(IterableWithMarker<T> onlyElement) {
|
|
||||||
this.onlyElement = checkNotNull(onlyElement, "onlyElement");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected IterableWithMarker<T> computeNext() {
|
|
||||||
if (unread)
|
|
||||||
try {
|
|
||||||
return onlyElement;
|
|
||||||
} finally {
|
|
||||||
unread = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return endOfData();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<Object> nextMarker() {
|
|
||||||
return onlyElement.nextMarker();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hashCode(onlyElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null || getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
OnlyElementIterator<?> other = OnlyElementIterator.class.cast(obj);
|
|
||||||
return Objects.equal(this.onlyElement, other.onlyElement) && Objects.equal(this.unread, other.unread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return Objects.toStringHelper("").add("onlyElement", onlyElement).add("unread", unread).toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -40,7 +40,6 @@ package org.jclouds.collect.internal;
|
||||||
import org.jclouds.collect.IterableWithMarker;
|
import org.jclouds.collect.IterableWithMarker;
|
||||||
import org.jclouds.collect.PagedIterable;
|
import org.jclouds.collect.PagedIterable;
|
||||||
import org.jclouds.collect.PagedIterables;
|
import org.jclouds.collect.PagedIterables;
|
||||||
import org.jclouds.collect.PagedIterators;
|
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.rest.InvocationContext;
|
import org.jclouds.rest.InvocationContext;
|
||||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
|
@ -61,7 +60,7 @@ public abstract class CallerArg0ToPagedIterable<T, I extends CallerArg0ToPagedIt
|
||||||
@Override
|
@Override
|
||||||
public PagedIterable<T> apply(IterableWithMarker<T> input) {
|
public PagedIterable<T> apply(IterableWithMarker<T> input) {
|
||||||
if (input.nextMarker() == null)
|
if (input.nextMarker() == null)
|
||||||
return PagedIterables.create(PagedIterators.of(input));
|
return PagedIterables.of(input);
|
||||||
|
|
||||||
Optional<String> arg0Option = Optional.absent();
|
Optional<String> arg0Option = Optional.absent();
|
||||||
if (request.getCaller().get().getArgs() != null && request.getCaller().get().getArgs().length > 0) {
|
if (request.getCaller().get().getArgs() != null && request.getCaller().get().getArgs().length > 0) {
|
||||||
|
@ -70,7 +69,7 @@ public abstract class CallerArg0ToPagedIterable<T, I extends CallerArg0ToPagedIt
|
||||||
arg0Option = Optional.of(arg0.toString());
|
arg0Option = Optional.of(arg0.toString());
|
||||||
}
|
}
|
||||||
final String arg0 = arg0Option.orNull();
|
final String arg0 = arg0Option.orNull();
|
||||||
return PagedIterables.create(PagedIterators.advancing(input, markerToNextForCallingArg0(arg0)));
|
return PagedIterables.advance(input, markerToNextForCallingArg0(arg0));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract Function<Object, IterableWithMarker<T>> markerToNextForCallingArg0(String arg0);
|
protected abstract Function<Object, IterableWithMarker<T>> markerToNextForCallingArg0(String arg0);
|
||||||
|
|
|
@ -27,7 +27,7 @@ public class PagedIterablesTest {
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
EasyMock.replay(markerToNext);
|
||||||
|
|
||||||
PagedIterable<String> iterable = PagedIterables.create(PagedIterators.advancing(initial, markerToNext));
|
PagedIterable<String> iterable = PagedIterables.advance(initial, markerToNext);
|
||||||
|
|
||||||
Assert.assertSame(iterable.get(0), initial);
|
Assert.assertSame(iterable.get(0), initial);
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ public class PagedIterablesTest {
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
EasyMock.replay(markerToNext);
|
||||||
|
|
||||||
PagedIterable<String> iterable = PagedIterables.create(PagedIterators.advancing(initial, markerToNext));
|
PagedIterable<String> iterable = PagedIterables.advance(initial, markerToNext);
|
||||||
|
|
||||||
Assert.assertEquals(iterable.concat().toImmutableSet(),
|
Assert.assertEquals(iterable.concat().toImmutableSet(),
|
||||||
ImmutableSet.of("foo", "bar", "boo", "baz", "ham", "cheeze"));
|
ImmutableSet.of("foo", "bar", "boo", "baz", "ham", "cheeze"));
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
package org.jclouds.collect;
|
|
||||||
|
|
||||||
import static org.easymock.EasyMock.createMock;
|
|
||||||
import static org.easymock.EasyMock.expect;
|
|
||||||
|
|
||||||
import org.easymock.EasyMock;
|
|
||||||
import org.testng.Assert;
|
|
||||||
import org.testng.annotations.Test;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.base.Optional;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests behavior of {@code IterableWithMarkers}.
|
|
||||||
*
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
@Test(testName = "PagedIteratorsTest")
|
|
||||||
public class PagedIteratorsTest {
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Test
|
|
||||||
public void testSinglePageResultReturnsSame() {
|
|
||||||
|
|
||||||
IterableWithMarker<String> initial = IterableWithMarkers.from(ImmutableSet.of("foo", "bar"));
|
|
||||||
Function<Object, IterableWithMarker<String>> markerToNext = createMock(Function.class);
|
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
|
||||||
|
|
||||||
Assert.assertSame(PagedIterators.advancing(initial, markerToNext).next(), initial);
|
|
||||||
|
|
||||||
EasyMock.verify(markerToNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Test
|
|
||||||
public void testMultiPage2Pages() {
|
|
||||||
|
|
||||||
IterableWithMarker<String> initial = IterableWithMarkers.from(ImmutableSet.of("foo", "bar"), "MARKER1");
|
|
||||||
Function<Object, IterableWithMarker<String>> markerToNext = createMock(Function.class);
|
|
||||||
|
|
||||||
expect(markerToNext.apply("MARKER1")).andReturn(IterableWithMarkers.from(ImmutableSet.of("boo", "baz"), null));
|
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
|
||||||
|
|
||||||
Assert.assertEquals(ImmutableSet.copyOf(Iterables.concat(ImmutableSet.copyOf(PagedIterators.advancing(initial,
|
|
||||||
markerToNext)))), ImmutableSet.of("foo", "bar", "boo", "baz"));
|
|
||||||
|
|
||||||
EasyMock.verify(markerToNext);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Test
|
|
||||||
public void testMultiPage3Pages() {
|
|
||||||
|
|
||||||
IterableWithMarker<String> initial = IterableWithMarkers.from(ImmutableSet.of("foo", "bar"), "MARKER1");
|
|
||||||
Function<Object, IterableWithMarker<String>> markerToNext = createMock(Function.class);
|
|
||||||
|
|
||||||
expect(markerToNext.apply("MARKER1")).andReturn(
|
|
||||||
IterableWithMarkers.from(ImmutableSet.of("boo", "baz"), "MARKER2"));
|
|
||||||
|
|
||||||
expect(markerToNext.apply("MARKER2")).andReturn(IterableWithMarkers.from(ImmutableSet.of("ham", "cheeze"), null));
|
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
|
||||||
|
|
||||||
Assert.assertEquals(ImmutableSet.copyOf(Iterables.concat(ImmutableSet.copyOf(PagedIterators.advancing(initial,
|
|
||||||
markerToNext)))), ImmutableSet.of("foo", "bar", "boo", "baz", "ham", "cheeze"));
|
|
||||||
|
|
||||||
EasyMock.verify(markerToNext);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Test
|
|
||||||
public void testMultiPage3PagesNextMarkerSetCorrectly() {
|
|
||||||
|
|
||||||
IterableWithMarker<String> initial = IterableWithMarkers.from(ImmutableSet.of("foo", "bar"), "MARKER1");
|
|
||||||
Function<Object, IterableWithMarker<String>> markerToNext = createMock(Function.class);
|
|
||||||
IterableWithMarker<String> second = IterableWithMarkers.from(ImmutableSet.of("boo", "baz"), "MARKER2");
|
|
||||||
expect(markerToNext.apply("MARKER1")).andReturn(second);
|
|
||||||
IterableWithMarker<String> third = IterableWithMarkers.from(ImmutableSet.of("ham", "cheeze"), null);
|
|
||||||
expect(markerToNext.apply("MARKER2")).andReturn(third);
|
|
||||||
|
|
||||||
EasyMock.replay(markerToNext);
|
|
||||||
PagedIterator<String> iterator = PagedIterators.advancing(initial, markerToNext);
|
|
||||||
|
|
||||||
Assert.assertEquals(iterator.hasNext(), true);
|
|
||||||
Assert.assertEquals(iterator.nextMarker(), Optional.of("MARKER1"));
|
|
||||||
Assert.assertEquals(iterator.next(), initial);
|
|
||||||
Assert.assertEquals(iterator.hasNext(), true);
|
|
||||||
Assert.assertEquals(iterator.nextMarker(), Optional.of("MARKER2"));
|
|
||||||
Assert.assertEquals(iterator.next(), second);
|
|
||||||
Assert.assertEquals(iterator.hasNext(), true);
|
|
||||||
Assert.assertEquals(iterator.nextMarker(), Optional.absent());
|
|
||||||
Assert.assertEquals(iterator.next(), third);
|
|
||||||
Assert.assertEquals(iterator.hasNext(), false);
|
|
||||||
Assert.assertEquals(iterator.nextMarker(), Optional.absent());
|
|
||||||
EasyMock.verify(markerToNext);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue