You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2013/09/29 02:16:45 UTC

[2/2] git commit: JCLOUDS-306. switch to swift-specific CreateContainerOptions

JCLOUDS-306. switch to swift-specific CreateContainerOptions


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/38bcafda
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/tree/38bcafda
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/diff/38bcafda

Branch: refs/heads/master
Commit: 38bcafda5a1e3404e05c85a014fa0feab9e1cbd5
Parents: 83a1c20
Author: Adrian Cole <ad...@gmail.com>
Authored: Sat Sep 28 16:31:27 2013 -0700
Committer: Adrian Cole <ad...@gmail.com>
Committed: Sat Sep 28 17:13:22 2013 -0700

----------------------------------------------------------------------
 .../swift/v1/binders/BindMetadataToHeaders.java | 28 +++++----
 .../swift/v1/features/ContainerApi.java         | 19 +-----
 .../v1/options/CreateContainerOptions.java      | 65 ++++++++++++++++++++
 .../swift/v1/features/ContainerApiLiveTest.java |  2 +-
 .../swift/v1/features/ContainerApiMockTest.java | 10 ++-
 .../features/CreatePublicContainerLiveTest.java |  6 +-
 .../swift/v1/features/ObjectApiLiveTest.java    |  2 +-
 7 files changed, 95 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/binders/BindMetadataToHeaders.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/binders/BindMetadataToHeaders.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/binders/BindMetadataToHeaders.java
index 262938e..1a69a0f 100644
--- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/binders/BindMetadataToHeaders.java
+++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/binders/BindMetadataToHeaders.java
@@ -52,7 +52,7 @@ import com.google.common.collect.ImmutableMultimap.Builder;
  * @see <a
  *      href="http://docs.openstack.org/api/openstack-object-storage/1.0/content/create-update-account-metadata.html">documentation</a>
  */
