Skip to content

Commit aacd092

Browse files
committed
Added intital interfaces
1 parent 4cba429 commit aacd092

File tree

9 files changed

+454
-20
lines changed

9 files changed

+454
-20
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/multipartuploader/MultipartUploader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requestBody
3737
throws IOException;
3838

3939
CompleteMultipartResponse completeMultipartUpload(CompleteMultipartRequest request)
40-
throws NoSuchAlgorithmException;
40+
throws NoSuchAlgorithmException, IOException;
4141
}

google-cloud-storage/src/main/java/com/google/cloud/storage/multipartuploader/MultipartUploaderImpl.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ public class MultipartUploaderImpl implements MultipartUploader {
4646

4747
// Add HMAC keys from GCS Settings > Interoperability
4848

49+
4950
// --- End Configuration ---
5051
private static final String GCS_ENDPOINT = "https://storage.googleapis.com";
5152

5253
public CreateMultipartUploadResponse createMultipartUpload(CreateMultipartUploadRequest request)
5354
throws IOException {
54-
//String resourcePath = "/" + request.getBucketName() + "/" + request.getObjectName();
55-
String resourcePath = "/" + BUCKET_NAME + "/" + OBJECT_NAME;
55+
String resourcePath = "/" + request.getBucket() + "/" + request.getKey();
5656
String uri = GCS_ENDPOINT + resourcePath + "?uploads";
5757
String date = getRfc1123Date();
5858
String contentType = "application/x-www-form-urlencoded";
@@ -77,13 +77,13 @@ public CreateMultipartUploadResponse createMultipartUpload(CreateMultipartUpload
7777
String uploadIdTag = "<UploadId>";
7878
int start = responseBody.indexOf(uploadIdTag) + uploadIdTag.length();
7979
int end = responseBody.indexOf("</UploadId>");
80-
int uploadId = Integer.parseInt(responseBody.substring(start, end));
81-
return new CreateMultipartUploadResponse(uploadId);
80+
String uploadId = responseBody.substring(start, end);
81+
return CreateMultipartUploadResponse.newBuilder().setUploadId(uploadId).build();
8282
}
8383

8484
public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requestBody)
8585
throws IOException {
86-
String resourcePath = "/" + BUCKET_NAME + "/" + OBJECT_NAME;
86+
String resourcePath = "/" + request.getBucket() + "/" + request.getKey();
8787
String queryString = "?partNumber=" + request.getPartNumber() + "&uploadId=" + request.getUploadId();
8888
String uri = GCS_ENDPOINT + resourcePath + queryString;
8989
String date = getRfc1123Date();
@@ -110,17 +110,17 @@ public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requ
110110
throw new RuntimeException("Failed to upload part " + request.getPartNumber() + ": " + connection.getResponseCode() + " " + error);
111111
}
112112
String eTag = connection.getHeaderField("ETag");
113-
return new UploadPartResponse(eTag);
113+
return UploadPartResponse.newBuilder().setEtag(eTag).build();
114114
}
115115

