forked from awslabs/amazon-sqs-java-extended-client-lib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExtendedClientConfiguration.java
386 lines (345 loc) · 13.8 KB
/
ExtendedClientConfiguration.java
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
/*
* Copyright 2010-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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 com.amazon.sqs.javamessaging;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import software.amazon.awssdk.annotations.NotThreadSafe;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
import software.amazon.awssdk.utils.StringUtils;
import software.amazon.payloadoffloading.PayloadStorageConfiguration;
import software.amazon.payloadoffloading.ServerSideEncryptionStrategy;
import java.util.regex.Pattern;
/**
* Amazon SQS extended client configuration options such as Amazon S3 client,
* bucket name, and message size threshold for large-payload messages.
*/
@NotThreadSafe
public class ExtendedClientConfiguration extends PayloadStorageConfiguration {
private static final Log LOG = LogFactory.getLog(ExtendedClientConfiguration.class);
private static final int UUID_LENGTH = 36;
private static final int MAX_S3_KEY_LENGTH = 1024;
private static final int MAX_S3_KEY_PREFIX_LENGTH = MAX_S3_KEY_LENGTH - UUID_LENGTH;
private static final Pattern INVALID_S3_PREFIX_KEY_CHARACTERS_PATTERN = Pattern.compile("[^a-zA-Z0-9./_-]");
private boolean cleanupS3Payload = true;
private boolean useLegacyReservedAttributeName = true;
private boolean ignorePayloadNotFound = false;
private String s3KeyPrefix = "";
public ExtendedClientConfiguration() {
super();
this.setPayloadSizeThreshold(SQSExtendedClientConstants.DEFAULT_MESSAGE_SIZE_THRESHOLD);
}
public ExtendedClientConfiguration(ExtendedClientConfiguration other) {
super(other);
this.cleanupS3Payload = other.doesCleanupS3Payload();
this.useLegacyReservedAttributeName = other.usesLegacyReservedAttributeName();
this.ignorePayloadNotFound = other.ignoresPayloadNotFound();
this.s3KeyPrefix = other.s3KeyPrefix;
}
/**
* Enables support for payload messages.
* @param s3
* Amazon S3 client which is going to be used for storing
* payload messages.
* @param s3BucketName
* Name of the bucket which is going to be used for storing
* payload messages. The bucket must be already created and
* configured in s3.
* @param cleanupS3Payload
* If set to true, would handle deleting the S3 object as part
* of deleting the message from SQS queue. Otherwise, would not
* attempt to delete the object from S3. If opted to not delete S3
* objects its the responsibility to the message producer to handle
* the clean up appropriately.
*/
public void setPayloadSupportEnabled(S3Client s3, String s3BucketName, boolean cleanupS3Payload) {
setPayloadSupportEnabled(s3, s3BucketName);
this.cleanupS3Payload = cleanupS3Payload;
}
/**
* Enables support for payload messages.
* @param s3
* Amazon S3 client which is going to be used for storing
* payload messages.
* @param s3BucketName
* Name of the bucket which is going to be used for storing
* payload messages. The bucket must be already created and
* configured in s3.
* @param cleanupS3Payload
* If set to true, would handle deleting the S3 object as part
* of deleting the message from SQS queue. Otherwise, would not
* attempt to delete the object from S3. If opted to not delete S3
* objects its the responsibility to the message producer to handle
* the clean up appropriately.
*/
public ExtendedClientConfiguration withPayloadSupportEnabled(S3Client s3, String s3BucketName, boolean cleanupS3Payload) {
setPayloadSupportEnabled(s3, s3BucketName, cleanupS3Payload);
return this;
}
/**
* Disables the utilization legacy payload attribute name when sending messages.
*/
public void setLegacyReservedAttributeNameDisabled() {
this.useLegacyReservedAttributeName = false;
}
/**
* Disables the utilization legacy payload attribute name when sending messages.
*/
public ExtendedClientConfiguration withLegacyReservedAttributeNameDisabled() {
setLegacyReservedAttributeNameDisabled();
return this;
}
/**
* Sets whether or not messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3.
*
* @param ignorePayloadNotFound
* Whether or not messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3. Default: false
*/
public void setIgnorePayloadNotFound(boolean ignorePayloadNotFound) {
this.ignorePayloadNotFound = ignorePayloadNotFound;
}
/**
* Sets whether or not messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3.
*
* @param ignorePayloadNotFound
* Whether or not messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3. Default: false
* @return the updated ExtendedClientConfiguration object.
*/
public ExtendedClientConfiguration withIgnorePayloadNotFound(boolean ignorePayloadNotFound) {
setIgnorePayloadNotFound(ignorePayloadNotFound);
return this;
}
/**
* Sets a string that will be used as prefix of the S3 Key.
*
* @param s3KeyPrefix
* A S3 key prefix value
*/
public void setS3KeyPrefix(String s3KeyPrefix) {
String trimmedPrefix = StringUtils.trimToEmpty(s3KeyPrefix);
if (trimmedPrefix.length() > MAX_S3_KEY_PREFIX_LENGTH) {
String errorMessage = "The S3 key prefix length must not be greater than " + MAX_S3_KEY_PREFIX_LENGTH;
LOG.error(errorMessage);
throw SdkClientException.create(errorMessage);
}
if (trimmedPrefix.startsWith(".") || trimmedPrefix.startsWith("/")) {
String errorMessage = "The S3 key prefix must not starts with '.' or '/'";
LOG.error(errorMessage);
throw SdkClientException.create(errorMessage);
}
if (trimmedPrefix.contains("..")) {
String errorMessage = "The S3 key prefix must not contains the string '..'";
LOG.error(errorMessage);
throw SdkClientException.create(errorMessage);
}
if (INVALID_S3_PREFIX_KEY_CHARACTERS_PATTERN.matcher(trimmedPrefix).find()) {
String errorMessage = "The S3 key prefix contain invalid characters. The allowed characters are: letters, digits, '/', '_', '-', and '.'";
LOG.error(errorMessage);
throw SdkClientException.create(errorMessage);
}
this.s3KeyPrefix = trimmedPrefix;
}
/**
* Sets a string that will be used as prefix of the S3 Key.
*
* @param s3KeyPrefix
* A S3 key prefix value
*
* @return the updated ExtendedClientConfiguration object.
*/
public ExtendedClientConfiguration withS3KeyPrefix(String s3KeyPrefix) {
setS3KeyPrefix(s3KeyPrefix);
return this;
}
/**
* Gets the S3 key prefix
* @return the prefix value which is being used for compose the S3 key.
*/
public String getS3KeyPrefix() {
return this.s3KeyPrefix;
}
/**
* Checks whether or not clean up large objects in S3 is enabled.
*
* @return True if clean up is enabled when deleting the concerning SQS message.
* Default: true
*/
public boolean doesCleanupS3Payload() {
return cleanupS3Payload;
}
/**
* Checks whether or not the configuration uses the legacy reserved attribute name.
*
* @return True if legacy reserved attribute name is used.
* Default: true
*/
public boolean usesLegacyReservedAttributeName() {
return useLegacyReservedAttributeName;
}
/**
* Checks whether or not messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3.
*
* @return True if messages should be removed from Amazon SQS
* when payloads are not found in Amazon S3. Default: false
*/
public boolean ignoresPayloadNotFound() {
return ignorePayloadNotFound;
}
@Override
public ExtendedClientConfiguration withAlwaysThroughS3(boolean alwaysThroughS3) {
setAlwaysThroughS3(alwaysThroughS3);
return this;
}
@Override
public ExtendedClientConfiguration withPayloadSupportEnabled(S3Client s3, String s3BucketName) {
this.setPayloadSupportEnabled(s3, s3BucketName);
return this;
}
@Override
public ExtendedClientConfiguration withObjectCannedACL(ObjectCannedACL objectCannedACL) {
this.setObjectCannedACL(objectCannedACL);
return this;
}
@Override
public ExtendedClientConfiguration withPayloadSizeThreshold(int payloadSizeThreshold) {
this.setPayloadSizeThreshold(payloadSizeThreshold);
return this;
}
@Override
public ExtendedClientConfiguration withPayloadSupportDisabled() {
this.setPayloadSupportDisabled();
return this;
}
@Override
public ExtendedClientConfiguration withServerSideEncryption(ServerSideEncryptionStrategy serverSideEncryption) {
this.setServerSideEncryptionStrategy(serverSideEncryption);
return this;
}
/**
* Enables support for large-payload messages.
*
* @param s3
* Amazon S3 client which is going to be used for storing
* large-payload messages.
* @param s3BucketName
* Name of the bucket which is going to be used for storing
* large-payload messages. The bucket must be already created and
* configured in s3.
*
* @deprecated Instead use {@link #setPayloadSupportEnabled(S3Client, String, boolean)}
*/
@Deprecated
public void setLargePayloadSupportEnabled(S3Client s3, String s3BucketName) {
this.setPayloadSupportEnabled(s3, s3BucketName);
}
/**
* Enables support for large-payload messages.
*
* @param s3
* Amazon S3 client which is going to be used for storing
* large-payload messages.
* @param s3BucketName
* Name of the bucket which is going to be used for storing
* large-payload messages. The bucket must be already created and
* configured in s3.
* @return the updated ExtendedClientConfiguration object.
*
* @deprecated Instead use {@link #withPayloadSupportEnabled(S3Client, String)}
*/
@Deprecated
public ExtendedClientConfiguration withLargePayloadSupportEnabled(S3Client s3, String s3BucketName) {
setLargePayloadSupportEnabled(s3, s3BucketName);
return this;
}
/**
* Disables support for large-payload messages.
*
* @deprecated Instead use {@link #setPayloadSupportDisabled()}
*/
@Deprecated
public void setLargePayloadSupportDisabled() {
this.setPayloadSupportDisabled();
}
/**
* Disables support for large-payload messages.
* @return the updated ExtendedClientConfiguration object.
*
* @deprecated Instead use {@link #withPayloadSupportDisabled()}
*/
@Deprecated
public ExtendedClientConfiguration withLargePayloadSupportDisabled() {
setLargePayloadSupportDisabled();
return this;
}
/**
* Check if the support for large-payload message if enabled.
* @return true if support for large-payload messages is enabled.
*
* @deprecated Instead use {@link #isPayloadSupportEnabled()}
*/
@Deprecated
public boolean isLargePayloadSupportEnabled() {
return isPayloadSupportEnabled();
}
/**
* Sets the message size threshold for storing message payloads in Amazon
* S3.
*
* @param messageSizeThreshold
* Message size threshold to be used for storing in Amazon S3.
* Default: 256KB.
*
* @deprecated Instead use {@link #setPayloadSizeThreshold(int)}
*/
@Deprecated
public void setMessageSizeThreshold(int messageSizeThreshold) {
this.setPayloadSizeThreshold(messageSizeThreshold);
}
/**
* Sets the message size threshold for storing message payloads in Amazon
* S3.
*
* @param messageSizeThreshold
* Message size threshold to be used for storing in Amazon S3.
* Default: 256KB.
* @return the updated ExtendedClientConfiguration object.
*
* @deprecated Instead use {@link #withPayloadSizeThreshold(int)}
*/
@Deprecated
public ExtendedClientConfiguration withMessageSizeThreshold(int messageSizeThreshold) {
setMessageSizeThreshold(messageSizeThreshold);
return this;
}
/**
* Gets the message size threshold for storing message payloads in Amazon
* S3.
*
* @return Message size threshold which is being used for storing in Amazon
* S3. Default: 256KB.
*
* @deprecated Instead use {@link #getPayloadSizeThreshold()}
*/
@Deprecated
public int getMessageSizeThreshold() {
return getPayloadSizeThreshold();
}
}