From 39b4f02c919d25c080959664098ff4782a89caf3 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Fri, 15 Mar 2024 15:23:42 +0100 Subject: [PATCH 1/5] feat: document headers for method level listeners --- ...gAnnotationMethodLevelChannelsScanner.java | 4 +- .../common/ClassLevelAnnotationScanner.java | 1 - .../common/MethodLevelAnnotationScanner.java | 5 +- ...nnotationMethodLevelOperationsScanner.java | 4 +- ...odLevelChannelsScannerIntegrationTest.java | 7 +- ...otationMethodLevelChannelsScannerTest.java | 6 +- .../src/test/resources/asyncapi.json | 9 +- .../src/test/resources/asyncapi.json | 27 +-- .../src/test/resources/asyncapi.json | 171 +++++++++++++++++- .../src/test/resources/asyncapi.json | 42 ++--- .../SpringwolfAmqpScannerConfiguration.java | 14 +- .../SpringwolfJmsScannerConfiguration.java | 13 +- .../SpringwolfKafkaScannerConfiguration.java | 14 +- .../SpringwolfSqsScannerConfiguration.java | 13 +- 14 files changed, 260 insertions(+), 70 deletions(-) diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScanner.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScanner.java index d6678bf84..c29421473 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScanner.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScanner.java @@ -6,6 +6,7 @@ import io.github.springwolf.asyncapi.v3.model.channel.message.MessageObject; import io.github.springwolf.asyncapi.v3.model.channel.message.MessageReference; import io.github.springwolf.core.asyncapi.components.ComponentsService; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersBuilder; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory; import io.github.springwolf.core.asyncapi.scanners.common.MethodLevelAnnotationScanner; import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor; @@ -29,9 +30,10 @@ public class SpringAnnotationMethodLevelChannelsScanner methodAnnotationClass, BindingFactory bindingFactory, + AsyncHeadersBuilder asyncHeadersBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { - super(bindingFactory, componentsService); + super(bindingFactory, asyncHeadersBuilder, componentsService); this.methodAnnotationClass = methodAnnotationClass; this.payloadClassExtractor = payloadClassExtractor; } diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/ClassLevelAnnotationScanner.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/ClassLevelAnnotationScanner.java index 05887528f..f814e9392 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/ClassLevelAnnotationScanner.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/ClassLevelAnnotationScanner.java @@ -83,7 +83,6 @@ protected MessageObject buildMessage(ClassAnnotation classAnnotation, Class p Map messageBinding = bindingFactory.buildMessageBinding(classAnnotation); String modelName = componentsService.registerSchema(payloadType); String headerModelName = componentsService.registerSchema(asyncHeadersBuilder.buildHeaders(payloadType)); - MessagePayload payload = MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(modelName)) .build()); diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/MethodLevelAnnotationScanner.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/MethodLevelAnnotationScanner.java index aa1ad5998..1d5481223 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/MethodLevelAnnotationScanner.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/MethodLevelAnnotationScanner.java @@ -9,7 +9,7 @@ import io.github.springwolf.asyncapi.v3.model.schema.MultiFormatSchema; import io.github.springwolf.asyncapi.v3.model.schema.SchemaReference; import io.github.springwolf.core.asyncapi.components.ComponentsService; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersBuilder; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,12 +22,13 @@ public abstract class MethodLevelAnnotationScanner { protected final BindingFactory bindingFactory; + protected final AsyncHeadersBuilder asyncHeadersBuilder; protected final ComponentsService componentsService; protected MessageObject buildMessage(MethodAnnotation annotation, Class payloadType) { Map messageBinding = bindingFactory.buildMessageBinding(annotation); String modelName = componentsService.registerSchema(payloadType); - String headerModelName = componentsService.registerSchema(AsyncHeaders.NOT_DOCUMENTED); + String headerModelName = componentsService.registerSchema(asyncHeadersBuilder.buildHeaders(payloadType)); MessagePayload payload = MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(modelName)) .build()); diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationMethodLevelOperationsScanner.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationMethodLevelOperationsScanner.java index da7e20927..e222893fb 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationMethodLevelOperationsScanner.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationMethodLevelOperationsScanner.java @@ -8,6 +8,7 @@ import io.github.springwolf.asyncapi.v3.model.operation.Operation; import io.github.springwolf.asyncapi.v3.model.operation.OperationAction; import io.github.springwolf.core.asyncapi.components.ComponentsService; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersBuilder; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory; import io.github.springwolf.core.asyncapi.scanners.common.MethodLevelAnnotationScanner; import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor; @@ -32,9 +33,10 @@ public class SpringAnnotationMethodLevelOperationsScanner methodAnnotationClass, BindingFactory bindingFactory, + AsyncHeadersBuilder asyncHeadersBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { - super(bindingFactory, componentsService); + super(bindingFactory, asyncHeadersBuilder, componentsService); this.methodAnnotationClass = methodAnnotationClass; this.payloadClassExtractor = payloadClassExtractor; } diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java index daa1932c1..7759b4a5b 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java @@ -18,6 +18,7 @@ import io.github.springwolf.core.asyncapi.components.examples.walkers.DefaultSchemaWalker; import io.github.springwolf.core.asyncapi.components.examples.walkers.json.ExampleJsonValueGenerator; import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory; import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor; import io.github.springwolf.core.configuration.properties.SpringwolfConfigProperties; @@ -71,7 +72,11 @@ class SpringAnnotationMethodLevelChannelsScannerIntegrationTest { @BeforeEach void setUp() { scanner = new SpringAnnotationMethodLevelChannelsScanner<>( - TestChannelListener.class, this.bindingFactory, payloadClassExtractor, componentsService); + TestChannelListener.class, + this.bindingFactory, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); } @Nested diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java index 924e5d0b3..b9687d288 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java @@ -43,7 +43,11 @@ class SpringAnnotationMethodLevelChannelsScannerTest { private final BindingFactory bindingFactory = mock(BindingFactory.class); private final ComponentsService componentsService = mock(ComponentsService.class); SpringAnnotationMethodLevelChannelsScanner scanner = new SpringAnnotationMethodLevelChannelsScanner<>( - TestListener.class, bindingFactory, payloadClassExtractor, componentsService); + TestListener.class, + bindingFactory, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); private static final String CHANNEL = "test-channel"; private static final Map defaultOperationBinding = diff --git a/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json index 8f0d5758e..59f1ee413 100644 --- a/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json @@ -125,6 +125,13 @@ { } ] }, + "SpringRabbitListenerDefaultHeaders": { + "type": "object", + "properties": { }, + "examples": [ + { } + ] + }, "io.github.springwolf.examples.amqp.dtos.AnotherPayloadDto": { "type": "object", "properties": { @@ -221,7 +228,7 @@ }, "io.github.springwolf.examples.amqp.dtos.ExamplePayloadDto": { "headers": { - "$ref": "#/components/schemas/HeadersNotDocumented" + "$ref": "#/components/schemas/SpringRabbitListenerDefaultHeaders" }, "payload": { "schemaFormat": "application/vnd.aai.asyncapi+json;version=3.0.0", diff --git a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json index b79948964..271f048a8 100644 --- a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json @@ -27,6 +27,11 @@ "io.github.springwolf.examples.jms.dtos.AnotherPayloadDto": { "$ref": "#/components/messages/io.github.springwolf.examples.jms.dtos.AnotherPayloadDto" } + }, + "bindings": { + "jms": { + "bindingVersion": "0.0.1" + } } }, "example-queue": { @@ -138,7 +143,6 @@ }, "name": "io.github.springwolf.examples.jms.dtos.AnotherPayloadDto", "title": "AnotherPayloadDto", - "description": "Another payload model", "bindings": { "jms": { "bindingVersion": "0.0.1" @@ -180,27 +184,6 @@ } ] }, - "another-queue_send_sendMessage": { - "action": "send", - "channel": { - "$ref": "#/channels/another-queue" - }, - "title": "another-queue_send", - "description": "Custom, optional description defined in the AsyncPublisher annotation", - "bindings": { - "jms": { - "internal-field": "customValue", - "nested": { - "key": "nestedValue" - } - } - }, - "messages": [ - { - "$ref": "#/channels/another-queue/messages/io.github.springwolf.examples.jms.dtos.AnotherPayloadDto" - } - ] - }, "example-queue_receive_receiveExamplePayload": { "action": "receive", "channel": { diff --git a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json index cbb73e640..57058e48a 100644 --- a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json @@ -287,6 +287,39 @@ "type": "object" } }, + "SpringKafkaDefaultHeaders-AnotherPayloadAvroDto": { + "type": "object", + "properties": { + "__TypeId__": { + "type": "string", + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dto.avro.AnotherPayloadAvroDto" + ], + "examples": [ + "io.github.springwolf.examples.kafka.dto.avro.AnotherPayloadAvroDto" + ] + } + }, + "examples": [ + { + "__TypeId__": "io.github.springwolf.examples.kafka.dto.avro.AnotherPayloadAvroDto" + } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "properties": { + "__TypeId__": { + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dto.avro.AnotherPayloadAvroDto" + ], + "type": "string" + } + }, + "type": "object" + } + }, "SpringKafkaDefaultHeaders-AnotherPayloadDto": { "type": "object", "properties": { @@ -353,6 +386,39 @@ "type": "object" } }, + "SpringKafkaDefaultHeaders-Message": { + "type": "object", + "properties": { + "__TypeId__": { + "type": "string", + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dto.proto.ExamplePayloadProtobufDto$Message" + ], + "examples": [ + "io.github.springwolf.examples.kafka.dto.proto.ExamplePayloadProtobufDto$Message" + ] + } + }, + "examples": [ + { + "__TypeId__": "io.github.springwolf.examples.kafka.dto.proto.ExamplePayloadProtobufDto$Message" + } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "properties": { + "__TypeId__": { + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dto.proto.ExamplePayloadProtobufDto$Message" + ], + "type": "string" + } + }, + "type": "object" + } + }, "SpringKafkaDefaultHeaders-MonetaryAmount": { "type": "object", "properties": { @@ -386,6 +452,105 @@ "type": "object" } }, + "SpringKafkaDefaultHeaders-String": { + "type": "object", + "properties": { + "__TypeId__": { + "type": "string", + "description": "Spring Type Id Header", + "enum": [ + "java.lang.String" + ], + "examples": [ + "java.lang.String" + ] + } + }, + "examples": [ + { + "__TypeId__": "java.lang.String" + } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "properties": { + "__TypeId__": { + "description": "Spring Type Id Header", + "enum": [ + "java.lang.String" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "SpringKafkaDefaultHeaders-XmlPayloadDto": { + "type": "object", + "properties": { + "__TypeId__": { + "type": "string", + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto" + ], + "examples": [ + "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto" + ] + } + }, + "examples": [ + { + "__TypeId__": "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto" + } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "properties": { + "__TypeId__": { + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dtos.XmlPayloadDto" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "SpringKafkaDefaultHeaders-YamlPayloadDto": { + "type": "object", + "properties": { + "__TypeId__": { + "type": "string", + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dtos.YamlPayloadDto" + ], + "examples": [ + "io.github.springwolf.examples.kafka.dtos.YamlPayloadDto" + ] + } + }, + "examples": [ + { + "__TypeId__": "io.github.springwolf.examples.kafka.dtos.YamlPayloadDto" + } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "properties": { + "__TypeId__": { + "description": "Spring Type Id Header", + "enum": [ + "io.github.springwolf.examples.kafka.dtos.YamlPayloadDto" + ], + "type": "string" + } + }, + "type": "object" + } + }, "String": { "type": "string", "examples": [ @@ -934,7 +1099,7 @@ }, "io.github.springwolf.examples.kafka.dto.proto.ExamplePayloadProtobufDto$Message": { "headers": { - "$ref": "#/components/schemas/HeadersNotDocumented" + "$ref": "#/components/schemas/SpringKafkaDefaultHeaders-Message" }, "payload": { "schemaFormat": "application/vnd.aai.asyncapi+json;version=3.0.0", @@ -1052,7 +1217,7 @@ }, "java.lang.String": { "headers": { - "$ref": "#/components/schemas/HeadersNotDocumented" + "$ref": "#/components/schemas/SpringKafkaDefaultHeaders-String" }, "payload": { "schemaFormat": "application/vnd.aai.asyncapi+json;version=3.0.0", @@ -1302,4 +1467,4 @@ ] } } -} +} \ No newline at end of file diff --git a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json index 860bf0be1..7a2664e9e 100644 --- a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json @@ -27,6 +27,19 @@ "io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto": { "$ref": "#/components/messages/io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto" } + }, + "bindings": { + "sqs": { + "queue": { + "name": "another-queue", + "fifoQueue": true, + "deliveryDelay": 0, + "visibilityTimeout": 30, + "receiveMessageWaitTime": 0, + "messageRetentionPeriod": 345600 + }, + "bindingVersion": "0.2.0" + } } }, "example-queue": { @@ -146,7 +159,6 @@ }, "name": "io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto", "title": "AnotherPayloadDto", - "description": "Another payload model", "bindings": { "sqs": { } } @@ -196,34 +208,6 @@ } ] }, - "another-queue_send_sendMessage": { - "action": "send", - "channel": { - "$ref": "#/channels/another-queue" - }, - "title": "another-queue_send", - "description": "Custom, optional description defined in the AsyncPublisher annotation", - "bindings": { - "sqs": { - "queues": [ - { - "name": "queue-name", - "fifoQueue": true, - "deliveryDelay": 0, - "visibilityTimeout": 30, - "receiveMessageWaitTime": 0, - "messageRetentionPeriod": 345600 - } - ], - "bindingVersion": "0.2.0" - } - }, - "messages": [ - { - "$ref": "#/channels/another-queue/messages/io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto" - } - ] - }, "example-queue_receive_receiveExamplePayload": { "action": "receive", "channel": { diff --git a/springwolf-plugins/springwolf-amqp-plugin/src/main/java/io/github/springwolf/plugins/amqp/configuration/SpringwolfAmqpScannerConfiguration.java b/springwolf-plugins/springwolf-amqp-plugin/src/main/java/io/github/springwolf/plugins/amqp/configuration/SpringwolfAmqpScannerConfiguration.java index d4926c764..f9f000260 100644 --- a/springwolf-plugins/springwolf-amqp-plugin/src/main/java/io/github/springwolf/plugins/amqp/configuration/SpringwolfAmqpScannerConfiguration.java +++ b/springwolf-plugins/springwolf-amqp-plugin/src/main/java/io/github/springwolf/plugins/amqp/configuration/SpringwolfAmqpScannerConfiguration.java @@ -112,11 +112,16 @@ public SpringAnnotationOperationsScanner simpleRabbitClassLevelListenerAnnotatio public SpringAnnotationChannelsScanner simpleRabbitMethodLevelListenerAnnotationChannelsScanner( SpringwolfClassScanner classScanner, AmqpBindingFactory amqpBindingBuilder, + AsyncHeadersForAmqpBuilder asyncHeadersForAmqpBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { SpringAnnotationMethodLevelChannelsScanner strategy = new SpringAnnotationMethodLevelChannelsScanner<>( - RabbitListener.class, amqpBindingBuilder, payloadClassExtractor, componentsService); + RabbitListener.class, + amqpBindingBuilder, + asyncHeadersForAmqpBuilder, + payloadClassExtractor, + componentsService); return new SpringAnnotationChannelsScanner(classScanner, strategy); } @@ -130,11 +135,16 @@ public SpringAnnotationChannelsScanner simpleRabbitMethodLevelListenerAnnotation public SpringAnnotationOperationsScanner simpleRabbitMethodLevelListenerAnnotationOperationsScanner( SpringwolfClassScanner classScanner, AmqpBindingFactory amqpBindingBuilder, + AsyncHeadersForAmqpBuilder asyncHeadersForAmqpBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { SpringAnnotationMethodLevelOperationsScanner strategy = new SpringAnnotationMethodLevelOperationsScanner<>( - RabbitListener.class, amqpBindingBuilder, payloadClassExtractor, componentsService); + RabbitListener.class, + amqpBindingBuilder, + asyncHeadersForAmqpBuilder, + payloadClassExtractor, + componentsService); return new SpringAnnotationOperationsScanner(classScanner, strategy); } diff --git a/springwolf-plugins/springwolf-jms-plugin/src/main/java/io/github/springwolf/plugins/jms/configuration/SpringwolfJmsScannerConfiguration.java b/springwolf-plugins/springwolf-jms-plugin/src/main/java/io/github/springwolf/plugins/jms/configuration/SpringwolfJmsScannerConfiguration.java index d5e33abc9..93a3375cf 100644 --- a/springwolf-plugins/springwolf-jms-plugin/src/main/java/io/github/springwolf/plugins/jms/configuration/SpringwolfJmsScannerConfiguration.java +++ b/springwolf-plugins/springwolf-jms-plugin/src/main/java/io/github/springwolf/plugins/jms/configuration/SpringwolfJmsScannerConfiguration.java @@ -2,6 +2,7 @@ package io.github.springwolf.plugins.jms.configuration; import io.github.springwolf.core.asyncapi.components.ComponentsService; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingProcessorPriority; import io.github.springwolf.core.asyncapi.scanners.channels.ChannelPriority; import io.github.springwolf.core.asyncapi.scanners.channels.SpringAnnotationChannelsScanner; @@ -44,7 +45,11 @@ public SpringAnnotationChannelsScanner simpleJmsMethodLevelListenerAnnotationCha ComponentsService componentsService) { SpringAnnotationMethodLevelChannelsScanner strategy = new SpringAnnotationMethodLevelChannelsScanner<>( - JmsListener.class, jmsBindingBuilder, payloadClassExtractor, componentsService); + JmsListener.class, + jmsBindingBuilder, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); return new SpringAnnotationChannelsScanner(classScanner, strategy); } @@ -59,7 +64,11 @@ public SpringAnnotationOperationsScanner simpleJmsMethodLevelListenerAnnotationO ComponentsService componentsService) { SpringAnnotationMethodLevelOperationsScanner strategy = new SpringAnnotationMethodLevelOperationsScanner<>( - JmsListener.class, jmsBindingBuilder, payloadClassExtractor, componentsService); + JmsListener.class, + jmsBindingBuilder, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); return new SpringAnnotationOperationsScanner(classScanner, strategy); } diff --git a/springwolf-plugins/springwolf-kafka-plugin/src/main/java/io/github/springwolf/plugins/kafka/configuration/SpringwolfKafkaScannerConfiguration.java b/springwolf-plugins/springwolf-kafka-plugin/src/main/java/io/github/springwolf/plugins/kafka/configuration/SpringwolfKafkaScannerConfiguration.java index d9c2d5511..bb4c1f797 100644 --- a/springwolf-plugins/springwolf-kafka-plugin/src/main/java/io/github/springwolf/plugins/kafka/configuration/SpringwolfKafkaScannerConfiguration.java +++ b/springwolf-plugins/springwolf-kafka-plugin/src/main/java/io/github/springwolf/plugins/kafka/configuration/SpringwolfKafkaScannerConfiguration.java @@ -107,11 +107,16 @@ public SpringAnnotationOperationsScanner simpleKafkaClassLevelListenerAnnotation public SpringAnnotationChannelsScanner simpleKafkaMethodLevelListenerAnnotationChannelsScanner( SpringwolfClassScanner classScanner, KafkaBindingFactory kafkaBindingBuilder, + AsyncHeadersForKafkaBuilder asyncHeadersForKafkaBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { SpringAnnotationMethodLevelChannelsScanner strategy = new SpringAnnotationMethodLevelChannelsScanner<>( - KafkaListener.class, kafkaBindingBuilder, payloadClassExtractor, componentsService); + KafkaListener.class, + kafkaBindingBuilder, + asyncHeadersForKafkaBuilder, + payloadClassExtractor, + componentsService); return new SpringAnnotationChannelsScanner(classScanner, strategy); } @@ -125,11 +130,16 @@ public SpringAnnotationChannelsScanner simpleKafkaMethodLevelListenerAnnotationC public SpringAnnotationOperationsScanner simpleKafkaMethodLevelListenerAnnotationOperationsScanner( SpringwolfClassScanner classScanner, KafkaBindingFactory kafkaBindingBuilder, + AsyncHeadersForKafkaBuilder asyncHeadersForKafkaBuilder, PayloadClassExtractor payloadClassExtractor, ComponentsService componentsService) { SpringAnnotationMethodLevelOperationsScanner strategy = new SpringAnnotationMethodLevelOperationsScanner<>( - KafkaListener.class, kafkaBindingBuilder, payloadClassExtractor, componentsService); + KafkaListener.class, + kafkaBindingBuilder, + asyncHeadersForKafkaBuilder, + payloadClassExtractor, + componentsService); return new SpringAnnotationOperationsScanner(classScanner, strategy); } diff --git a/springwolf-plugins/springwolf-sqs-plugin/src/main/java/io/github/springwolf/plugins/sqs/configuration/SpringwolfSqsScannerConfiguration.java b/springwolf-plugins/springwolf-sqs-plugin/src/main/java/io/github/springwolf/plugins/sqs/configuration/SpringwolfSqsScannerConfiguration.java index 6ed501bfa..a40f0279e 100644 --- a/springwolf-plugins/springwolf-sqs-plugin/src/main/java/io/github/springwolf/plugins/sqs/configuration/SpringwolfSqsScannerConfiguration.java +++ b/springwolf-plugins/springwolf-sqs-plugin/src/main/java/io/github/springwolf/plugins/sqs/configuration/SpringwolfSqsScannerConfiguration.java @@ -3,6 +3,7 @@ import io.awspring.cloud.sqs.annotation.SqsListener; import io.github.springwolf.core.asyncapi.components.ComponentsService; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingProcessorPriority; import io.github.springwolf.core.asyncapi.scanners.channels.ChannelPriority; import io.github.springwolf.core.asyncapi.scanners.channels.SpringAnnotationChannelsScanner; @@ -44,7 +45,11 @@ public SpringAnnotationChannelsScanner simpleSqsMethodLevelListenerAnnotationCha ComponentsService componentsService) { SpringAnnotationMethodLevelChannelsScanner strategy = new SpringAnnotationMethodLevelChannelsScanner<>( - SqsListener.class, sqsBindingBuilder, payloadClassExtractor, componentsService); + SqsListener.class, + sqsBindingBuilder, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); return new SpringAnnotationChannelsScanner(classScanner, strategy); } @@ -59,7 +64,11 @@ public SpringAnnotationOperationsScanner simpleSqsMethodLevelListenerAnnotationO ComponentsService componentsService) { SpringAnnotationMethodLevelOperationsScanner strategy = new SpringAnnotationMethodLevelOperationsScanner<>( - SqsListener.class, sqsBindingBuilder, payloadClassExtractor, componentsService); + SqsListener.class, + sqsBindingBuilder, + new AsyncHeadersNotDocumented(), + payloadClassExtractor, + componentsService); return new SpringAnnotationOperationsScanner(classScanner, strategy); } From 762cb8d026943d5674b95a47379ca4a8fc48a4d2 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Fri, 15 Mar 2024 15:47:22 +0100 Subject: [PATCH 2/5] feat(core): add header description --- .../asyncapi/annotations/AsyncOperation.java | 2 ++ .../components/DefaultComponentsService.java | 1 + .../components/headers/AsyncHeaders.java | 16 +++++++++++++--- .../headers/AsyncHeadersNotDocumented.java | 5 +++-- .../common/utils/AsyncAnnotationUtil.java | 5 ++++- .../common/utils/AsyncAnnotationUtilTest.java | 3 +++ .../src/test/resources/asyncapi.json | 1 + .../src/test/resources/asyncapi.json | 1 + .../src/test/resources/asyncapi.json | 1 + .../examples/kafka/producers/NestedProducer.java | 1 + .../src/test/resources/asyncapi.json | 4 ++++ .../src/test/resources/asyncapi.json | 2 ++ .../src/test/resources/asyncapi.json | 1 + 13 files changed, 37 insertions(+), 6 deletions(-) diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java index a52dcab6e..dbef5124d 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java @@ -35,6 +35,8 @@ @interface Headers { String schemaName() default ""; + String description() default ""; + Header[] values() default {}; @Retention(RetentionPolicy.CLASS) diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/DefaultComponentsService.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/DefaultComponentsService.java index 994fff25d..1df1bb520 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/DefaultComponentsService.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/DefaultComponentsService.java @@ -67,6 +67,7 @@ public String registerSchema(AsyncHeaders headers) { MapSchema headerSchema = new MapSchema(); headerSchema.setName(headers.getSchemaName()); + headerSchema.setDescription(headers.getDescription()); headerSchema.properties(headers); this.schemas.put(headers.getSchemaName(), headerSchema); diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java index 63f408f9f..2eb9e0caa 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java @@ -13,24 +13,34 @@ public class AsyncHeaders extends HashMap { /** * Explicitly document that no headers are used. */ - public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed"); + public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed", "No headers are preset."); private final String schemaName; + private final String description; - public AsyncHeaders(String schemaName) { + public AsyncHeaders(String schemaName, String description) { this.schemaName = schemaName; + this.description = description; + } + + public AsyncHeaders(String schemaName) { + this(schemaName, null); } public String getSchemaName() { return this.schemaName; } + public String getDescription() { + return this.description; + } + public void addHeader(AsyncHeaderSchema header) { this.put(header.getHeaderName(), header); } public static AsyncHeaders from(AsyncHeaders source, String newSchemaName) { - AsyncHeaders clone = new AsyncHeaders(newSchemaName); + AsyncHeaders clone = new AsyncHeaders(newSchemaName, source.getDescription()); clone.putAll(source); return clone; } diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java index 2389730b4..6f269729c 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java @@ -3,10 +3,11 @@ public class AsyncHeadersNotDocumented implements AsyncHeadersBuilder { /** - * Per default, if no headers are explicitly defined, NOT_DOCUMENTED is used. + * Per default, if no headers are explicitly defined, {@link AsyncHeaders#NOT_USED} is used. * There can be headers, but don't have to be. */ - public static final AsyncHeaders NOT_DOCUMENTED = new AsyncHeaders("HeadersNotDocumented"); + public static final AsyncHeaders NOT_DOCUMENTED = + new AsyncHeaders("HeadersNotDocumented", "There can be headers, but they are not explicitly documented."); @Override public AsyncHeaders buildHeaders(Class payloadType) { diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java index 1a99e322d..ad31ffce2 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java @@ -32,7 +32,10 @@ public static AsyncHeaders getAsyncHeaders(AsyncOperation op, StringValueResolve return AsyncHeaders.NOT_DOCUMENTED; } - AsyncHeaders asyncHeaders = new AsyncHeaders(op.headers().schemaName()); + String headerDescription = StringUtils.hasText(op.headers().description()) + ? resolver.resolveStringValue(op.headers().description()) + : null; + AsyncHeaders asyncHeaders = new AsyncHeaders(op.headers().schemaName(), headerDescription); Arrays.stream(op.headers().values()) .collect(groupingBy(AsyncOperation.Headers.Header::name)) .forEach((headerName, headers) -> { diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtilTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtilTest.java index 5e643a3bf..f282982c1 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtilTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtilTest.java @@ -47,6 +47,7 @@ void getAsyncHeaders(Class classWithOperationBindingProcessor) throws NoSuchM // then AsyncHeaders headers = AsyncAnnotationUtil.getAsyncHeaders(operation, resolver); assertEquals("TestSchema", headers.getSchemaName()); + assertEquals("header-descriptionResolved", headers.getDescription()); assertTrue(headers.containsKey("headerResolved")); assertEquals("string", headers.get("headerResolved").getType()); assertEquals("valueResolved", headers.get("headerResolved").getExample()); @@ -188,6 +189,7 @@ private static class ClassWithOperationBindingProcessor { headers = @AsyncOperation.Headers( schemaName = "TestSchema", + description = "header-description", values = { @AsyncOperation.Headers.Header( name = "header", @@ -231,6 +233,7 @@ private static class ClassWithAbstractOperationBindingProcessor { headers = @AsyncOperation.Headers( schemaName = "TestSchema", + description = "header-description", values = { @AsyncOperation.Headers.Header( name = "header", diff --git a/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json index 59f1ee413..8ee46a119 100644 --- a/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-amqp-example/src/test/resources/asyncapi.json @@ -121,6 +121,7 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ] diff --git a/springwolf-examples/springwolf-cloud-stream-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-cloud-stream-example/src/test/resources/asyncapi.json index c81b34014..268b7c48a 100644 --- a/springwolf-examples/springwolf-cloud-stream-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-cloud-stream-example/src/test/resources/asyncapi.json @@ -121,6 +121,7 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ] diff --git a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json index 271f048a8..ca82cd20d 100644 --- a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json @@ -52,6 +52,7 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ] diff --git a/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/producers/NestedProducer.java b/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/producers/NestedProducer.java index e958a2c3b..d8f424f7b 100644 --- a/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/producers/NestedProducer.java +++ b/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/producers/NestedProducer.java @@ -27,6 +27,7 @@ public class NestedProducer { headers = @AsyncOperation.Headers( schemaName = "SpringDefaultHeaderAndCloudEvent", + description = "Spring __TypeId__ and CloudEvent Headers", values = { @AsyncOperation.Headers.Header( name = DEFAULT_CLASSID_FIELD_NAME, diff --git a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json index 57058e48a..a77ef6abb 100644 --- a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json @@ -120,11 +120,13 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ], "x-json-schema": { "$schema": "https://json-schema.org/draft-04/schema#", + "description": "There can be headers, but they are not explicitly documented.", "type": "object" } }, @@ -212,6 +214,7 @@ ] } }, + "description": "Spring __TypeId__ and CloudEvent Headers", "examples": [ { "__TypeId__": "io.github.springwolf.examples.kafka.dtos.NestedPayloadDto", @@ -226,6 +229,7 @@ ], "x-json-schema": { "$schema": "https://json-schema.org/draft-04/schema#", + "description": "Spring __TypeId__ and CloudEvent Headers", "properties": { "__TypeId__": { "description": "Spring Type Id Header", diff --git a/springwolf-examples/springwolf-sns-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-sns-example/src/test/resources/asyncapi.json index 77056a44a..dea98d32e 100644 --- a/springwolf-examples/springwolf-sns-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-sns-example/src/test/resources/asyncapi.json @@ -42,11 +42,13 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ], "x-json-schema": { "$schema": "https://json-schema.org/draft-04/schema#", + "description": "There can be headers, but they are not explicitly documented.", "type": "object" } }, diff --git a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json index 7a2664e9e..d071073cc 100644 --- a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json @@ -68,6 +68,7 @@ "HeadersNotDocumented": { "type": "object", "properties": { }, + "description": "There can be headers, but they are not explicitly documented.", "examples": [ { } ] From 0e09bc584cb71854ecb6b449c93bd6303025f817 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Fri, 15 Mar 2024 15:49:38 +0100 Subject: [PATCH 3/5] feat(ui): show schema type first in collapsible header --- springwolf-ui/src/app/components/schemas/schemas.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springwolf-ui/src/app/components/schemas/schemas.component.html b/springwolf-ui/src/app/components/schemas/schemas.component.html index fbb00ce64..d22ad516a 100644 --- a/springwolf-ui/src/app/components/schemas/schemas.component.html +++ b/springwolf-ui/src/app/components/schemas/schemas.component.html @@ -15,8 +15,8 @@

{{ schema.value.title }}

class="flex-column flex-start items-center" [ngClass]="{ 'gap-16': schema.value.description }" > -
{{ schema.value.type }}
+

From 99b65f4ebac71ec00099e910a914b7e595ad1a26 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Fri, 15 Mar 2024 16:03:42 +0100 Subject: [PATCH 4/5] feat(core): add simple option to define no headers are used --- .../asyncapi/annotations/AsyncOperation.java | 7 +++++++ .../components/headers/AsyncHeaders.java | 2 +- .../common/utils/AsyncAnnotationUtil.java | 3 +++ .../kafka/consumers/StringConsumer.java | 3 ++- .../src/test/resources/asyncapi.json | 17 +++++++++++++++-- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java index dbef5124d..0e5ed7747 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/annotations/AsyncOperation.java @@ -39,6 +39,13 @@ Header[] values() default {}; + /** + * Indicate that no headers are used in this operation. + *

+ * All other properties of this annotation are ignored if this is set to true. + */ + boolean notUsed() default false; + @Retention(RetentionPolicy.CLASS) @Target({}) @Inherited diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java index 2eb9e0caa..84beb3690 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java @@ -13,7 +13,7 @@ public class AsyncHeaders extends HashMap { /** * Explicitly document that no headers are used. */ - public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed", "No headers are preset."); + public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed", "No headers are present."); private final String schemaName; private final String description; diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java index ad31ffce2..a5c882e59 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java @@ -29,6 +29,9 @@ private AsyncAnnotationUtil() {} public static AsyncHeaders getAsyncHeaders(AsyncOperation op, StringValueResolver resolver) { if (op.headers().values().length == 0) { + if (op.headers().notUsed()) { + return AsyncHeaders.NOT_USED; + } return AsyncHeaders.NOT_DOCUMENTED; } diff --git a/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/consumers/StringConsumer.java b/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/consumers/StringConsumer.java index cf08faaee..885c8cb1b 100644 --- a/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/consumers/StringConsumer.java +++ b/springwolf-examples/springwolf-kafka-example/src/main/java/io/github/springwolf/examples/kafka/consumers/StringConsumer.java @@ -25,7 +25,8 @@ public class StringConsumer { channelName = TOPIC, description = "Final classes (like String) can be documented using an envelope class and the @AsyncApiPayload annotation.", - payloadType = StringEnvelope.class)) + payloadType = StringEnvelope.class, + headers = @AsyncOperation.Headers(notUsed = true))) @KafkaAsyncOperationBinding public void receiveStringPayload(String stringPayload) { log.info("Received new message in {}: {}", TOPIC, stringPayload); diff --git a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json index a77ef6abb..006ca3cdd 100644 --- a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json @@ -130,6 +130,19 @@ "type": "object" } }, + "HeadersNotUsed": { + "type": "object", + "properties": { }, + "description": "No headers are present.", + "examples": [ + { } + ], + "x-json-schema": { + "$schema": "https://json-schema.org/draft-04/schema#", + "description": "No headers are present.", + "type": "object" + } + }, "SpringDefaultHeaderAndCloudEvent": { "type": "object", "properties": { @@ -1067,7 +1080,7 @@ "messages": { "io.github.springwolf.examples.kafka.consumers.StringConsumer$StringEnvelope": { "headers": { - "$ref": "#/components/schemas/HeadersNotDocumented" + "$ref": "#/components/schemas/HeadersNotUsed" }, "payload": { "schemaFormat": "application/vnd.aai.asyncapi+json;version=3.0.0", @@ -1471,4 +1484,4 @@ ] } } -} \ No newline at end of file +} From 17e405addd21ecc71797758f0867ab842c2f19d0 Mon Sep 17 00:00:00 2001 From: Timon Back Date: Fri, 15 Mar 2024 17:11:18 +0100 Subject: [PATCH 5/5] refactor(core): resolve static initialization of AsyncHeaders.NOT_DOCUMENTED Moved both constants to an own class. The constants have been relicts when users could use the constants directly in the AsyncApiDocket. This is not possible with 1.0.0, therefore this is no breaking change. --- .../components/headers/AsyncHeaders.java | 9 ---- .../headers/AsyncHeadersNotDocumented.java | 2 +- .../headers/AsyncHeadersNotUsed.java | 14 +++++++ .../common/utils/AsyncAnnotationUtil.java | 6 ++- .../AsyncAnnotationChannelsScannerTest.java | 17 +++++--- ...notationClassLevelChannelsScannerTest.java | 5 ++- ...odLevelChannelsScannerIntegrationTest.java | 13 +++--- ...otationMethodLevelChannelsScannerTest.java | 2 +- .../AsyncAnnotationOperationsScannerTest.java | 17 +++++--- ...tationClassLevelOperationsScannerTest.java | 5 ++- .../src/test/resources/asyncapi.json | 27 +++++++++--- .../src/test/resources/asyncapi.json | 2 +- .../src/test/resources/asyncapi.json | 42 +++++++++++++------ .../CloudStreamFunctionChannelsScanner.java | 4 +- .../CloudStreamFunctionOperationsScanner.java | 4 +- ...unctionChannelsScannerIntegrationTest.java | 26 ++++++++---- 16 files changed, 129 insertions(+), 66 deletions(-) create mode 100644 springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotUsed.java diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java index 84beb3690..70474fa48 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeaders.java @@ -6,15 +6,6 @@ import java.util.HashMap; public class AsyncHeaders extends HashMap { - /** - * Alias to stay backwards-compatible - */ - public static final AsyncHeaders NOT_DOCUMENTED = AsyncHeadersNotDocumented.NOT_DOCUMENTED; - /** - * Explicitly document that no headers are used. - */ - public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed", "No headers are present."); - private final String schemaName; private final String description; diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java index 6f269729c..627009b5a 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotDocumented.java @@ -3,7 +3,7 @@ public class AsyncHeadersNotDocumented implements AsyncHeadersBuilder { /** - * Per default, if no headers are explicitly defined, {@link AsyncHeaders#NOT_USED} is used. + * Per default, if no headers are explicitly defined, {@link AsyncHeadersNotUsed#NOT_USED} is used. * There can be headers, but don't have to be. */ public static final AsyncHeaders NOT_DOCUMENTED = diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotUsed.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotUsed.java new file mode 100644 index 000000000..8ab081bb4 --- /dev/null +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/headers/AsyncHeadersNotUsed.java @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +package io.github.springwolf.core.asyncapi.components.headers; + +public class AsyncHeadersNotUsed implements AsyncHeadersBuilder { + /** + * Explicitly document that no headers are used. + */ + public static final AsyncHeaders NOT_USED = new AsyncHeaders("HeadersNotUsed", "No headers are present."); + + @Override + public AsyncHeaders buildHeaders(Class payloadType) { + return NOT_USED; + } +} diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java index a5c882e59..40505383e 100644 --- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java +++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/scanners/common/utils/AsyncAnnotationUtil.java @@ -8,6 +8,8 @@ import io.github.springwolf.core.asyncapi.annotations.AsyncOperation; import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaderSchema; import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotUsed; import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor; import io.github.springwolf.core.asyncapi.scanners.bindings.messages.ProcessedMessageBinding; import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor; @@ -30,9 +32,9 @@ private AsyncAnnotationUtil() {} public static AsyncHeaders getAsyncHeaders(AsyncOperation op, StringValueResolver resolver) { if (op.headers().values().length == 0) { if (op.headers().notUsed()) { - return AsyncHeaders.NOT_USED; + return AsyncHeadersNotUsed.NOT_USED; } - return AsyncHeaders.NOT_DOCUMENTED; + return AsyncHeadersNotDocumented.NOT_DOCUMENTED; } String headerDescription = StringUtils.hasText(op.headers().description()) diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/AsyncAnnotationChannelsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/AsyncAnnotationChannelsScannerTest.java index d2adfdc88..ee5977f84 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/AsyncAnnotationChannelsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/AsyncAnnotationChannelsScannerTest.java @@ -20,7 +20,7 @@ import io.github.springwolf.core.asyncapi.components.ComponentsService; import io.github.springwolf.core.asyncapi.components.DefaultComponentsService; import io.github.springwolf.core.asyncapi.components.SwaggerSchemaUtil; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor; import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor; import io.github.springwolf.core.asyncapi.scanners.bindings.processor.TestOperationBindingProcessor; @@ -155,7 +155,8 @@ void scan_componentChannelHasListenerMethod() { .title(SimpleFoo.class.getSimpleName()) .description("SimpleFoo Message Description") .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -228,7 +229,8 @@ void scan_componentHasMultipleListenerAnnotations() { .name(SimpleFoo.class.getName()) .title(SimpleFoo.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .description("SimpleFoo Message Description") .build(); @@ -268,7 +270,8 @@ void scan_componentHasAsyncMethodAnnotation() { .title("Message Title") .description("Message description") .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -374,7 +377,8 @@ void scan_componentHasOnlyDeclaredMethods(Class clazz) { .title(String.class.getSimpleName()) .description(null) .payload(messagePayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -438,7 +442,8 @@ void scan_componentHasListenerMethodWithMetaAnnotation() { .title(String.class.getSimpleName()) .description(null) .payload(messagePayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationClassLevelChannelsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationClassLevelChannelsScannerTest.java index 0a0069220..fa84d720c 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationClassLevelChannelsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationClassLevelChannelsScannerTest.java @@ -71,7 +71,7 @@ void setUp() { doAnswer(invocation -> invocation.>getArgument(0).getSimpleName()) .when(componentsService) .registerSchema(any(Class.class)); - doAnswer(invocation -> AsyncHeaders.NOT_DOCUMENTED.getSchemaName()) + doAnswer(invocation -> AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()) .when(componentsService) .registerSchema(any(AsyncHeaders.class)); } @@ -92,7 +92,8 @@ void scan_componentHasTestListenerMethods() { .name(String.class.getName()) .title(String.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(defaultMessageBinding) .build(); diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java index 7759b4a5b..98c2cccd7 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerIntegrationTest.java @@ -17,7 +17,6 @@ import io.github.springwolf.core.asyncapi.components.examples.SchemaWalkerProvider; import io.github.springwolf.core.asyncapi.components.examples.walkers.DefaultSchemaWalker; import io.github.springwolf.core.asyncapi.components.examples.walkers.json.ExampleJsonValueGenerator; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.BindingFactory; import io.github.springwolf.core.asyncapi.scanners.common.payload.PayloadClassExtractor; @@ -114,7 +113,8 @@ void scan_componentHasListenerMethod() { .name(SimpleFoo.class.getName()) .title(SimpleFoo.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(TestBindingFactory.defaultMessageBinding) .build(); @@ -157,7 +157,8 @@ void scan_componentHasTestListenerMethods_multiplePayloads() { .name(SimpleFoo.class.getName()) .title(SimpleFoo.class.getSimpleName()) .payload(simpleFooPayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(TestBindingFactory.defaultMessageBinding) .build(); MessageObject messageString = MessageObject.builder() @@ -165,7 +166,8 @@ void scan_componentHasTestListenerMethods_multiplePayloads() { .name(String.class.getName()) .title(String.class.getSimpleName()) .payload(stringPayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(TestBindingFactory.defaultMessageBinding) .build(); @@ -214,7 +216,8 @@ void scan_componentHasListenerMetaMethod() { .name(SimpleFoo.class.getName()) .title(SimpleFoo.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(defaultMessageBinding) .build(); diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java index b9687d288..10e98c8dd 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/channels/annotations/SpringAnnotationMethodLevelChannelsScannerTest.java @@ -70,7 +70,7 @@ void setUp() throws NoSuchMethodException { doAnswer(invocation -> invocation.>getArgument(0).getSimpleName()) .when(componentsService) .registerSchema(any(Class.class)); - doAnswer(invocation -> AsyncHeaders.NOT_DOCUMENTED.getSchemaName()) + doAnswer(invocation -> AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()) .when(componentsService) .registerSchema(any(AsyncHeaders.class)); diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/AsyncAnnotationOperationsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/AsyncAnnotationOperationsScannerTest.java index d64d0b85a..d2d3018f2 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/AsyncAnnotationOperationsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/AsyncAnnotationOperationsScannerTest.java @@ -19,7 +19,7 @@ import io.github.springwolf.core.asyncapi.components.ComponentsService; import io.github.springwolf.core.asyncapi.components.DefaultComponentsService; import io.github.springwolf.core.asyncapi.components.SwaggerSchemaUtil; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.bindings.messages.MessageBindingProcessor; import io.github.springwolf.core.asyncapi.scanners.bindings.operations.OperationBindingProcessor; import io.github.springwolf.core.asyncapi.scanners.bindings.processor.TestOperationBindingProcessor; @@ -151,7 +151,8 @@ void scan_componentOperationHasListenerMethod() { .title(SimpleFoo.class.getSimpleName()) .description("SimpleFoo Message Description") .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -222,7 +223,8 @@ void scan_componentHasMultipleListenerAnnotations() { .name(SimpleFoo.class.getName()) .title(SimpleFoo.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .description("SimpleFoo Message Description") .build(); @@ -270,7 +272,8 @@ void scan_componentHasAsyncMethodAnnotation() { .title("Message Title") .description("Message description") .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -381,7 +384,8 @@ void scan_componentHasOnlyDeclaredMethods(Class clazz) { .title(String.class.getSimpleName()) .description(null) .payload(messagePayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); @@ -455,7 +459,8 @@ void scan_componentHasListenerMethodWithMetaAnnotation() { .title(String.class.getSimpleName()) .description(null) .payload(messagePayload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(EMPTY_MAP) .build(); diff --git a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationClassLevelOperationsScannerTest.java b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationClassLevelOperationsScannerTest.java index 016331ab2..e03d1cb73 100644 --- a/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationClassLevelOperationsScannerTest.java +++ b/springwolf-core/src/test/java/io/github/springwolf/core/asyncapi/scanners/operations/annotations/SpringAnnotationClassLevelOperationsScannerTest.java @@ -73,7 +73,7 @@ void setUp() { doAnswer(invocation -> invocation.>getArgument(0).getSimpleName()) .when(componentsService) .registerSchema(any(Class.class)); - doAnswer(invocation -> AsyncHeaders.NOT_DOCUMENTED.getSchemaName()) + doAnswer(invocation -> AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()) .when(componentsService) .registerSchema(any(AsyncHeaders.class)); } @@ -94,7 +94,8 @@ void scan_componentHasTestListenerMethods() { .name(String.class.getName()) .title(String.class.getSimpleName()) .payload(payload) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(defaultMessageBinding) .build(); diff --git a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json index ca82cd20d..e41816393 100644 --- a/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-jms-example/src/test/resources/asyncapi.json @@ -27,11 +27,6 @@ "io.github.springwolf.examples.jms.dtos.AnotherPayloadDto": { "$ref": "#/components/messages/io.github.springwolf.examples.jms.dtos.AnotherPayloadDto" } - }, - "bindings": { - "jms": { - "bindingVersion": "0.0.1" - } } }, "example-queue": { @@ -144,6 +139,7 @@ }, "name": "io.github.springwolf.examples.jms.dtos.AnotherPayloadDto", "title": "AnotherPayloadDto", + "description": "Another payload model", "bindings": { "jms": { "bindingVersion": "0.0.1" @@ -185,6 +181,27 @@ } ] }, + "another-queue_send_sendMessage": { + "action": "send", + "channel": { + "$ref": "#/channels/another-queue" + }, + "title": "another-queue_send", + "description": "Custom, optional description defined in the AsyncPublisher annotation", + "bindings": { + "jms": { + "internal-field": "customValue", + "nested": { + "key": "nestedValue" + } + } + }, + "messages": [ + { + "$ref": "#/channels/another-queue/messages/io.github.springwolf.examples.jms.dtos.AnotherPayloadDto" + } + ] + }, "example-queue_receive_receiveExamplePayload": { "action": "receive", "channel": { diff --git a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json index 006ca3cdd..fb10b23a4 100644 --- a/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-kafka-example/src/test/resources/asyncapi.json @@ -1484,4 +1484,4 @@ ] } } -} +} \ No newline at end of file diff --git a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json index d071073cc..d06bb2901 100644 --- a/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json +++ b/springwolf-examples/springwolf-sqs-example/src/test/resources/asyncapi.json @@ -27,19 +27,6 @@ "io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto": { "$ref": "#/components/messages/io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto" } - }, - "bindings": { - "sqs": { - "queue": { - "name": "another-queue", - "fifoQueue": true, - "deliveryDelay": 0, - "visibilityTimeout": 30, - "receiveMessageWaitTime": 0, - "messageRetentionPeriod": 345600 - }, - "bindingVersion": "0.2.0" - } } }, "example-queue": { @@ -160,6 +147,7 @@ }, "name": "io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto", "title": "AnotherPayloadDto", + "description": "Another payload model", "bindings": { "sqs": { } } @@ -209,6 +197,34 @@ } ] }, + "another-queue_send_sendMessage": { + "action": "send", + "channel": { + "$ref": "#/channels/another-queue" + }, + "title": "another-queue_send", + "description": "Custom, optional description defined in the AsyncPublisher annotation", + "bindings": { + "sqs": { + "queues": [ + { + "name": "queue-name", + "fifoQueue": true, + "deliveryDelay": 0, + "visibilityTimeout": 30, + "receiveMessageWaitTime": 0, + "messageRetentionPeriod": 345600 + } + ], + "bindingVersion": "0.2.0" + } + }, + "messages": [ + { + "$ref": "#/channels/another-queue/messages/io.github.springwolf.examples.sqs.dtos.AnotherPayloadDto" + } + ] + }, "example-queue_receive_receiveExamplePayload": { "action": "receive", "channel": { diff --git a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java index 441f22bae..03dc2bd4f 100644 --- a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java +++ b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScanner.java @@ -14,7 +14,7 @@ import io.github.springwolf.asyncapi.v3.model.schema.SchemaReference; import io.github.springwolf.asyncapi.v3.model.server.Server; import io.github.springwolf.core.asyncapi.components.ComponentsService; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.ChannelsScanner; import io.github.springwolf.core.asyncapi.scanners.beans.BeanMethodsScanner; import io.github.springwolf.core.asyncapi.scanners.channels.ChannelMerger; @@ -69,7 +69,7 @@ private Map.Entry toChannelEntry(FunctionalChannelBeanDat private ChannelObject buildChannel(FunctionalChannelBeanData beanData) { Class payloadType = beanData.payloadType(); String modelName = componentsService.registerSchema(payloadType); - String headerModelName = componentsService.registerSchema(AsyncHeaders.NOT_DOCUMENTED); + String headerModelName = componentsService.registerSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED); var messagePayload = MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(modelName)) diff --git a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java index a73d89672..22a959390 100644 --- a/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java +++ b/springwolf-plugins/springwolf-cloud-stream-plugin/src/main/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/operations/CloudStreamFunctionOperationsScanner.java @@ -14,7 +14,7 @@ import io.github.springwolf.asyncapi.v3.model.operation.OperationAction; import io.github.springwolf.asyncapi.v3.model.server.Server; import io.github.springwolf.core.asyncapi.components.ComponentsService; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.OperationsScanner; import io.github.springwolf.core.asyncapi.scanners.beans.BeanMethodsScanner; import io.github.springwolf.core.asyncapi.scanners.operations.OperationMerger; @@ -71,7 +71,7 @@ private Map.Entry toOperationEntry(FunctionalChannelBeanData private Operation buildOperation(FunctionalChannelBeanData beanData, String channelName) { Class payloadType = beanData.payloadType(); String modelName = componentsService.registerSchema(payloadType); - String headerModelName = componentsService.registerSchema(AsyncHeaders.NOT_DOCUMENTED); + String headerModelName = componentsService.registerSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED); MessageObject message = MessageObject.builder() .name(payloadType.getName()) diff --git a/springwolf-plugins/springwolf-cloud-stream-plugin/src/test/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScannerIntegrationTest.java b/springwolf-plugins/springwolf-cloud-stream-plugin/src/test/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScannerIntegrationTest.java index e679a8275..ea0150cc7 100644 --- a/springwolf-plugins/springwolf-cloud-stream-plugin/src/test/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScannerIntegrationTest.java +++ b/springwolf-plugins/springwolf-cloud-stream-plugin/src/test/java/io/github/springwolf/plugins/cloudstream/asyncapi/scanners/channels/CloudStreamFunctionChannelsScannerIntegrationTest.java @@ -22,7 +22,7 @@ import io.github.springwolf.core.asyncapi.components.examples.SchemaWalkerProvider; import io.github.springwolf.core.asyncapi.components.examples.walkers.DefaultSchemaWalker; import io.github.springwolf.core.asyncapi.components.examples.walkers.json.ExampleJsonValueGenerator; -import io.github.springwolf.core.asyncapi.components.headers.AsyncHeaders; +import io.github.springwolf.core.asyncapi.components.headers.AsyncHeadersNotDocumented; import io.github.springwolf.core.asyncapi.scanners.beans.DefaultBeanMethodsScanner; import io.github.springwolf.core.asyncapi.scanners.classes.spring.ComponentClassScanner; import io.github.springwolf.core.asyncapi.scanners.classes.spring.ConfigurationClassScanner; @@ -129,7 +129,8 @@ void testConsumerBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(String.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -172,7 +173,8 @@ void testSupplierBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(String.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -223,7 +225,8 @@ void testFunctionBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(Integer.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -247,7 +250,8 @@ void testFunctionBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(String.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -300,7 +304,8 @@ void testKStreamFunctionBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(Integer.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -324,7 +329,8 @@ void testKStreamFunctionBinding() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(String.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -378,7 +384,8 @@ void testFunctionBindingWithSameTopicName() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(Integer.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build(); @@ -397,7 +404,8 @@ void testFunctionBindingWithSameTopicName() { .payload(MessagePayload.of(MultiFormatSchema.builder() .schema(SchemaReference.fromSchema(String.class.getSimpleName())) .build())) - .headers(MessageHeaders.of(MessageReference.toSchema(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))) + .headers(MessageHeaders.of( + MessageReference.toSchema(AsyncHeadersNotDocumented.NOT_DOCUMENTED.getSchemaName()))) .bindings(Map.of("kafka", new EmptyMessageBinding())) .build();