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/10/20 01:00:16 UTC
jclouds git commit: JCLOUDS-964: S3 multipart copy
Repository: jclouds
Updated Branches:
refs/heads/master 0c1de23a9 -> 4829bbbd2
JCLOUDS-964: S3 multipart copy
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/4829bbbd
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/4829bbbd
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/4829bbbd
Branch: refs/heads/master
Commit: 4829bbbd2c7f6c7b25c1794eeacc16e9c710929a
Parents: 0c1de23
Author: Andrew Gaul <ga...@apache.org>
Authored: Wed Oct 14 21:38:32 2015 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Wed Oct 14 23:17:40 2015 -0700
----------------------------------------------------------------------
.../src/main/java/org/jclouds/s3/S3Client.java | 12 ++++++++++
.../java/org/jclouds/s3/S3ClientLiveTest.java | 25 ++++++++++++++++++++
.../test/java/org/jclouds/s3/S3ClientTest.java | 19 +++++++++++++++
3 files changed, 56 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4829bbbd/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/S3Client.java b/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
index 442cf1b..126b353 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
@@ -678,6 +678,18 @@ public interface S3Client extends Closeable {
@PathParam("key") String key, @QueryParam("partNumber") int partNumber,
@QueryParam("uploadId") String uploadId, Payload part);
+ @Named("UploadPartCopy")
+ @PUT
+ @Path("/{key}")
+ @Headers(keys = {"x-amz-copy-source", "x-amz-copy-source-range"}, values = {"/{sourceBucket}/{sourceObject}", "bytes={startOffset}-{endOffset}"})
+ @ResponseParser(ETagFromHttpResponseViaRegex.class)
+ String uploadPartCopy(@Bucket @EndpointParam(parser = AssignCorrectHostnameForBucket.class) @BinderParam(
+ BindAsHostPrefixIfConfigured.class) @ParamValidators(BucketNameValidator.class) String bucketName,
+ @PathParam("key") String key, @QueryParam("partNumber") int partNumber,
+ @QueryParam("uploadId") String uploadId,
+ @PathParam("sourceBucket") String sourceBucket, @PathParam("sourceObject") String sourceObject,
+ @PathParam("startOffset") long startOffset, @PathParam("endOffset") long endOffset);
+
/**
*
This operation completes a multipart upload by assembling previously uploaded parts.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4829bbbd/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
index 0561226..79c2f6b 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
@@ -551,6 +551,31 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
}
}
+ public void testMultipartCopy() throws Exception {
+ String containerName = getContainerName();
+ try {
+ String fromObject = "fromObject";
+ S3Object object = getApi().newS3Object();
+ object.getMetadata().setKey(fromObject);
+ object.setPayload(oneHundredOneConstitutions);
+ object.getMetadata().getContentMetadata().setContentLength(oneHundredOneConstitutions.size());
+ getApi().putObject(containerName, object);
+
+ String toObject = "toObject";
+ String uploadId = getApi().initiateMultipartUpload(containerName, ObjectMetadataBuilder.create().key(toObject).build());
+
+ String eTagOf1 = getApi().uploadPartCopy(containerName, toObject, 1, uploadId, containerName, fromObject, 1, oneHundredOneConstitutions.size() - 1);
+
+ String eTag = getApi().completeMultipartUpload(containerName, toObject, uploadId, ImmutableMap.of(1, eTagOf1));
+ assertThat(eTag).isNotEqualTo(eTagOf1);
+
+ object = getApi().getObject(containerName, toObject);
+ assertEquals(ByteStreams2.toByteArrayAndClose(object.getPayload().openStream()), oneHundredOneConstitutions.slice(1, oneHundredOneConstitutions.size() - 1).read());
+ } finally {
+ returnContainer(containerName);
+ }
+ }
+
public void testDeleteMultipleObjects() throws InterruptedException {
String container = getContainerName();
try {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4829bbbd/apis/s3/src/test/java/org/jclouds/s3/S3ClientTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientTest.java
index 4432efc..8cfa53c 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientTest.java
@@ -550,6 +550,25 @@ public abstract class S3ClientTest<T extends S3Client> extends BaseS3ClientTest<
checkFilters(request);
}
+ public void testUploadPartCopy() throws SecurityException, NegativeArraySizeException, NoSuchMethodException {
+ Invokable<?, ?> method = method(S3Client.class, "uploadPartCopy", String.class, String.class, int.class,
+ String.class, String.class, String.class, long.class, long.class);
+ GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("bucket", "foo", 1, "asdsadasdas",
+ "anotherBucket", "anotherObject", 2, 10 * 1024 * 1024));
+
+ assertRequestLineEquals(request, "PUT https://bucket." + url + "/foo?partNumber=1&uploadId=asdsadasdas HTTP/1.1");
+ assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n" +
+ "x-amz-copy-source: /anotherBucket/anotherObject\n" +
+ "x-amz-copy-source-range: bytes=2-10485760\n");
+ assertPayloadEquals(request, null, "application/unknown", false);
+
+ assertResponseParserClassEquals(method, request, ETagFromHttpResponseViaRegex.class);
+ assertSaxResponseParserClassEquals(method, null);
+ assertFallbackClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+ checkFilters(request);
+ }
+
public void testCompleteMultipartUpload() throws SecurityException, NegativeArraySizeException,
NoSuchMethodException {
Invokable<?, ?> method = method(S3Client.class, "completeMultipartUpload", String.class, String.class,