From 832d575feb7f1545ded2d031f5ec207040727ed7 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Sun, 8 Oct 2023 20:02:08 +0200 Subject: [PATCH] feat(generic-binding): Move `@AsyncGenericOperationBinding` to own addon --- ...l-converters.yml => springwolf-addons.yml} | 12 +- build.gradle | 3 +- settings.gradle | 3 +- .../README.md | 2 +- .../src/main/java/.gitkeep | 0 .../src/test/java/.gitkeep | 0 .../springwolf-generic-binding/README.md | 45 ++++++++ .../springwolf-generic-binding/build.gradle | 51 +++++++++ .../AsyncGenericOperationBinding.java | 4 +- ...AsyncGenericOperationBindingProcessor.java | 4 +- .../annotation/processor/PropertiesUtil.java | 2 +- ...cGenericOperationBindingProcessorTest.java | 104 +++++++++++++----- .../bindings/BindingProcessorPriority.java | 3 +- .../processor/PropertiesUtilTest.java | 83 -------------- .../springwolf-sqs-example/build.gradle | 1 + .../sqs/producers/AnotherProducer.java | 2 +- 16 files changed, 190 insertions(+), 129 deletions(-) rename .github/workflows/{springwolf-common-model-converters.yml => springwolf-addons.yml} (86%) delete mode 100644 springwolf-add-ons/springwolf-common-model-converters/src/main/java/.gitkeep delete mode 100644 springwolf-add-ons/springwolf-common-model-converters/src/test/java/.gitkeep create mode 100644 springwolf-add-ons/springwolf-generic-binding/README.md create mode 100644 springwolf-add-ons/springwolf-generic-binding/build.gradle rename {springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings => springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding}/annotation/AsyncGenericOperationBinding.java (87%) rename {springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings => springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding}/annotation/processor/AsyncGenericOperationBindingProcessor.java (87%) rename {springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings => springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding}/annotation/processor/PropertiesUtil.java (95%) rename {springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings => springwolf-add-ons/springwolf-generic-binding/src/test/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding}/annotation/processor/AsyncGenericOperationBindingProcessorTest.java (51%) delete mode 100644 springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtilTest.java diff --git a/.github/workflows/springwolf-common-model-converters.yml b/.github/workflows/springwolf-addons.yml similarity index 86% rename from .github/workflows/springwolf-common-model-converters.yml rename to .github/workflows/springwolf-addons.yml index 77dc641eb..0c3b2c4d6 100644 --- a/.github/workflows/springwolf-common-model-converters.yml +++ b/.github/workflows/springwolf-addons.yml @@ -1,4 +1,4 @@ -name: springwolf-common-model-converters +name: springwolf-addons on: push: @@ -7,14 +7,18 @@ on: pull_request: types: [ opened, synchronize, ready_for_review ] -env: - addon: springwolf-add-ons/springwolf-common-model-converters - jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + addon: [ "common-model-converters", "generic-binding" ] + + env: + addon: springwolf-add-ons/springwolf-${{ matrix.addon }} + steps: - uses: actions/checkout@v4 diff --git a/build.gradle b/build.gradle index d29595b4b..7cf88435c 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,8 @@ allprojects { project.name == 'springwolf-kafka' || project.name == 'springwolf-sqs' || project.name == 'springwolf-ui' || - project.name == 'springwolf-common-model-converters') + project.name == 'springwolf-common-model-converters' || + project.name == 'springwolf-generic-binding') tasks.withType(PublishToMavenRepository).configureEach { it.enabled = publishingEnabled } tasks.withType(PublishToMavenLocal).configureEach { it.enabled = publishingEnabled } publishing { diff --git a/settings.gradle b/settings.gradle index cc62680bf..bc09f0d1d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,7 +11,8 @@ include( 'springwolf-examples:springwolf-kafka-example', 'springwolf-examples:springwolf-sqs-example', 'springwolf-ui', - 'springwolf-add-ons:springwolf-common-model-converters' + 'springwolf-add-ons:springwolf-common-model-converters', + 'springwolf-add-ons:springwolf-generic-binding' ) project(':springwolf-plugins:springwolf-amqp-plugin').name = 'springwolf-amqp' diff --git a/springwolf-add-ons/springwolf-common-model-converters/README.md b/springwolf-add-ons/springwolf-common-model-converters/README.md index 1be4b63c3..39c879c0b 100644 --- a/springwolf-add-ons/springwolf-common-model-converters/README.md +++ b/springwolf-add-ons/springwolf-common-model-converters/README.md @@ -22,6 +22,6 @@ Add the following dependency: ```groovy dependencies { - implementation 'io.github.springwolf:springwolf-common-model-converters:0.1.1' + implementation 'io.github.springwolf:springwolf-common-model-converters:' } ``` diff --git a/springwolf-add-ons/springwolf-common-model-converters/src/main/java/.gitkeep b/springwolf-add-ons/springwolf-common-model-converters/src/main/java/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/springwolf-add-ons/springwolf-common-model-converters/src/test/java/.gitkeep b/springwolf-add-ons/springwolf-common-model-converters/src/test/java/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/springwolf-add-ons/springwolf-generic-binding/README.md b/springwolf-add-ons/springwolf-generic-binding/README.md new file mode 100644 index 000000000..8c99a68e6 --- /dev/null +++ b/springwolf-add-ons/springwolf-generic-binding/README.md @@ -0,0 +1,45 @@ +# Springwolf Generic Binding Add-on + +### Table Of Contents + +- [About](#about) +- [Usage](#usage) + - [Dependencies](#dependencies) + - [Code](#code) + +### About + +This module allows to document any binding in a generic way. + +It is intended to document fields that are not yet support by Springwolf and/or AsyncApi. +It can also be used to document vendor-specific protocols or properties. + +There exists no validation on key or value names. + +### Usage + +Add the following dependency: + +#### Dependencies + +```groovy +dependencies { + implementation 'io.github.springwolf:springwolf-generic-binding:0.1.1' +} +``` + +#### Code + +```java +class TestClass { + @AsyncPublisher( + // ... + ) + @AsyncGenericOperationBinding( + type = "custom-sqs", + fields = {"internal-field=customValue", "nested.key=nestedValue"}) + public void sendMessage(AnotherPayloadDto msg) { + // ... + } +} +``` diff --git a/springwolf-add-ons/springwolf-generic-binding/build.gradle b/springwolf-add-ons/springwolf-generic-binding/build.gradle new file mode 100644 index 000000000..b403008f4 --- /dev/null +++ b/springwolf-add-ons/springwolf-generic-binding/build.gradle @@ -0,0 +1,51 @@ +plugins { + id 'java-library' + + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'ca.cutterslade.analyze' +} + +dependencies { + api project(":springwolf-core") + + implementation "com.asyncapi:asyncapi-core:${asyncapiCoreVersion}" + implementation "org.slf4j:slf4j-api:${slf4jApiVersion}" + + implementation "org.springframework:spring-context" + implementation "org.springframework:spring-core" + + annotationProcessor "org.projectlombok:lombok:${lombokVersion}" + + testImplementation "org.assertj:assertj-core:${assertjCoreVersion}" + testImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + testRuntimeOnly "org.junit.jupiter:junit-jupiter:${junitJupiterVersion}" +} + +jar { + enabled = true + archiveClassifier = '' +} +bootJar.enabled = false + +java { + withJavadocJar() + withSourcesJar() +} + +test { + dependsOn spotlessApply // Automatically fix code formatting if possible + + useJUnitPlatform() +} + +publishing { + publications { + mavenJava(MavenPublication) { + pom { + name = 'springwolf-generic-binding' + description = 'Document any AsyncApi binding in Springwolf using a generic way' + } + } + } +} diff --git a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/AsyncGenericOperationBinding.java b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/AsyncGenericOperationBinding.java similarity index 87% rename from springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/AsyncGenericOperationBinding.java rename to springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/AsyncGenericOperationBinding.java index 6ccbe0fc4..288a9c32c 100644 --- a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/AsyncGenericOperationBinding.java +++ b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/AsyncGenericOperationBinding.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache-2.0 -package io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation; +package io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation; import io.github.stavshamir.springwolf.asyncapi.scanners.channels.annotation.AsyncOperationBinding; @@ -8,8 +8,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -// TODO: move classes to new bindings package - /** * Springwolf cannot support all available protocol bindings that exist. * To allow users to manually define them, {@link AsyncGenericOperationBinding} can be used. diff --git a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessor.java b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessor.java similarity index 87% rename from springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessor.java rename to springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessor.java index fb0ababd7..e860aa84c 100644 --- a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessor.java +++ b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessor.java @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 -package io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.processor; +package io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.processor; import com.asyncapi.v2.binding.operation.OperationBinding; +import io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.AsyncGenericOperationBinding; import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.BindingProcessorPriority; import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.ProcessedOperationBinding; -import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.AsyncGenericOperationBinding; import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.processor.AbstractOperationBindingProcessor; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; diff --git a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtil.java b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/PropertiesUtil.java similarity index 95% rename from springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtil.java rename to springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/PropertiesUtil.java index 3b6c71942..05f0db9e7 100644 --- a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtil.java +++ b/springwolf-add-ons/springwolf-generic-binding/src/main/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/PropertiesUtil.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache-2.0 -package io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.processor; +package io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.processor; import lombok.extern.slf4j.Slf4j; diff --git a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessorTest.java b/springwolf-add-ons/springwolf-generic-binding/src/test/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessorTest.java similarity index 51% rename from springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessorTest.java rename to springwolf-add-ons/springwolf-generic-binding/src/test/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessorTest.java index cab291f2e..21ff81115 100644 --- a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/AsyncGenericOperationBindingProcessorTest.java +++ b/springwolf-add-ons/springwolf-generic-binding/src/test/java/io/github/stavshamir/springwolf/asyncapi/addon/genericbinding/annotation/processor/AsyncGenericOperationBindingProcessorTest.java @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 -package io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.processor; +package io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.processor; -import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.AsyncGenericOperationBinding; +import io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.AsyncGenericOperationBinding; import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.ProcessedOperationBinding; import org.junit.jupiter.api.Test; @@ -39,27 +39,6 @@ void testClassWithAnnotationHasABinding() { assertThat(binding.getExtensionFields()).isEqualTo(Map.of("binding", Map.of("field", "1"), "field", "true")); } - @Test - void testClassWithMultipleAnnotationHasABinding() { - // when - List result = getProcessedOperationBindings(ClassWithMultipleAnnotation.class); - - // then - assertThat(result).hasSize(2); - - ProcessedOperationBinding processedOperationBinding = result.get(0); - assertThat(processedOperationBinding.getType()).isEqualTo("test-binding"); - AsyncGenericOperationBindingProcessor.DefaultAsyncGenerialOperationBinding binding = - (AsyncGenericOperationBindingProcessor.DefaultAsyncGenerialOperationBinding) - processedOperationBinding.getBinding(); - assertThat(binding.getExtensionFields()).isEqualTo(Map.of("binding", Map.of("field", "1"), "field", "true")); - - ProcessedOperationBinding processedOperationBinding2 = result.get(1); - assertThat(processedOperationBinding2.getType()).isEqualTo("another-binding"); - assertThat(processedOperationBinding2.getBinding()) - .isEqualTo(new AsyncGenericOperationBindingProcessor.DefaultAsyncGenerialOperationBinding(Map.of())); - } - private List getProcessedOperationBindings(Class testClass) { List result = Arrays.stream(testClass.getDeclaredMethods()) .map((m) -> m.getAnnotationsByType(AsyncGenericOperationBinding.class)) @@ -82,13 +61,78 @@ private void methodWithAnnotation() {} private void methodWithoutAnnotation() {} } - private static class ClassWithMultipleAnnotation { - @AsyncGenericOperationBinding( - type = "test-binding", - fields = {"binding.field=1", "field=true"}) - @AsyncGenericOperationBinding(type = "another-binding") - private void methodWithAnnotation() {} + static class PropertiesUtilTest { - private void methodWithoutAnnotation() {} + @Test + void emptyTest() { + // given + String[] strings = {}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEmpty(); + } + + @Test + void onePropertyTest() { + // given + String[] strings = {"key=value"}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEqualTo(Map.of("key", "value")); + } + + @Test + void twoPropertiesTest() { + // given + String[] strings = {"key1=value1", "key2=value2"}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEqualTo(Map.of("key1", "value1", "key2", "value2")); + } + + @Test + void nestedPropertyTest() { + // given + String[] strings = {"nested.key=value"}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEqualTo(Map.of("nested", Map.of("key", "value"))); + } + + @Test + void deeplyNestedPropertyTest() { + // given + String[] strings = {"very.deeply.nested.key=value"}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEqualTo(Map.of("very", Map.of("deeply", Map.of("nested", Map.of("key", "value"))))); + } + + @Test + void yamlSyntaxDoesWorkAsWell() { + // given + String[] strings = {"key: value"}; + + // when + Map result = PropertiesUtil.toMap(strings); + + // then + assertThat(result).isEqualTo(Map.of("key", "value")); + } } } diff --git a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/BindingProcessorPriority.java b/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/BindingProcessorPriority.java index 861f6eab1..6c6057e76 100644 --- a/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/BindingProcessorPriority.java +++ b/springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/BindingProcessorPriority.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 package io.github.stavshamir.springwolf.asyncapi.scanners.bindings; -import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.AsyncGenericOperationBinding; import io.github.stavshamir.springwolf.configuration.AsyncApiDocket; /** @@ -20,7 +19,7 @@ public class BindingProcessorPriority { *

* to extend and overwrite the protocol binding - which might not support all features *

- * Example: {@link AsyncGenericOperationBinding} + * Example: AsyncGenericOperationBinding */ public static final int GENERIC_BINDING = 2; diff --git a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtilTest.java b/springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtilTest.java deleted file mode 100644 index 333f0cfa3..000000000 --- a/springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/bindings/annotation/processor/PropertiesUtilTest.java +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -package io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.processor; - -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -class PropertiesUtilTest { - - @Test - void emptyTest() { - // given - String[] strings = {}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEmpty(); - } - - @Test - void onePropertyTest() { - // given - String[] strings = {"key=value"}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEqualTo(Map.of("key", "value")); - } - - @Test - void twoPropertiesTest() { - // given - String[] strings = {"key1=value1", "key2=value2"}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEqualTo(Map.of("key1", "value1", "key2", "value2")); - } - - @Test - void nestedPropertyTest() { - // given - String[] strings = {"nested.key=value"}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEqualTo(Map.of("nested", Map.of("key", "value"))); - } - - @Test - void deeplyNestedPropertyTest() { - // given - String[] strings = {"very.deeply.nested.key=value"}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEqualTo(Map.of("very", Map.of("deeply", Map.of("nested", Map.of("key", "value"))))); - } - - @Test - void yamlSyntaxDoesWorkAsWell() { - // given - String[] strings = {"key: value"}; - - // when - Map result = PropertiesUtil.toMap(strings); - - // then - assertThat(result).isEqualTo(Map.of("key", "value")); - } -} diff --git a/springwolf-examples/springwolf-sqs-example/build.gradle b/springwolf-examples/springwolf-sqs-example/build.gradle index 68ba11b97..5460a8ddb 100644 --- a/springwolf-examples/springwolf-sqs-example/build.gradle +++ b/springwolf-examples/springwolf-sqs-example/build.gradle @@ -16,6 +16,7 @@ dependencyManagement { dependencies { implementation project(":springwolf-core") + implementation project(":springwolf-add-ons:springwolf-generic-binding") implementation project(":springwolf-plugins:springwolf-sqs") annotationProcessor project(":springwolf-plugins:springwolf-sqs") diff --git a/springwolf-examples/springwolf-sqs-example/src/main/java/io/github/stavshamir/springwolf/example/sqs/producers/AnotherProducer.java b/springwolf-examples/springwolf-sqs-example/src/main/java/io/github/stavshamir/springwolf/example/sqs/producers/AnotherProducer.java index 0add2d9a6..8c241fd9e 100644 --- a/springwolf-examples/springwolf-sqs-example/src/main/java/io/github/stavshamir/springwolf/example/sqs/producers/AnotherProducer.java +++ b/springwolf-examples/springwolf-sqs-example/src/main/java/io/github/stavshamir/springwolf/example/sqs/producers/AnotherProducer.java @@ -2,7 +2,7 @@ package io.github.stavshamir.springwolf.example.sqs.producers; import io.awspring.cloud.sqs.operations.SqsTemplate; -import io.github.stavshamir.springwolf.asyncapi.scanners.bindings.annotation.AsyncGenericOperationBinding; +import io.github.stavshamir.springwolf.asyncapi.addon.genericbinding.annotation.AsyncGenericOperationBinding; import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation.AsyncOperation; import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation.AsyncPublisher; import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation.SqsAsyncOperationBinding;