Repository: jclouds
Updated Branches:
  refs/heads/2.0.x 43c0b3472 -> d2041667d


Return lastModified and size when listing S3 parts


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

Branch: refs/heads/2.0.x
Commit: d2041667d770bcb865a7bfb451b5910dd9084d91
Parents: 43c0b34
Author: Andrew Gaul <[email protected]>
Authored: Thu Feb 16 18:52:44 2017 -0800
Committer: Andrew Gaul <[email protected]>
Committed: Mon Mar 6 19:49:43 2017 -0800

----------------------------------------------------------------------
 .../src/main/java/org/jclouds/s3/S3Client.java  | 14 ++++
 .../s3/domain/ListMultipartUploadResponse.java  | 42 +++++++++++
 .../jclouds/s3/xml/PartIdsFromHttpResponse.java |  3 +
 .../s3/xml/PartIdsFromHttpResponseFull.java     | 79 ++++++++++++++++++++
 .../java/org/jclouds/s3/S3ClientLiveTest.java   |  7 +-
 5 files changed, 143 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/d2041667/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 7f80f3b..35fce21 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/S3Client.java
@@ -75,6 +75,7 @@ import org.jclouds.s3.domain.BucketMetadata;
 import org.jclouds.s3.domain.CannedAccessPolicy;
 import org.jclouds.s3.domain.DeleteResult;
 import org.jclouds.s3.domain.ListBucketResponse;
+import org.jclouds.s3.domain.ListMultipartUploadResponse;
 import org.jclouds.s3.domain.ListMultipartUploadsResponse;
 import org.jclouds.s3.domain.ObjectMetadata;
 import org.jclouds.s3.domain.Payer;
@@ -104,8 +105,10 @@ import org.jclouds.s3.xml.ListBucketHandler;
 import org.jclouds.s3.xml.ListMultipartUploadsHandler;
 import org.jclouds.s3.xml.LocationConstraintHandler;
 import org.jclouds.s3.xml.PartIdsFromHttpResponse;
+import org.jclouds.s3.xml.PartIdsFromHttpResponseFull;
 import org.jclouds.s3.xml.PayerHandler;
 
+import com.google.common.annotations.Beta;
 import com.google.inject.Provides;
 
 /**
@@ -780,6 +783,8 @@ public interface S3Client extends Closeable {
          @PathParam("key") String key, @QueryParam("uploadId") String uploadId,
          @BinderParam(BindPartIdsAndETagsToRequest.class) Map<Integer, String> 
parts);
 
+   /** @deprecated see #listMultipartPartsFull */
+   @Deprecated
    @Named("ListMultipartParts")
    @GET
    @Path("/{key}")
@@ -788,6 +793,15 @@ public interface S3Client extends Closeable {
          @BinderParam(BindAsHostPrefixIfConfigured.class) 
@ParamValidators(BucketNameValidator.class) String bucketName,
          @PathParam("key") String key, @QueryParam("uploadId") String 
uploadId);
 
+   @Beta
+   @Named("ListMultipartParts")
+   @GET
+   @Path("/{key}")
+   @XMLResponseParser(PartIdsFromHttpResponseFull.class)
+   Map<Integer, ListMultipartUploadResponse> listMultipartPartsFull(@Bucket 
@EndpointParam(parser = AssignCorrectHostnameForBucket.class)
+         @BinderParam(BindAsHostPrefixIfConfigured.class) 
@ParamValidators(BucketNameValidator.class) String bucketName,
+         @PathParam("key") String key, @QueryParam("uploadId") String 
uploadId);
+
    @Named("ListMultipartUploads")
    @GET
    @Path("/")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d2041667/apis/s3/src/main/java/org/jclouds/s3/domain/ListMultipartUploadResponse.java
----------------------------------------------------------------------
diff --git 
a/apis/s3/src/main/java/org/jclouds/s3/domain/ListMultipartUploadResponse.java 
b/apis/s3/src/main/java/org/jclouds/s3/domain/ListMultipartUploadResponse.java
new file mode 100644
index 0000000..3c34e3e
--- /dev/null
+++ 
b/apis/s3/src/main/java/org/jclouds/s3/domain/ListMultipartUploadResponse.java
@@ -0,0 +1,42 @@
+/*
+ * 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.s3.domain;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Date;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.Beta;
+
+@AutoValue
+@Beta
+public abstract class ListMultipartUploadResponse {
+   public abstract int partNumber();
+   public abstract Date lastModified();
+   public abstract String eTag();
+   public abstract long size();
+
+   public static ListMultipartUploadResponse create(int partNumber, Date 
lastModified, String eTag, long size) {
+      checkArgument(partNumber > 0, "partNumber must be greater than zero, 
was: %s", partNumber);
+      checkNotNull(eTag, "eTag");
+      lastModified = (Date) checkNotNull(lastModified, "lastModified").clone();
+      checkArgument(size >= 0, "size must be positive, was: %s", size);
+      return new AutoValue_ListMultipartUploadResponse(partNumber, 
lastModified, eTag, size);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d2041667/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponse.java
----------------------------------------------------------------------
diff --git 
a/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponse.java 
b/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponse.java
index add073c..fa8ac81 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponse.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponse.java
@@ -33,7 +33,10 @@ import com.google.common.collect.ImmutableMap;
  * Parses the following XML document:
  * <p/>
  * ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01";
+ *
+ * @deprecated see PartIdsFromHttpResponseFull
  */
