Repository: jclouds Updated Branches: refs/heads/master 449eeec8e -> e2b695046
JCLOUDS-872: Swift copy object and append metadata The existing method replaces metadata. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e2b69504 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e2b69504 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e2b69504 Branch: refs/heads/master Commit: e2b6950462f58f4b3a2836be7fb5c366789b0130 Parents: 449eeec Author: Andrew Gaul <[email protected]> Authored: Fri Aug 7 13:37:58 2015 -0700 Committer: Andrew Gaul <[email protected]> Committed: Tue Aug 11 13:26:56 2015 -0700 ---------------------------------------------------------------------- .../openstack/swift/v1/features/ObjectApi.java | 34 +++++++++++++++++++- .../swift/v1/features/ObjectApiLiveTest.java | 25 ++++++++++---- 2 files changed, 52 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e2b69504/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java index 3d41c4a..4063bfc 100644 --- a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java +++ b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java @@ -287,7 +287,7 @@ public interface ObjectApi { @PathParam("sourceObject") String sourceObject); /** - * Copies an object from one container to another. + * Copies an object from one container to another, replacing metadata. * * <h3>NOTE</h3> * This is a server side copy. @@ -318,4 +318,36 @@ public interface ObjectApi { @BinderParam(BindObjectMetadataToHeaders.class) Map<String, String> userMetadata, @BinderParam(BindToHeaders.class) Map<String, String> objectMetadata); + + /** + * Copies an object from one container to another, appending metadata. + * + * <h3>NOTE</h3> + * This is a server side copy. + * + * @param destinationObject + * the destination object name. + * @param sourceContainer + * the source container name. + * @param sourceObject + * the source object name. + * @param userMetadata + * Freeform metadata for the object, automatically prefixed/escaped + * @param objectMetadata + * Unprefixed/unescaped metadata, such as Content-Disposition + * + * @return {@code true} if the object was successfully copied, {@code false} if not. + * + * @throws KeyNotFoundException if the source or destination container do not exist. + */ + @Named("object:copy") + @PUT + @Path("/{destinationObject}") + @Headers(keys = OBJECT_COPY_FROM, values = "/{sourceContainer}/{sourceObject}") + @Fallback(FalseOnKeyNotFound.class) + boolean copyAppendMetadata(@PathParam("destinationObject") String destinationObject, + @PathParam("sourceContainer") String sourceContainer, + @PathParam("sourceObject") String sourceObject, + @BinderParam(BindObjectMetadataToHeaders.class) Map<String, String> userMetadata, + @BinderParam(BindToHeaders.class) Map<String, String> objectMetadata); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e2b69504/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java b/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java index bb0131d..6b7f2a5 100644 --- a/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java +++ b/apis/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java @@ -16,6 +16,7 @@ */ package org.jclouds.openstack.swift.v1.features; +import static org.assertj.core.api.Assertions.assertThat; import static org.jclouds.http.options.GetOptions.Builder.tail; import static org.jclouds.io.Payloads.newByteSourcePayload; import static org.jclouds.openstack.swift.v1.options.ListContainerOptions.Builder.marker; @@ -189,11 +190,10 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest<SwiftApi> { SwiftObject object = destApi.get(destinationObject); checkObject(object); - // check the copy operation - assertTrue(destApi.copy(destinationObject, sourceContainer, sourceObjectName, + // check the copy append metadata operation + assertTrue(destApi.copyAppendMetadata(destinationObject, sourceContainer, sourceObjectName, ImmutableMap.<String, String>of("additionalUserMetakey", "additionalUserMetavalue"), ImmutableMap.of("Content-Disposition", "attachment; filename=\"updatedname.txt\""))); - assertNotNull(destApi.get(destinationObject)); // now get a real SwiftObject SwiftObject destSwiftObject = destApi.get(destinationObject); @@ -205,8 +205,8 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest<SwiftApi> { */ Multimap<String, String> srcHeaders = null; Multimap<String, String> destHeaders = null; - srcHeaders = srcApi.get(sourceObjectName).getHeaders(); - destHeaders = destApi.get(destinationObject).getHeaders(); + srcHeaders = srcApi.getWithoutBody(sourceObjectName).getHeaders(); + destHeaders = destSwiftObject.getHeaders(); for (Entry<String, String> header : srcHeaders.entries()) { if (header.getKey().equals("Date"))continue; if (header.getKey().equals("Last-Modified"))continue; @@ -214,7 +214,20 @@ public class ObjectApiLiveTest extends BaseSwiftApiLiveTest<SwiftApi> { if (header.getKey().equals("X-Timestamp"))continue; assertTrue(destHeaders.containsEntry(header.getKey(), header.getValue()), "Could not find: " + header); } - assertEquals(destApi.get(destinationObject).getPayload().getContentMetadata().getContentDisposition(), "attachment; filename=\"updatedname.txt\""); + assertEquals(destSwiftObject.getPayload().getContentMetadata().getContentDisposition(), "attachment; filename=\"updatedname.txt\""); + + // check the copy replace metadata operation + assertTrue(destApi.copy(destinationObject, sourceContainer, sourceObjectName, + ImmutableMap.<String, String>of("key3", "value3"), + ImmutableMap.of("Content-Disposition", "attachment; filename=\"updatedname.txt\""))); + + // now get a real SwiftObject + destSwiftObject = destApi.get(destinationObject); + assertEquals(toStringAndClose(destSwiftObject.getPayload().openStream()), "swifty"); + + destHeaders = destSwiftObject.getHeaders(); + assertThat(destHeaders.get("X-Object-Meta-Key3")).containsExactly("value3"); + assertEquals(destSwiftObject.getPayload().getContentMetadata().getContentDisposition(), "attachment; filename=\"updatedname.txt\""); // test exception thrown on bad source name try {
