From f59d4516f3571024408205b4ca2fcfbfe2459d70 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 13:32:30 +0530 Subject: [PATCH 01/10] add boolean topicExists() method --- .../io/awspring/cloud/sns/core/SnsOperations.java | 9 +++++++++ .../java/io/awspring/cloud/sns/core/SnsTemplate.java | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsOperations.java b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsOperations.java index 908bdfebd..fc129e3c9 100644 --- a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsOperations.java +++ b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsOperations.java @@ -19,6 +19,7 @@ * High level SNS operations. * * @author Maciej Walkowiak + * @author Hardik Singh Behl * @since 3.0 */ public interface SnsOperations { @@ -30,4 +31,12 @@ public interface SnsOperations { * @param notification - the notification */ void sendNotification(String topic, SnsNotification notification); + + /** + * Checks if topic with given ARN exists. + * + * @param topicArn - ARN of the topic + * @return true if topic exists, false otherwise + */ + boolean topicExists(String topicArn); } diff --git a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java index 071dd565c..65cd1fcd7 100644 --- a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java +++ b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java @@ -34,6 +34,7 @@ import org.springframework.util.Assert; import software.amazon.awssdk.arns.Arn; import software.amazon.awssdk.services.sns.SnsClient; +import software.amazon.awssdk.services.sns.model.NotFoundException; /** * Helper class that simplifies synchronous sending of notifications to SNS. The only mandatory fields are @@ -151,6 +152,17 @@ public void addChannelInterceptor(ChannelInterceptor channelInterceptor) { public void sendNotification(String topic, SnsNotification notification) { this.convertAndSend(topic, notification.getPayload(), notification.getHeaders()); } + + @Override + public boolean topicExists(String topicArn) { + Assert.notNull(topicArn, "topicArn must not be null"); + try { + snsClient.getTopicAttributes(request -> request.topicArn(topicArn)); + } catch (NotFoundException exception) { + return false; + } + return true; + } private TopicMessageChannel resolveMessageChannelByTopicName(String topicName) { Arn topicArn = this.topicArnResolver.resolveTopicArn(topicName); From d61b48871a83cc936db579584d90f32c405a6595 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 13:32:41 +0530 Subject: [PATCH 02/10] adding integration test --- .../SnsTemplateIntegrationTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java b/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java index e6cc2d63d..8e2db2b97 100644 --- a/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java +++ b/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java @@ -24,6 +24,8 @@ import io.awspring.cloud.sns.core.SnsTemplate; import io.awspring.cloud.sns.core.TopicNotFoundException; import io.awspring.cloud.sns.core.TopicsListingTopicArnResolver; +import net.bytebuddy.utility.RandomString; + import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.AfterEach; @@ -203,5 +205,25 @@ private static void createTopics() { } } } + + @Test + void shouldReturnFalseForNonExistingTopic() { + String nonExistentTopicArn = String.format("arn:aws:sns:us-east-1:000000000000:%s", RandomString.make()); + + boolean response = snsTemplate.topicExists(nonExistentTopicArn); + + assertThat(response).isFalse(); + } + + @Test + void shouldReturnTrueForExistingTopic() { + String topicName = RandomString.make(); + snsClient.createTopic(request -> request.name(topicName)); + String topicArn = String.format("arn:aws:sns:us-east-1:000000000000:%s", topicName); + + boolean response = snsTemplate.topicExists(topicArn); + + assertThat(response).isTrue(); + } } From 86d52fa6205113f6d5c44e867d4aeac77213ad09 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 13:36:54 +0530 Subject: [PATCH 03/10] adding author in javadoc --- .../src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java | 1 + .../cloud/sns/integration/SnsTemplateIntegrationTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java index 65cd1fcd7..f769e7005 100644 --- a/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java +++ b/spring-cloud-aws-sns/src/main/java/io/awspring/cloud/sns/core/SnsTemplate.java @@ -43,6 +43,7 @@ * @author Alain Sahli * @author Matej Nedic * @author Mariusz Sondecki + * @author Hardik Singh Behl * @since 1.0 */ public class SnsTemplate extends AbstractMessageSendingTemplate diff --git a/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java b/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java index 8e2db2b97..dbcd2c8e1 100644 --- a/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java +++ b/spring-cloud-aws-sns/src/test/java/io/awspring/cloud/sns/integration/SnsTemplateIntegrationTest.java @@ -53,6 +53,7 @@ * Integration tests for {@link SnsTemplate}. * * @author Matej Nedic + * @author Hardik Singh Behl */ @Testcontainers class SnsTemplateIntegrationTest { From c608bce48e7a5610cc6f35d8a34aab58b11d94b5 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 14:27:09 +0530 Subject: [PATCH 04/10] deleting .DS_Store file in docs --- docs/src/main/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/src/main/.DS_Store diff --git a/docs/src/main/.DS_Store b/docs/src/main/.DS_Store deleted file mode 100644 index 26314ead22bb662e62a8ae0d3d6028b133b97c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyJ`bL3>+mc4$`xgh))kw^KoU0CC22 z7}qgN5Su56y>LuqhGt16Ce>=hu%t8Js;(D~iAjgm@L~02s|m&8>Ab&1IjkotN&zWw zuE2e6=idLH>3_`s=OpcaCNP^IqHNYr5Bb(cQQX3PZGGVzgs! gyd6JAQPwqI^Sl?1i9u&R=tTVtxGpj&aBT&?0j+)&cK`qY From bba15519efa1c6c1b0bc8f018f565e38025dbc29 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 14:29:08 +0530 Subject: [PATCH 05/10] git ignore .DS_Store files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 17973c670..6eb3f5312 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ mail.properties .project .classpath .settings/ +.DS_Store .vscode/ From a7c6f6c9162ae0a587063d0354ecf434f88011d9 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 14:29:50 +0530 Subject: [PATCH 06/10] updating IAM permission docs --- docs/src/main/asciidoc/sns.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/sns.adoc b/docs/src/main/asciidoc/sns.adoc index 21d474b95..db603c4aa 100644 --- a/docs/src/main/asciidoc/sns.adoc +++ b/docs/src/main/asciidoc/sns.adoc @@ -235,6 +235,7 @@ Following IAM permissions are required by Spring Cloud AWS: | To publish notification you will also need | `sns:ListTopics` | To use Annotation-driven HTTP notification endpoint | `sns:ConfirmSubscription` | For resolving topic name to ARN | `sns:CreateTopic` +| For validating topic existence by ARN | `sns:GetTopicAttributes` |=== Sample IAM policy granting access to SNS: @@ -248,7 +249,8 @@ Sample IAM policy granting access to SNS: "Effect": "Allow", "Action": [ "sns:Publish", - "sns:ConfirmSubscription" + "sns:ConfirmSubscription", + "sns:GetTopicAttributes" ], "Resource": "yourArn" }, From 5709548a2c876881ca156ad42b1ce9a0eac334fa Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 28 Apr 2024 14:59:15 +0530 Subject: [PATCH 07/10] updating docs --- docs/src/main/asciidoc/sns.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/main/asciidoc/sns.adoc b/docs/src/main/asciidoc/sns.adoc index db603c4aa..a0f801de9 100644 --- a/docs/src/main/asciidoc/sns.adoc +++ b/docs/src/main/asciidoc/sns.adoc @@ -85,6 +85,8 @@ public class TopicArnResolverConfiguration { ---- +However when using the topic ARN itself in your application, `SnsTemplate` exposes a method `topicExists` that can be used to validate the SNS topic's existence at application startup itself. + ==== SNS Operations Because of Spring Messaging compatibility, `SnsTemplate` exposes many methods that you may not need if you don't need Spring Messaging abstractions. From d3b0cbc3cd88c55cf8f142a816cbd19524d3d295 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 29 Apr 2024 11:17:42 +0530 Subject: [PATCH 08/10] improve docs --- docs/src/main/asciidoc/sns.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/sns.adoc b/docs/src/main/asciidoc/sns.adoc index a0f801de9..8d098f837 100644 --- a/docs/src/main/asciidoc/sns.adoc +++ b/docs/src/main/asciidoc/sns.adoc @@ -85,7 +85,7 @@ public class TopicArnResolverConfiguration { ---- -However when using the topic ARN itself in your application, `SnsTemplate` exposes a method `topicExists` that can be used to validate the SNS topic's existence at application startup itself. +However, when using the topic ARN in your application, the `SnsTemplate` provides a `topicExists` method to validate the existence of the SNS topic at application startup itself. ==== SNS Operations From c373fbe99736bdf8f2581117e45f1d1ee4d3348f Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Wed, 1 May 2024 12:12:22 +0530 Subject: [PATCH 09/10] Revert "git ignore .DS_Store files" This reverts commit bba15519efa1c6c1b0bc8f018f565e38025dbc29. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6eb3f5312..17973c670 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,6 @@ mail.properties .project .classpath .settings/ -.DS_Store .vscode/ From c35383b8c3ccda3072fded66627af82176d59a1d Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Wed, 1 May 2024 12:14:36 +0530 Subject: [PATCH 10/10] Revert "deleting .DS_Store file in docs" This reverts commit c608bce48e7a5610cc6f35d8a34aab58b11d94b5. --- docs/src/main/.DS_Store | Bin 0 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/main/.DS_Store diff --git a/docs/src/main/.DS_Store b/docs/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..26314ead22bb662e62a8ae0d3d6028b133b97c20 GIT binary patch literal 6148 zcmeHKyJ`bL3>+mc4$`xgh))kw^KoU0CC22 z7}qgN5Su56y>LuqhGt16Ce>=hu%t8Js;(D~iAjgm@L~02s|m&8>Ab&1IjkotN&zWw zuE2e6=idLH>3_`s=OpcaCNP^IqHNYr5Bb(cQQX3PZGGVzgs! gyd6JAQPwqI^Sl?1i9u&R=tTVtxGpj&aBT&?0j+)&cK`qY literal 0 HcmV?d00001