forked from minio/minio-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPutObjectBaseArgs.java
More file actions
194 lines (167 loc) · 6.04 KB
/
Copy pathPutObjectBaseArgs.java
File metadata and controls
194 lines (167 loc) · 6.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
* MinIO Java SDK for Amazon S3 Compatible Cloud Storage, (C) 2020 MinIO, Inc.
*
* Licensed 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 io.minio;
import java.io.IOException;
import java.util.Objects;
import okhttp3.MediaType;
/** Common arguments of {@link PutObjectArgs} and {@link UploadObjectArgs}. */
public abstract class PutObjectBaseArgs extends ObjectWriteArgs {
protected Long objectSize;
protected long partSize;
protected int partCount;
protected MediaType contentType;
protected Checksum.Algorithm checksum;
protected int parallelUploads;
protected long delayMs = 200L;
protected int maxRetries = 5;
public Long objectSize() {
return objectSize;
}
public long partSize() {
return partSize;
}
public int partCount() {
return partCount;
}
public MediaType contentType() throws IOException {
return contentType != null ? contentType : super.contentType();
}
public Checksum.Algorithm checksum() {
return checksum;
}
public int parallelUploads() {
return parallelUploads;
}
public long delayMs() {
return delayMs;
}
public int maxRetries() {
return maxRetries;
}
/** Builder of {@link PutObjectBaseArgs}. */
@SuppressWarnings("unchecked") // Its safe to type cast to B as B is inherited by this class
public abstract static class Builder<B extends Builder<B, A>, A extends PutObjectBaseArgs>
extends ObjectWriteArgs.Builder<B, A> {
protected void validate(A args) {
super.validate(args);
if (args.checksum != null
&& args.partCount > 0
&& (!(args.partCount == 1 && args.checksum.fullObjectSupport()
|| args.partCount > 1 && args.checksum.compositeSupport()))) {
throw new IllegalArgumentException(
"unsupported checksum " + args.checksum + " for part count " + args.partCount);
}
}
protected long[] getPartInfo(Long objectSize, Long partSize) {
if (partSize != null && partSize > 0) {
if (partSize < MIN_MULTIPART_SIZE) {
throw new IllegalArgumentException(
"part size " + partSize + " is not supported; minimum allowed 5MiB");
}
if (partSize > MAX_PART_SIZE) {
throw new IllegalArgumentException(
"part size " + partSize + " is not supported; maximum allowed 5GiB");
}
}
if (objectSize == null || objectSize < 0) {
if (partSize == null || partSize <= 0) {
throw new IllegalArgumentException(
"valid part size must be provided for unknown object size");
}
return new long[] {partSize, -1};
}
if (partSize == null || partSize <= 0) {
// Calculate part size by multiple of MIN_MULTIPART_SIZE.
double dPartSize = Math.ceil((double) objectSize / MAX_MULTIPART_COUNT);
dPartSize = Math.ceil(dPartSize / MIN_MULTIPART_SIZE) * MIN_MULTIPART_SIZE;
partSize = (long) dPartSize;
}
if (partSize > objectSize) return new long[] {partSize, 1};
long partCount = (long) Math.ceil((double) objectSize / partSize);
if (partCount > MAX_MULTIPART_COUNT) {
throw new IllegalArgumentException(
"object size "
+ objectSize
+ " and part size "
+ partSize
+ " make more than "
+ MAX_MULTIPART_COUNT
+ "parts for upload");
}
return new long[] {partSize, partCount};
}
public B contentType(String value) {
MediaType contentType = MediaType.parse(value);
if (value != null && contentType == null) {
throw new IllegalArgumentException("invalid content type '" + value + "' as per RFC 2045");
}
return contentType(contentType);
}
public B contentType(MediaType contentType) {
operations.add(args -> args.contentType = contentType);
return (B) this;
}
public B checksum(Checksum.Algorithm algorithm) {
if (algorithm == Checksum.Algorithm.MD5) {
throw new IllegalArgumentException(Checksum.Algorithm.MD5 + " algorithm is not allowed");
}
operations.add(args -> args.checksum = algorithm);
return (B) this;
}
public B parallelUploads(int parallelUploads) {
operations.add(args -> args.parallelUploads = parallelUploads);
return (B) this;
}
/** Set delay between retries. Value <= 0 disables retry (default 200ms). */
public B delayMs(long delayMs) {
operations.add(args -> args.delayMs = delayMs);
return (B) this;
}
/** Set maximum retry between failure. Value <= 0 disables retry (default 5). */
public B maxRetries(int maxRetries) {
operations.add(args -> args.maxRetries = maxRetries);
return (B) this;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PutObjectBaseArgs)) return false;
if (!super.equals(o)) return false;
PutObjectBaseArgs that = (PutObjectBaseArgs) o;
return Objects.equals(objectSize, that.objectSize)
&& partSize == that.partSize
&& partCount == that.partCount
&& Objects.equals(contentType, that.contentType)
&& Objects.equals(checksum, that.checksum)
&& parallelUploads == that.parallelUploads
&& delayMs == that.delayMs
&& maxRetries == that.maxRetries;
}
@Override
public int hashCode() {
return Objects.hash(
super.hashCode(),
objectSize,
partSize,
partCount,
contentType,
checksum,
parallelUploads,
delayMs,
maxRetries);
}
}