You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2015/04/07 00:42:36 UTC

[3/3] jclouds git commit: JCLOUDS-651: Copy Swift system metadata

JCLOUDS-651: Copy Swift system metadata


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

Branch: refs/heads/master
Commit: d8f48c48b41e229e89c4b5db2641e15003b99277
Parents: 576005a
Author: Andrew Gaul <ga...@apache.org>
Authored: Thu Apr 2 17:16:36 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Mon Apr 6 15:35:59 2015 -0700

----------------------------------------------------------------------
 .../blobstore/RegionScopedSwiftBlobStore.java   | 49 ++++++++++++++------
 .../internal/BaseBlobIntegrationTest.java       |  3 +-
 2 files changed, 37 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/d8f48c48/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
----------------------------------------------------------------------
diff --git a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
index 4516264..4192a96 100644
--- a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
+++ b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
@@ -53,6 +53,7 @@ import org.jclouds.blobstore.options.PutOptions;
 import org.jclouds.blobstore.strategy.ClearListStrategy;
 import org.jclouds.collect.Memoized;
 import org.jclouds.domain.Location;
+import org.jclouds.io.ContentMetadata;
 import org.jclouds.io.Payload;
 import org.jclouds.io.payloads.ByteSourcePayload;
 import org.jclouds.openstack.swift.v1.SwiftApi;
@@ -78,7 +79,9 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
 import com.google.common.io.ByteSource;
+import com.google.common.net.HttpHeaders;
 import com.google.inject.AbstractModule;
 import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
@@ -234,25 +237,45 @@ public class RegionScopedSwiftBlobStore implements BlobStore {
    public String copyBlob(String fromContainer, String fromName, String toContainer, String toName,
          CopyOptions options) {
       ObjectApi objectApi = api.getObjectApi(regionId, toContainer);
+      SwiftObject metadata = api.getObjectApi(regionId, fromContainer).getWithoutBody(fromName);
 
-      boolean copied = objectApi.copy(toName, fromContainer, fromName);
-      if (!copied) {
-         throw new RuntimeException("could not copy blob");
+      Map<String, String> userMetadata;
+      if (options.getUserMetadata().isPresent()) {
+         userMetadata = options.getUserMetadata().get();
+      } else {
+         userMetadata = metadata.getMetadata();
       }
 
-      // TODO: content disposition
-      // TODO: content encoding
-      // TODO: content language
-      // TODO: content type
+      // copy existing system metadata
+      Map<String, String> systemMetadata = Maps.newHashMap();
+      ContentMetadata contentMetadata = metadata.getPayload().getContentMetadata();
+      String contentDisposition = contentMetadata.getContentDisposition();
+      if (contentDisposition != null) {
+         systemMetadata.put(HttpHeaders.CONTENT_DISPOSITION, contentDisposition);
+      }
+      String contentEncoding = contentMetadata.getContentEncoding();
+      if (contentEncoding != null) {
+         systemMetadata.put(HttpHeaders.CONTENT_ENCODING, contentEncoding);
+      }
+      String contentLanguage = contentMetadata.getContentLanguage();
+      if (contentLanguage != null) {
+         systemMetadata.put(HttpHeaders.CONTENT_LANGUAGE, contentLanguage);
+      }
+      String contentType = contentMetadata.getContentType();
+      if (contentType != null) {
+         systemMetadata.put(HttpHeaders.CONTENT_TYPE, contentType);
+      }
 
-      Optional<Map<String, String>> userMetadata = options.getUserMetadata();
-      if (userMetadata.isPresent()) {
-         boolean updated = objectApi.updateMetadata(toName, userMetadata.get());
-         if (!updated) {
-            throw new RuntimeException("could not copy blob");
-         }
+      boolean copied = objectApi.copy(toName, fromContainer, fromName, userMetadata, systemMetadata);
+      if (!copied) {
+         throw new RuntimeException("could not copy blob");
       }
 
+      // TODO: override content disposition
+      // TODO: override content encoding
+      // TODO: override content language
+      // TODO: override content type
+
       return objectApi.getWithoutBody(toName).getETag();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d8f48c48/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
----------------------------------------------------------------------
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
index 0d57fc5..1be2597 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
@@ -759,8 +759,7 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
          } finally {
             Closeables2.closeQuietly(is);
          }
-         // TODO: Swift does not preserve system metadata
-         //checkContentMetadata(toBlob);
+         checkContentMetadata(toBlob);
          assertThat(toBlob.getMetadata().getUserMetadata()).isEqualTo(userMetadata);
       } finally {
          returnContainer(toContainer);