Updated Branches: refs/heads/master 83a1c202e -> 0982e0005
JCLOUDS-298. create swift-specific ListContainerOptions Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/commit/0982e000 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/tree/0982e000 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/diff/0982e000 Branch: refs/heads/master Commit: 0982e00050969ddedfefa84fe33dd34f24248452 Parents: 38bcafd Author: Adrian Cole <[email protected]> Authored: Sat Sep 28 17:02:48 2013 -0700 Committer: Adrian Cole <[email protected]> Committed: Sat Sep 28 17:13:22 2013 -0700 ---------------------------------------------------------------------- .../openstack/swift/v1/features/ObjectApi.java | 20 +--- .../swift/v1/options/ListContainerOptions.java | 111 +++++++++++++++++++ .../swift/v1/features/ObjectApiLiveTest.java | 8 +- .../swift/v1/features/ObjectApiMockTest.java | 14 ++- 4 files changed, 126 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0982e000/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java index 05995af..aadba9f 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java @@ -29,7 +29,6 @@ import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404; import org.jclouds.Fallbacks.FalseOnNotFoundOr404; @@ -46,6 +45,7 @@ import org.jclouds.openstack.swift.v1.domain.SwiftObject; import org.jclouds.openstack.swift.v1.functions.ETagHeader; import org.jclouds.openstack.swift.v1.functions.ParseObjectFromResponse; import org.jclouds.openstack.swift.v1.functions.ParseObjectListFromResponse; +import org.jclouds.openstack.swift.v1.options.ListContainerOptions; import org.jclouds.rest.Binder; import org.jclouds.rest.annotations.BinderParam; import org.jclouds.rest.annotations.Fallback; @@ -75,23 +75,7 @@ public interface ObjectApi { @ResponseParser(ParseObjectListFromResponse.class) @Fallback(EmptyFluentIterableOnNotFoundOr404.class) @Path("/") - FluentIterable<SwiftObject> listFirstPage(); - - /** - * Lists up to 10,000 objects, starting at {@code marker}. - * - * @param marker - * lexicographic position to start list. - * - * @return a list of existing storage objects ordered by name. - */ - @Named("ListObjects") - @GET - @QueryParams(keys = "format", values = "json") - @ResponseParser(ParseObjectListFromResponse.class) - @Fallback(EmptyFluentIterableOnNotFoundOr404.class) - @Path("/") - FluentIterable<SwiftObject> listAt(@QueryParam("marker") String marker); + FluentIterable<SwiftObject> list(ListContainerOptions options); /** * Creates or updates an object. http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0982e000/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainerOptions.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainerOptions.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainerOptions.java new file mode 100644 index 0000000..f106325 --- /dev/null +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainerOptions.java @@ -0,0 +1,111 @@ +/* + * 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.jclouds.openstack.swift.v1.options; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import org.jclouds.http.options.BaseHttpRequestOptions; +import org.jclouds.openstack.swift.v1.features.ObjectApi; + +/** + * Options available for <a href= + * "http://docs.openstack.org/api/openstack-object-storage/1.0/content/list-objects.html" + * >listing objects</a>. + * + * @see ObjectApi#list + */ +public class ListContainerOptions extends BaseHttpRequestOptions { + public static final ListContainerOptions NONE = new ListContainerOptions(); + + /** list operation returns no more than this amount. */ + public ListContainerOptions limit(int limit) { + checkState(limit >= 0, "limit must be >= 0"); + checkState(limit <= 10000, "limit must be <= 10000"); + queryParameters.put("limit", Integer.toString(limit)); + return this; + } + + /** object names greater in value than the specified marker are returned. */ + public ListContainerOptions marker(String marker) { + queryParameters.put("marker", checkNotNull(marker, "marker")); + return this; + } + + /** object names less in value than the specified marker are returned. */ + public ListContainerOptions endMarker(String endMarker) { + queryParameters.put("end_marker", checkNotNull(endMarker, "endMarker")); + return this; + } + + /** object names beginning with this substring are returned. */ + public ListContainerOptions prefix(String prefix) { + queryParameters.put("prefix", checkNotNull(prefix, "prefix")); + return this; + } + + /** object names nested in the container are returned. */ + public ListContainerOptions delimiter(char delimiter) { + queryParameters.put("delimiter", Character.toString(delimiter)); + return this; + } + + /** object names nested in the pseudo path are returned. */ + public ListContainerOptions path(String path) { + queryParameters.put("path", checkNotNull(path, "path")); + return this; + } + + public static class Builder { + + /** @see ListContainerOptions#limit */ + public static ListContainerOptions limit(int limit) { + ListContainerOptions options = new ListContainerOptions(); + return options.limit(limit); + } + + /** @see ListContainerOptions#marker */ + public static ListContainerOptions marker(String marker) { + ListContainerOptions options = new ListContainerOptions(); + return options.marker(marker); + } + + /** @see ListContainerOptions#endMarker */ + public static ListContainerOptions endMarker(String endMarker) { + ListContainerOptions options = new ListContainerOptions(); + return options.endMarker(endMarker); + } + + /** @see ListContainerOptions#prefix */ + public static ListContainerOptions prefix(String prefix) { + ListContainerOptions options = new ListContainerOptions(); + return options.prefix(prefix); + } + + /** @see ListContainerOptions#delimiter */ + public static ListContainerOptions delimiter(char delimiter) { + ListContainerOptions options = new ListContainerOptions(); + return options.delimiter(delimiter); + } + + /** @see ListContainerOptions#path */ + public static ListContainerOptions path(String path) { + ListContainerOptions options = new ListContainerOptions(); + return options.path(path); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0982e000/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java index 5d9ac6c..a90f3c8 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java @@ -18,6 +18,7 @@ package org.jclouds.openstack.swift.v1.features; import static org.jclouds.http.options.GetOptions.Builder.tail; import static org.jclouds.io.Payloads.newStringPayload; +import static org.jclouds.openstack.swift.v1.options.ListContainerOptions.Builder.marker; import static org.jclouds.util.Strings2.toStringAndClose; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -34,6 +35,7 @@ import org.jclouds.http.options.GetOptions; import org.jclouds.openstack.swift.v1.domain.SwiftObject; import org.jclouds.openstack.swift.v1.internal.BaseSwiftApiLiveTest; import org.jclouds.openstack.swift.v1.options.CreateContainerOptions; +import org.jclouds.openstack.swift.v1.options.ListContainerOptions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -54,7 +56,7 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest { public void list() throws Exception { for (String regionId : api.configuredRegions()) { ObjectApi objectApi = api.objectApiInRegionForContainer(regionId, containerName); - FluentIterable<SwiftObject> response = objectApi.listFirstPage(); + FluentIterable<SwiftObject> response = objectApi.list(new ListContainerOptions()); assertNotNull(response); for (SwiftObject object : response) { checkObject(object); @@ -109,11 +111,11 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest { } } - public void listAt() throws Exception { + public void listOptions() throws Exception { String lexicographicallyBeforeName = name.substring(0, name.length() - 1); for (String regionId : api.configuredRegions()) { SwiftObject object = api.objectApiInRegionForContainer(regionId, containerName) - .listAt(lexicographicallyBeforeName).get(0); + .list(marker(lexicographicallyBeforeName)).get(0); assertEquals(object.name(), name); checkObject(object); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0982e000/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java index 1cef6fe..30d3f4d 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java @@ -20,6 +20,7 @@ import static com.google.common.base.Charsets.US_ASCII; import static com.google.common.net.HttpHeaders.RANGE; import static org.jclouds.http.options.GetOptions.Builder.tail; import static org.jclouds.io.Payloads.newStringPayload; +import static org.jclouds.openstack.swift.v1.options.ListContainerOptions.Builder.marker; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -33,6 +34,7 @@ import org.jclouds.io.Payloads; import org.jclouds.openstack.swift.v1.SwiftApi; import org.jclouds.openstack.swift.v1.domain.SwiftObject; import org.jclouds.openstack.swift.v1.internal.BaseSwiftMockTest; +import org.jclouds.openstack.swift.v1.options.ListContainerOptions; import org.jclouds.util.Strings2; import org.testng.annotations.Test; @@ -77,15 +79,15 @@ public class ObjectApiMockTest extends BaseSwiftMockTest { .lastModified(dates.iso8601DateParse("2009-02-03T05:26:32.612278")).build()); } - public void listFirstPage() throws Exception { + public void list() throws Exception { MockWebServer server = mockSwiftServer(); server.enqueue(new MockResponse().setBody(access)); server.enqueue(new MockResponse().setBody(objectList)); try { SwiftApi api = swiftApi(server.getUrl("/").toString()); - ImmutableList<SwiftObject> objects = api.objectApiInRegionForContainer("DFW", "myContainer").listFirstPage() - .toList(); + ImmutableList<SwiftObject> objects = api.objectApiInRegionForContainer("DFW", "myContainer") + .list(new ListContainerOptions()).toList(); assertEquals(objects, parsedObjectsForUrl(server.getUrl("/").toString())); assertEquals(server.getRequestCount(), 2); @@ -97,15 +99,15 @@ public class ObjectApiMockTest extends BaseSwiftMockTest { } } - public void listAt() throws Exception { + public void listOptions() throws Exception { MockWebServer server = mockSwiftServer(); server.enqueue(new MockResponse().setBody(access)); server.enqueue(new MockResponse().setBody(objectList)); try { SwiftApi api = swiftApi(server.getUrl("/").toString()); - ImmutableList<SwiftObject> objects = api.objectApiInRegionForContainer("DFW", "myContainer").listAt("test") - .toList(); + ImmutableList<SwiftObject> objects = api.objectApiInRegionForContainer("DFW", "myContainer") + .list(marker("test")).toList(); assertEquals(objects, parsedObjectsForUrl(server.getUrl("/").toString())); assertEquals(server.getRequestCount(), 2);
