Skip to content

Commit fb4d1f2

Browse files
Merge branch 'main' into sdkv2
2 parents 72ba71d + 54fa652 commit fb4d1f2

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<dependency>
6666
<groupId>junit</groupId>
6767
<artifactId>junit</artifactId>
68-
<version>4.12</version>
68+
<version>4.13.1</version>
6969
<scope>test</scope>
7070
</dependency>
7171
<dependency>
@@ -186,4 +186,4 @@
186186
</build>
187187
</profile>
188188
</profiles>
189-
</project>
189+
</project>

src/main/java/software/amazon/sns/AmazonSNSExtendedClient.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ public AmazonSNSExtendedClient(SnsClient snsClient, SNSExtendedClientConfigurati
4747
this.payloadStore = new S3BackedPayloadStore(s3Dao, this.snsExtendedClientConfiguration.getS3BucketName());
4848
}
4949

50+
/**
51+
* Constructs a new Amazon SNS extended client to invoke service methods on
52+
* Amazon SNS with extended functionality using the specified Amazon SNS
53+
* client object and Payload Store object.
54+
* <p>
55+
* <p>
56+
* All service calls made using this new client object are blocking, and
57+
* will not return until the service call completes.
58+
*
59+
* @param snsClient The Amazon SNS client to use to connect to Amazon SNS.
60+
* @param snsExtendedClientConfiguration The sns extended client configuration options controlling the
61+
* functionality of this client.
62+
* @param payloadStore The Payload Store that handles logic for saving to the desired
63+
* extended storage.
64+
*/
65+
public AmazonSNSExtendedClient(AmazonSNS snsClient, SNSExtendedClientConfiguration snsExtendedClientConfiguration, PayloadStore payloadStore) {
66+
super(snsClient);
67+
68+
this.snsExtendedClientConfiguration = snsExtendedClientConfiguration;
69+
this.payloadStore = payloadStore;
70+
}
71+
5072
/**
5173
* <p>
5274
* Sends a message to an Amazon SNS topic, a text message (SMS message) directly to a phone number, or a message to
@@ -212,9 +234,18 @@ private long getMessageAttributeSize(String MessageAttributeKey, MessageAttribut
212234
return messageAttributeSize;
213235
}
214236

237+
private static String getS3keyAttribute(Map<String, MessageAttributeValue> messageAttributes) {
238+
if (messageAttributes != null && messageAttributes.containsKey(S3_KEY)) {
239+
MessageAttributeValue attributeS3KeyValue = messageAttributes.get(S3_KEY);
240+
return (attributeS3KeyValue == null) ? null : attributeS3KeyValue.getStringValue();
241+
}
242+
return null;
243+
}
244+
215245
private PublishRequest storeMessageInExtendedStore(PublishRequest publishRequest, long messageAttributeSize) {
216246
String messageContentStr = publishRequest.message();
217247
Long messageContentSize = Util.getStringSizeInBytes(messageContentStr);
248+
String s3Key = getS3keyAttribute(publishRequest.getMessageAttributes()) ;
218249

219250
PublishRequest.Builder publishRequestBuilder = publishRequest.toBuilder();
220251
String largeMessagePointer = payloadStore.storeOriginalPayload(messageContentStr);
@@ -225,6 +256,7 @@ private PublishRequest storeMessageInExtendedStore(PublishRequest publishRequest
225256
messageAttributeValueBuilder.stringValue(messageContentSize.toString());
226257
MessageAttributeValue messageAttributeValue = messageAttributeValueBuilder.build();
227258

259+
228260
Map<String, MessageAttributeValue> attributes = new HashMap<>(publishRequest.messageAttributes());
229261
attributes.put(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME, messageAttributeValue);
230262
publishRequestBuilder.messageAttributes(attributes);

src/test/java/software/amazon/sns/AmazonSNSExtendedClientTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,26 @@ public void testPublishLargeMessageS3IsUsed() {
6969
Assert.assertEquals(messageBody.length(), (int) Integer.valueOf(attributes.get(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME).stringValue()));
7070
}
7171

72+
@Test
73+
public void testPublishLargeMessageS3IsUsedWithS3Key() {
74+
String messageBody = generateStringWithLength(MORE_THAN_SNS_SIZE_LIMIT);
75+
76+
PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, messageBody);
77+
HashMap<String, MessageAttributeValue> attrs = new HashMap<>();
78+
attrs.put("S3Key", new MessageAttributeValue().withStringValue("value"));
79+
publishRequest.setMessageAttributes(attrs);
80+
extendedSnsWithDefaultConfig.publish(publishRequest);
81+
82+
verify(mockS3, times(1)).putObject(any(PutObjectRequest.class));
83+
ArgumentCaptor<PublishRequest> publishRequestCaptor = ArgumentCaptor.forClass(PublishRequest.class);
84+
verify(mockSnsBackend, times(1)).publish(publishRequestCaptor.capture());
85+
86+
Map<String, MessageAttributeValue> attributes = publishRequestCaptor.getValue().getMessageAttributes();
87+
Assert.assertEquals("Number", attributes.get(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME).getDataType());
88+
89+
Assert.assertEquals(messageBody.length(), (int) Integer.valueOf(attributes.get(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME).getStringValue()));
90+
}
91+
7292
@Test
7393
public void testPublishSmallMessageS3IsNotUsed() {
7494
String messageBody = generateStringWithLength(SNSExtendedClientConfiguration.SNS_DEFAULT_MESSAGE_SIZE);

0 commit comments

Comments
 (0)