-public abstract class BindMetadataToHeaders implements Binder {
+public class BindMetadataToHeaders implements Binder {
 
    public static class BindAccountMetadataToHeaders extends BindMetadataToHeaders {
       BindAccountMetadataToHeaders() {
@@ -107,8 +107,8 @@ public abstract class BindMetadataToHeaders implements Binder {
 
    private final String metadataPrefix;
 
-   BindMetadataToHeaders(String metadataPrefix) {
-      this.metadataPrefix = metadataPrefix;
+   public BindMetadataToHeaders(String metadataPrefix) {
+      this.metadataPrefix = checkNotNull(metadataPrefix, "metadataPrefix");
    }
 
    @SuppressWarnings("unchecked")
@@ -117,20 +117,24 @@ public abstract class BindMetadataToHeaders implements Binder {
       checkNotNull(request, "request");
       checkArgument(input instanceof Map<?, ?>, "input must be a non-null java.util.Map!");
       Map<String, String> metadata = Map.class.cast(input);
-      Builder<String, String> headers = ImmutableMultimap.<String, String> builder();
+      ImmutableMultimap<String, String> headers = toHeaders(metadata);
+      return (R) request.toBuilder().replaceHeaders(headers).build();
+   }
+
+   protected void putMetadata(Builder<String, String> headers, String key, String value) {
+      headers.put(key, value);
+   }
+
+   public ImmutableMultimap<String, String> toHeaders(Map<String, String> metadata) {
+      Builder<String, String> builder = ImmutableMultimap.<String, String> builder();
       for (Entry<String, String> keyVal : metadata.entrySet()) {
          String keyInLowercase = keyVal.getKey().toLowerCase();
          if (keyVal.getKey().startsWith(metadataPrefix)) {
-            putMetadata(headers, keyInLowercase, keyVal.getValue());
+            putMetadata(builder, keyInLowercase, keyVal.getValue());
          } else {
-            putMetadata(headers, String.format("%s%s", metadataPrefix, keyInLowercase), keyVal.getValue());
+            putMetadata(builder, String.format("%s%s", metadataPrefix, keyInLowercase), keyVal.getValue());
          }
       }
-      return (R) request.toBuilder().replaceHeaders(headers.build()).build();
+      return builder.build();
    }
-
-   protected void putMetadata(Builder<String, String> headers, String key, String value) {
-      headers.put(key, value);
-   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java
index e108ab3..d9438fa 100644
--- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java
+++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ContainerApi.java
@@ -34,8 +34,6 @@ import javax.ws.rs.QueryParam;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.blobstore.options.CreateContainerOptions;
-import org.jclouds.http.HttpRequest;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.swift.v1.binders.BindMetadataToHeaders.BindContainerMetadataToHeaders;
@@ -43,7 +41,7 @@ import org.jclouds.openstack.swift.v1.binders.BindMetadataToHeaders.BindRemoveCo
 import org.jclouds.openstack.swift.v1.domain.Container;
 import org.jclouds.openstack.swift.v1.functions.FalseOnAccepted;
 import org.jclouds.openstack.swift.v1.functions.ParseContainerFromHeaders;
-import org.jclouds.rest.Binder;
+import org.jclouds.openstack.swift.v1.options.CreateContainerOptions;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.QueryParams;
@@ -111,20 +109,7 @@ public interface ContainerApi {
    @PUT
    @ResponseParser(FalseOnAccepted.class)
    @Path("/{containerName}")
-   boolean createIfAbsent(@PathParam("containerName") String containerName,
-         @BinderParam(ContainerReadHeader.class) CreateContainerOptions options);
-
-   static class ContainerReadHeader implements Binder {
-      @SuppressWarnings("unchecked")
-      @Override
-      public <R extends HttpRequest> R bindToRequest(R request, Object input) {
-         CreateContainerOptions options = CreateContainerOptions.class.cast(input);
-         if (options.isPublicRead()) {
-            return (R) request.toBuilder().addHeader("x-container-read", ".r:*,.rlistings").build();
-         }
-         return request;
-      }
-   }
+   boolean createIfAbsent(@PathParam("containerName") String containerName, CreateContainerOptions options);
 
    /**
     * Gets the {@link Container}.

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/CreateContainerOptions.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/CreateContainerOptions.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/CreateContainerOptions.java
new file mode 100644
index 0000000..09a3c77
--- /dev/null
+++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/CreateContainerOptions.java
@@ -0,0 +1,65 @@
+/*
+ * 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 java.util.Map;
+
+import org.jclouds.http.options.BaseHttpRequestOptions;
+import org.jclouds.openstack.swift.v1.binders.BindMetadataToHeaders;
+import org.jclouds.openstack.swift.v1.domain.Container;
+import org.jclouds.openstack.swift.v1.features.ContainerApi;
+
+/**
+ * Options available to <a href=
+ * "http://docs.openstack.org/api/openstack-object-storage/1.0/content/create-container.html"
+ * >create a container</a>.
+ * 
+ * @see ContainerApi#createIfAbsent
+ */
+public class CreateContainerOptions extends BaseHttpRequestOptions {
+
+   /** corresponds to {@link Container#metadata()} */
+   public CreateContainerOptions metadata(Map<String, String> metadata) {
+      if (!metadata.isEmpty()) {
+         this.headers.putAll(bindMetadataToHeaders.toHeaders(metadata));
+      }
+      return this;
+   }
+
+   /** Sets the ACL the container so that anybody can read it. */
+   public CreateContainerOptions anybodyRead() {
+      this.headers.put("x-container-read", ".r:*,.rlistings");
+      return this;
+   }
+
+   public static class Builder {
+
+      /** @see CreateContainerOptions#anybodyRead */
+      public static CreateContainerOptions anybodyRead() {
+         CreateContainerOptions options = new CreateContainerOptions();
+         return options.anybodyRead();
+      }
+
+      /** @see CreateContainerOptions#metadata */
+      public static CreateContainerOptions metadata(Map<String, String> metadata) {
+         CreateContainerOptions options = new CreateContainerOptions();
+         return options.metadata(metadata);
+      }
+   }
+
+   private static final BindMetadataToHeaders bindMetadataToHeaders = new BindMetadataToHeaders("x-container-meta-");
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java
index bf0c24c..7a21b2c 100644
--- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java
+++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiLiveTest.java
@@ -24,9 +24,9 @@ import static org.testng.Assert.assertTrue;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.openstack.swift.v1.domain.Container;
 import org.jclouds.openstack.swift.v1.internal.BaseSwiftApiLiveTest;
+import org.jclouds.openstack.swift.v1.options.CreateContainerOptions;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java
index b127799..159021e 100644
--- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java
+++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ContainerApiMockTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.openstack.swift.v1.features;
 
+import static org.jclouds.openstack.swift.v1.options.CreateContainerOptions.Builder.anybodyRead;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -23,10 +24,10 @@ import static org.testng.Assert.assertTrue;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.openstack.swift.v1.SwiftApi;
 import org.jclouds.openstack.swift.v1.domain.Container;
 import org.jclouds.openstack.swift.v1.internal.BaseSwiftMockTest;
+import org.jclouds.openstack.swift.v1.options.CreateContainerOptions;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -120,14 +121,14 @@ public class ContainerApiMockTest extends BaseSwiftMockTest {
       }
    }
 
-   public void createPublicRead() throws Exception {
+   public void createWithOptions() throws Exception {
       MockWebServer server = mockSwiftServer();
       server.enqueue(new MockResponse().setBody(access));
       server.enqueue(new MockResponse().setResponseCode(201));
 
       try {
          SwiftApi api = swiftApi(server.getUrl("/").toString());
-         assertTrue(api.containerApiInRegion("DFW").createIfAbsent("myContainer", new CreateContainerOptions().publicRead()));
+         assertTrue(api.containerApiInRegion("DFW").createIfAbsent("myContainer", anybodyRead().metadata(metadata)));
 
          assertEquals(server.getRequestCount(), 2);
          assertEquals(server.takeRequest().getRequestLine(), "POST /tokens HTTP/1.1");
@@ -135,6 +136,9 @@ public class ContainerApiMockTest extends BaseSwiftMockTest {
          assertEquals(createRequest.getRequestLine(),
                "PUT /v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer HTTP/1.1");
          assertEquals(createRequest.getHeader("x-container-read"), ".r:*,.rlistings");
+         for (Entry<String, String> entry : metadata.entrySet()) {
+            assertEquals(createRequest.getHeader("x-container-meta-" + entry.getKey().toLowerCase()), entry.getValue());
+         }
       } finally {
          server.shutdown();
       }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/CreatePublicContainerLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/CreatePublicContainerLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/CreatePublicContainerLiveTest.java
index 70a84b9..3eca7ed 100644
--- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/CreatePublicContainerLiveTest.java
+++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/CreatePublicContainerLiveTest.java
@@ -16,8 +16,8 @@
  */
 package org.jclouds.openstack.swift.v1.features;
 
-import static org.jclouds.blobstore.options.CreateContainerOptions.Builder.publicRead;
 import static org.jclouds.io.Payloads.newStringPayload;
+import static org.jclouds.openstack.swift.v1.options.CreateContainerOptions.Builder.anybodyRead;
 import static org.testng.Assert.assertEquals;
 
 import java.io.InputStream;
@@ -39,9 +39,9 @@ public class CreatePublicContainerLiveTest extends BaseSwiftApiLiveTest {
    private String name = getClass().getSimpleName();
    private String containerName = getClass().getSimpleName() + "Container";
 
-   public void publicReadObjectUri() throws Exception {
+   public void anybodyReadObjectUri() throws Exception {
       for (String regionId : api.configuredRegions()) {
-         api.containerApiInRegion(regionId).createIfAbsent(containerName, publicRead());
+         api.containerApiInRegion(regionId).createIfAbsent(containerName, anybodyRead());
          api.containerApiInRegion(regionId).get(containerName);
 
          ObjectApi objectApi = api.objectApiInRegionForContainer(regionId, containerName);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/38bcafda/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 4cfa8d3..5d9ac6c 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
@@ -30,10 +30,10 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
 
-import org.jclouds.blobstore.options.CreateContainerOptions;
 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.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;