+@Deprecated
 public class PartIdsFromHttpResponse extends 
ParseSax.HandlerWithResult<Map<Integer, String>> {
    private final StringBuilder currentText = new StringBuilder();
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d2041667/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponseFull.java
----------------------------------------------------------------------
diff --git 
a/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponseFull.java 
b/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponseFull.java
new file mode 100644
index 0000000..471a362
--- /dev/null
+++ b/apis/s3/src/main/java/org/jclouds/s3/xml/PartIdsFromHttpResponseFull.java
@@ -0,0 +1,79 @@
+/*
+ * 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.s3.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+
+import java.util.Date;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.date.DateService;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.s3.domain.ListMultipartUploadResponse;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Parses the following XML document:
+ * <p/>
+ * ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01";
+ */
+@Beta
+public final class PartIdsFromHttpResponseFull extends 
ParseSax.HandlerWithResult<Map<Integer, ListMultipartUploadResponse>> {
+   private final StringBuilder currentText = new StringBuilder();
+
+   private final DateService dateParser;
+
+   private int partNumber;
+   private Date lastModfied;
+   private String eTag;
+   private long size;
+
+   private final ImmutableMap.Builder<Integer, ListMultipartUploadResponse> 
parts = ImmutableMap.builder();
+
+   @Inject
+   PartIdsFromHttpResponseFull(DateService dateParser) {
+      this.dateParser = dateParser;
+   }
+
+   public Map<Integer, ListMultipartUploadResponse> getResult() {
+      return parts.build();
+   }
+
+   public void endElement(String uri, String name, String qName) {
+      if (qName.equals("PartNumber")) {
+         partNumber = Integer.parseInt(currentText.toString().trim());
+      } else if (qName.equals("LastModified")) {
+         lastModfied = 
dateParser.iso8601DateOrSecondsDateParse(currentOrNull(currentText));
+      } else if (qName.equals("ETag")) {
+         eTag = currentText.toString().trim();
+      } else if (qName.equals("Size")) {
+         size = Long.parseLong(currentText.toString().trim());
+      } else if (qName.equals("Part")) {
+         parts.put(partNumber, ListMultipartUploadResponse.create(partNumber, 
lastModfied, eTag, size));
+      }
+      currentText.setLength(0);
+   }
+
+   public void characters(char[] ch, int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d2041667/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 73a9eff..ede5551 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
@@ -56,6 +56,7 @@ import 
org.jclouds.s3.domain.AccessControlList.GroupGranteeURI;
 import org.jclouds.s3.domain.AccessControlList.Permission;
 import org.jclouds.s3.domain.CannedAccessPolicy;
 import org.jclouds.s3.domain.DeleteResult;
+import org.jclouds.s3.domain.ListMultipartUploadResponse;
 import org.jclouds.s3.domain.ListMultipartUploadsResponse;
 import org.jclouds.s3.domain.ObjectMetadata;
 import org.jclouds.s3.domain.ObjectMetadataBuilder;
@@ -514,7 +515,7 @@ public class S3ClientLiveTest extends 
BaseBlobStoreIntegrationTest {
          String key = "constitution.txt";
          String uploadId = getApi().initiateMultipartUpload(containerName,
                   
ObjectMetadataBuilder.create().key(key).contentMD5(oneHundredOneConstitutionsMD5.asBytes()).build());
-         assertThat(getApi().listMultipartParts(containerName, key, 
uploadId)).isEmpty();
+         assertThat(getApi().listMultipartPartsFull(containerName, key, 
uploadId)).isEmpty();
 
          byte[] buffer = oneHundredOneConstitutions.read();
          assertEquals(oneHundredOneConstitutions.size(), (long) buffer.length);
@@ -534,7 +535,9 @@ public class S3ClientLiveTest extends 
BaseBlobStoreIntegrationTest {
             // available there.
             eTagOf1 = getApi().uploadPart(containerName, key, 1, uploadId, 
part1);
          }
-         assertThat(getApi().listMultipartParts(containerName, key, 
uploadId)).containsOnlyKeys(1);
+         Map<Integer, ListMultipartUploadResponse> map = 
getApi().listMultipartPartsFull(containerName, key, uploadId);
+         assertThat(map).containsOnlyKeys(1);
+         assertThat(map.get(1).eTag()).isEqualTo(eTagOf1);
 
          getApi().completeMultipartUpload(containerName, key, uploadId, 
ImmutableMap.of(1, eTagOf1));
 

Reply via email to