116116
public CompleteMultipartResponse completeMultipartUpload(CompleteMultipartRequest request)
117-
throws NoSuchAlgorithmException {
118-
String resourcePath = "/" + BUCKET_NAME + "/" + OBJECT_NAME;
117+
throws NoSuchAlgorithmException, IOException {
118+
String resourcePath = "/" + request.getBucket() + "/" + request.getKey();
119119
String queryString = "?uploadId=" + request.getUploadId();
120120
String uri = GCS_ENDPOINT + resourcePath + queryString;
121121

122122
StringBuilder xmlBodyBuilder = new StringBuilder("<CompleteMultipartUpload>\n");
123-
for (CompletedPart part : request.getCompletedParts()) {
123+
for (CompletedPart part : request.getCompletedMultipartUpload().getCompletedPartList()) {
124124
xmlBodyBuilder.append(" <Part>\n");
125125
xmlBodyBuilder.append(" <PartNumber>").append(part.getPartNumber()).append("</PartNumber>\n");
126126
xmlBodyBuilder.append(" <ETag>").append(part.getEtag()).append("</ETag>\n");
@@ -135,7 +135,7 @@ public CompleteMultipartResponse completeMultipartUpload(CompleteMultipartReques
135135
String contentType = "application/xml";
136136

137137
// GCS Signature Rule #3: The query string IS NOT included for the POST complete request.
138-
String signature = signRequest("POST", contentMd5, contentType, date, resourcePath);
138+
String signature = signRequest("POST", contentMd5, contentType, date, resourcePath, GOOGLE_SECRET_KEY);
139139
String authHeader = "GOOG1 " + GOOGLE_ACCESS_KEY + ":" + signature;
140140

141141
HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();

google-cloud-storage/src/main/java/com/google/cloud/storage/multipartuploader/data/CompleteMultipartRequest.java

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,103 @@
1616

1717
package com.google.cloud.storage.multipartuploader.data;
1818

19+
import com.google.common.base.MoreObjects;
20+
import java.util.Objects;
21+
1922
public class CompleteMultipartRequest {
2023

24+
private final String bucket;
25+
private final String key;
26+
private final String uploadId;
27+
private final CompletedMultipartUpload completedMultipartUpload;
28+
29+
private CompleteMultipartRequest(Builder builder) {
30+
this.bucket = builder.bucket;
31+
this.key = builder.key;
32+
this.uploadId = builder.uploadId;
33+
this.completedMultipartUpload = builder.completedMultipartUpload;
34+
}
35+
36+
public String getBucket() {
37+
return bucket;
38+
}
39+
40+
public String getKey() {
41+
return key;
42+
}
43+
2144
public String getUploadId() {
45+
return uploadId;
46+
}
47+
48+
public CompletedMultipartUpload getCompletedMultipartUpload() {
49+
return completedMultipartUpload;
50+
}
51+
52+
@Override
53+
public boolean equals(Object o) {
54+
if (this == o) {
55+
return true;
56+
}
57+
if (!(o instanceof CompleteMultipartRequest)) {
58+
return false;
59+
}
60+
CompleteMultipartRequest that = (CompleteMultipartRequest) o;
61+
return Objects.equals(bucket, that.bucket)
62+
&& Objects.equals(key, that.key)
63+
&& Objects.equals(uploadId, that.uploadId)
64+
&& Objects.equals(completedMultipartUpload, that.completedMultipartUpload);
2265
}
2366

24-
public CompletedPart[] getCompletedParts() {
67+
@Override
68+
public int hashCode() {
69+
return Objects.hash(bucket, key, uploadId, completedMultipartUpload);
70+
}
71+
72+
@Override
73+
public String toString() {
74+
return MoreObjects.toStringHelper(this)
75+
.add("bucket", bucket)
76+
.add("key", key)
77+
.add("uploadId", uploadId)
78+
.add("completedMultipartUpload", completedMultipartUpload)
79+
.toString();
80+
}
81+
82+
public static Builder newBuilder() {
83+
return new Builder();
84+
}
85+
86+
public static class Builder {
87+
private String bucket;
88+
private String key;
89+
private String uploadId;
90+
private CompletedMultipartUpload completedMultipartUpload;
91+
92+
private Builder() {}
93+
94+
public Builder setBucket(String bucket) {
95+
this.bucket = bucket;
96+
return this;
97+
}
98+
99+
public Builder setKey(String key) {
100+
this.key = key;
101+
return this;
102+
}
103+
104+
public Builder setUploadId(String uploadId) {
105+
this.uploadId = uploadId;
106+
return this;
107+
}
108+
109+
public Builder setCompletedMultipartUpload(CompletedMultipartUpload completedMultipartUpload) {
110+
this.completedMultipartUpload = completedMultipartUpload;
111+
return this;
112+
}
113+
114+
public CompleteMultipartRequest build() {
115+
return new CompleteMultipartRequest(this);
116+
}
25117
}
26118
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright 2023 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.google.cloud.storage.multipartuploader.data;
17+
18+
import com.google.common.base.MoreObjects;
19+
import java.util.List;
20+
import java.util.Objects;
21+
22+
public class CompletedMultipartUpload {
23+
24+
private final List<CompletedPart> completedPartList;
25+
26+
private CompletedMultipartUpload(Builder builder) {
27+
this.completedPartList = builder.completedPartList;
28+
}
29+
30+
public List<CompletedPart> getCompletedPartList() {
31+
return completedPartList;
32+
}
33+
34+
@Override
35+
public boolean equals(Object o) {
36+
if (this == o) {
37+
return true;
38+
}
39+
if (!(o instanceof CompletedMultipartUpload)) {
40+
return false;
41+
}
42+
CompletedMultipartUpload that = (CompletedMultipartUpload) o;
43+
return Objects.equals(completedPartList, that.completedPartList);
44+
}
45+
46+
@Override
47+
public int hashCode() {
48+
return Objects.hash(completedPartList);
49+
}
50+
51+
@Override
52+
public String toString() {
53+
return MoreObjects.toStringHelper(this)
54+
.add("completedPartList", completedPartList)
55+
.toString();
56+
}
57+
58+
public static Builder newBuilder() {
59+
return new Builder();
60+
}
61+
62+
public static class Builder {
63+
private List<CompletedPart> completedPartList;
64+
65+
private Builder() {}
66+
67+
public Builder setCompletedPartList(List<CompletedPart> completedPartList) {
68+
this.completedPartList = completedPartList;
69+
return this;
70+
}
71+
72+
public CompletedMultipartUpload build() {
73+
return new CompletedMultipartUpload(this);
74+
}
75+
}
76+
}

google-cloud-storage/src/main/java/com/google/cloud/storage/multipartuploader/data/CompletedPart.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
/*
2+
* Copyright 2023 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
116
package com.google.cloud.storage.multipartuploader.data;
217

318
public class CompletedPart {

google-cloud-storage/src/main/java/com/google/cloud/storage/multipartuploader/data/CreateMultipartUploadRequest.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,74 @@
1616

1717
package com.google.cloud.storage.multipartuploader.data;
1818

19+
import com.google.common.base.MoreObjects;
20+
import java.util.Objects;
21+
1922
public class CreateMultipartUploadRequest {
23+
private final String bucket;
24+
25+
private final String key;
26+
27+
private CreateMultipartUploadRequest(Builder builder) {
28+
this.bucket = builder.bucket;
29+
this.key = builder.key;
30+
}
31+
32+
public String getBucket() {
33+
return bucket;
34+
}
35+
36+
public String getKey() {
37+
return key;
38+
}
39+
40+
@Override
41+
public boolean equals(Object o) {
42+
if (this == o) {
43+
return true;
44+
}
45+
if (!(o instanceof CreateMultipartUploadRequest)) {
46+
return false;
47+
}
48+
CreateMultipartUploadRequest that = (CreateMultipartUploadRequest) o;
49+
return Objects.equals(bucket, that.bucket) && Objects.equals(key, that.key);
50+
}
51+
52+
@Override
53+
public int hashCode() {
54+
return Objects.hash(bucket, key);
55+
}
56+
57+
@Override
58+
public String toString() {
59+
return MoreObjects.toStringHelper(this)
60+
.add("bucket", bucket)
61+
.add("key", key)
62+
.toString();
63+
}
64+
65+
public static Builder newBuilder() {
66+
return new Builder();
67+
}
68+
69+
public static class Builder {
70+
private String bucket;
71+
private String key;
72+
73+
private Builder() {}
74+
75+
public Builder setBucket(String bucket) {
76+
this.bucket = bucket;
77+
return this;
78+
}
79+
80+
public Builder setKey(String key) {
81+
this.key = key;
82+
return this;
83+
}
2084

85+
public CreateMultipartUploadRequest build() {
86+
return new CreateMultipartUploadRequest(this);
87+
}
88+
}
2189
}

0 commit comments

Comments
 (0)