55 * you may not use this file except in compliance with the License.
66 * You may obtain a copy of the License at
77 *
8- * http://www.apache.org/licenses/LICENSE-2.0
8+ * http://www.apache.org/licenses/LICENSE-2.0
99 *
1010 * Unless required by applicable law or agreed to in writing, software
1111 * distributed under the License is distributed on an "AS IS" BASIS,
1616
1717package com .google .cloud .storage .multipartupload .model ;
1818
19+ import com .fasterxml .jackson .annotation .JsonAlias ;
20+ import com .fasterxml .jackson .dataformat .xml .annotation .JacksonXmlElementWrapper ;
21+ import com .fasterxml .jackson .dataformat .xml .annotation .JacksonXmlProperty ;
1922import com .google .api .core .BetaApi ;
2023import com .google .common .collect .ImmutableList ;
24+ import java .util .ArrayList ;
25+ import java .util .List ;
2126import java .util .Objects ;
2227
2328/**
2429 * A response from listing all multipart uploads in a bucket.
2530 *
2631 * @see <a href="https://cloud.google.com/storage/docs/multipart-uploads#listing-uploads">Listing
27- * multipart uploads</a>
28- * @since 2.60.0 This new api is in preview and is subject to breaking changes.
32+ * multipart uploads</a>
33+ * @since 2.60.1 This new api is in preview and is subject to breaking changes.
2934 */
3035@ BetaApi
3136public final class ListMultipartUploadsResponse {
3237
33- private ImmutableList <MultipartUpload > uploads ;
38+ @ JacksonXmlElementWrapper (useWrapping = false )
39+ @ JacksonXmlProperty (localName = "Upload" )
40+ private List <MultipartUpload > uploads ;
41+
42+ @ JacksonXmlProperty (localName = "Bucket" )
3443 private String bucket ;
44+
45+ @ JacksonXmlProperty (localName = "Delimiter" )
3546 private String delimiter ;
47+
48+ @ JacksonXmlProperty (localName = "EncodingType" )
3649 private String encodingType ;
50+
51+ @ JacksonXmlProperty (localName = "KeyMarker" )
3752 private String keyMarker ;
53+
54+ @ JacksonXmlProperty (localName = "UploadIdMarker" )
3855 private String uploadIdMarker ;
56+
57+ @ JacksonXmlProperty (localName = "NextKeyMarker" )
3958 private String nextKeyMarker ;
59+
60+ @ JacksonXmlProperty (localName = "NextUploadIdMarker" )
4061 private String nextUploadIdMarker ;
62+
63+ @ JacksonXmlProperty (localName = "MaxUploads" )
4164 private int maxUploads ;
65+
66+ @ JacksonXmlProperty (localName = "Prefix" )
4267 private String prefix ;
68+
69+ @ JsonAlias ("truncated" )
70+ @ JacksonXmlProperty (localName = "IsTruncated" )
4371 private boolean isTruncated ;
44- private ImmutableList <String > commonPrefixes ;
72+
73+ @ JacksonXmlElementWrapper (useWrapping = false )
74+ @ JacksonXmlProperty (localName = "CommonPrefixes" )
75+ private List <CommonPrefixHelper > commonPrefixes ;
76+
77+ // Jackson requires a no-arg constructor
78+ private ListMultipartUploadsResponse () {}
4579
4680 private ListMultipartUploadsResponse (
47- ImmutableList <MultipartUpload > uploads ,
81+ List <MultipartUpload > uploads ,
4882 String bucket ,
4983 String delimiter ,
5084 String encodingType ,
@@ -55,7 +89,7 @@ private ListMultipartUploadsResponse(
5589 int maxUploads ,
5690 String prefix ,
5791 boolean isTruncated ,
58- ImmutableList <String > commonPrefixes ) {
92+ List <String > commonPrefixes ) {
5993 this .uploads = uploads ;
6094 this .bucket = bucket ;
6195 this .delimiter = delimiter ;
@@ -67,28 +101,21 @@ private ListMultipartUploadsResponse(
67101 this .maxUploads = maxUploads ;
68102 this .prefix = prefix ;
69103 this .isTruncated = isTruncated ;
70- this .commonPrefixes = commonPrefixes ;
104+ if (commonPrefixes != null ) {
105+ this .commonPrefixes = new ArrayList <>();
106+ for (String p : commonPrefixes ) {
107+ CommonPrefixHelper h = new CommonPrefixHelper ();
108+ h .prefix = p ;
109+ this .commonPrefixes .add (h );
110+ }
111+ }
71112 }
72113
73- private ListMultipartUploadsResponse () {}
74-
75- /**
76- * The list of multipart uploads.
77- *
78- * @return The list of multipart uploads.
79- * @since 2.60.0 This new api is in preview and is subject to breaking changes.
80- */
81114 @ BetaApi
82115 public ImmutableList <MultipartUpload > getUploads () {
83- return uploads ;
116+ return uploads == null ? ImmutableList . of () : ImmutableList . copyOf ( uploads ) ;
84117 }
85118
86- /**
87- * The bucket that contains the multipart uploads.
88- *
89- * @return The bucket name.
90- * @since 2.60.0 This new api is in preview and is subject to breaking changes.
91- */
92119 @ BetaApi
93120 public String getBucket () {
94121 return bucket ;
@@ -201,7 +228,12 @@ public boolean isTruncated() {
201228 */
202229 @ BetaApi
203230 public ImmutableList <String > getCommonPrefixes () {
204- return commonPrefixes ;
231+ if (commonPrefixes == null ) {
232+ return ImmutableList .of ();
233+ }
234+ return commonPrefixes .stream ()
235+ .map (h -> h .prefix )
236+ .collect (ImmutableList .toImmutableList ());
205237 }
206238
207239 @ Override
@@ -215,7 +247,7 @@ public boolean equals(Object o) {
215247 ListMultipartUploadsResponse that = (ListMultipartUploadsResponse ) o ;
216248 return isTruncated == that .isTruncated
217249 && maxUploads == that .maxUploads
218- && Objects .equals (uploads , that .uploads )
250+ && Objects .equals (getUploads () , that .getUploads () )
219251 && Objects .equals (bucket , that .bucket )
220252 && Objects .equals (delimiter , that .delimiter )
221253 && Objects .equals (encodingType , that .encodingType )
@@ -224,13 +256,13 @@ public boolean equals(Object o) {
224256 && Objects .equals (nextKeyMarker , that .nextKeyMarker )
225257 && Objects .equals (nextUploadIdMarker , that .nextUploadIdMarker )
226258 && Objects .equals (prefix , that .prefix )
227- && Objects .equals (commonPrefixes , that .commonPrefixes );
259+ && Objects .equals (getCommonPrefixes () , that .getCommonPrefixes () );
228260 }
229261
230262 @ Override
231263 public int hashCode () {
232264 return Objects .hash (
233- uploads ,
265+ getUploads () ,
234266 bucket ,
235267 delimiter ,
236268 encodingType ,
@@ -241,13 +273,13 @@ public int hashCode() {
241273 maxUploads ,
242274 prefix ,
243275 isTruncated ,
244- commonPrefixes );
276+ getCommonPrefixes () );
245277 }
246278
247279 @ Override
248280 public String toString () {
249281 return "ListMultipartUploadsResponse{" +
250- "uploads=" + uploads +
282+ "uploads=" + getUploads () +
251283 ", bucket='" + bucket + "'" +
252284 ", delimiter='" + delimiter + "'" +
253285 ", encodingType='" + encodingType + "'" +
@@ -258,7 +290,7 @@ public String toString() {
258290 ", maxUploads=" + maxUploads +
259291 ", prefix='" + prefix + "'" +
260292 ", isTruncated=" + isTruncated +
261- ", commonPrefixes=" + commonPrefixes +
293+ ", commonPrefixes=" + getCommonPrefixes () +
262294 '}' ;
263295 }
264296
@@ -273,11 +305,11 @@ public static Builder builder() {
273305 return new Builder ();
274306 }
275307
276- /**
277- * A builder for {@link ListMultipartUploadsResponse}.
278- *
279- * @since 2.60.0 This new api is in preview and is subject to breaking changes.
280- */
308+ public static class CommonPrefixHelper {
309+ @ JacksonXmlProperty ( localName = "Prefix" )
310+ public String prefix ;
311+ }
312+
281313 @ BetaApi
282314 public static final class Builder {
283315 private ImmutableList <MultipartUpload > uploads ;
0 commit comments