Skip to content

Commit de9de49

Browse files
committed
Add extension point to supply protocol specific message bindings in plugins
1 parent 87ebc2f commit de9de49

File tree

17 files changed

+128
-8
lines changed

17 files changed

+128
-8
lines changed

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/operationdata/AbstractOperationDataScanner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ private Message buildMessage(OperationData operationData) {
9999
.description(operationData.getDescription())
100100
.payload(PayloadReference.fromModelName(modelName))
101101
.headers(HeaderReference.fromModelName(headerModelName))
102+
.bindings(operationData.getMessageBinding())
102103
.build();
103104
}
104105

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata;
2+
3+
import com.asyncapi.v2.binding.MessageBinding;
4+
import lombok.Data;
5+
6+
@Data
7+
public class ProcessedMessageBinding {
8+
private final String type;
9+
private final MessageBinding binding;
10+
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/operationdata/annotation/AsyncAnnotationScannerUtil.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation;
22

3+
import com.asyncapi.v2.binding.MessageBinding;
34
import com.asyncapi.v2.binding.OperationBinding;
5+
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.ProcessedMessageBinding;
46
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.ProcessedOperationBinding;
57
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.AsyncHeaderSchema;
68
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.AsyncHeaders;
@@ -59,11 +61,19 @@ private static String getDescription(List<AsyncOperation.Headers.Header> value)
5961
.orElse(null);
6062
}
6163

62-
public static Map<String, OperationBinding> processBindingFromAnnotation(Method method, List<OperationBindingProcessor> operationBindingProcessors) {
64+
public static Map<String, OperationBinding> processOperationBindingFromAnnotation(Method method, List<OperationBindingProcessor> operationBindingProcessors) {
6365
return operationBindingProcessors.stream()
6466
.map(operationBindingProcessor -> operationBindingProcessor.process(method))
6567
.filter(Optional::isPresent)
6668
.map(Optional::get)
6769
.collect(Collectors.toMap(ProcessedOperationBinding::getType, ProcessedOperationBinding::getBinding));
6870
}
71+
72+
public static Map<String, MessageBinding> processMessageBindingFromAnnotation(Method method, List<MessageBindingProcessor> messageBindingProcessors) {
73+
return messageBindingProcessors.stream()
74+
.map(messageBindingProcessor -> messageBindingProcessor.process(method))
75+
.filter(Optional::isPresent)
76+
.map(Optional::get)
77+
.collect(Collectors.toMap(ProcessedMessageBinding::getType, ProcessedMessageBinding::getBinding));
78+
}
6979
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/operationdata/annotation/AsyncListenerAnnotationScanner.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation;
22

3+
import com.asyncapi.v2.binding.MessageBinding;
34
import com.asyncapi.v2.binding.OperationBinding;
45
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.ChannelPriority;
56
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.annotation.SpringPayloadAnnotationTypeExtractor;
@@ -32,6 +33,8 @@ public class AsyncListenerAnnotationScanner extends AbstractOperationDataScanner
3233

3334
private final List<OperationBindingProcessor> operationBindingProcessors;
3435

36+
private final List<MessageBindingProcessor> messageBindingProcessors;
37+
3538
@Override
3639
public void setEmbeddedValueResolver(StringValueResolver resolver) {
3740
this.resolver = resolver;
@@ -63,7 +66,8 @@ private Set<Method> getAnnotatedMethods(Class<?> type) {
6366
private OperationData mapMethodToOperationData(Method method) {
6467
log.debug("Mapping method \"{}\" to channels", method.getName());
6568

66-
Map<String, OperationBinding> operationBindings = AsyncAnnotationScannerUtil.processBindingFromAnnotation(method, operationBindingProcessors);
69+
Map<String, OperationBinding> operationBindings = AsyncAnnotationScannerUtil.processOperationBindingFromAnnotation(method, operationBindingProcessors);
70+
Map<String, MessageBinding> messageBindings = AsyncAnnotationScannerUtil.processMessageBindingFromAnnotation(method, messageBindingProcessors);
6771

6872
Class<AsyncListener> annotationClass = AsyncListener.class;
6973
AsyncListener annotation = Optional.of(method.getAnnotation(annotationClass))
@@ -78,6 +82,7 @@ private OperationData mapMethodToOperationData(Method method) {
7882
.headers(AsyncAnnotationScannerUtil.getAsyncHeaders(op))
7983
.payloadType(payloadType)
8084
.operationBinding(operationBindings)
85+
.messageBinding(messageBindings)
8186
.build();
8287
}
8388

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/operationdata/annotation/AsyncPublisherAnnotationScanner.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation;
22

3+
import com.asyncapi.v2.binding.MessageBinding;
34
import com.asyncapi.v2.binding.OperationBinding;
45
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.ChannelPriority;
56
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.annotation.SpringPayloadAnnotationTypeExtractor;
@@ -32,6 +33,8 @@ public class AsyncPublisherAnnotationScanner extends AbstractOperationDataScanne
3233

3334
private final List<OperationBindingProcessor> operationBindingProcessors;
3435

36+
private final List<MessageBindingProcessor> messageBindingProcessors;
37+
3538
@Override
3639
public void setEmbeddedValueResolver(StringValueResolver resolver) {
3740
this.resolver = resolver;
@@ -63,7 +66,8 @@ private Set<Method> getAnnotatedMethods(Class<?> type) {
6366
private OperationData mapMethodToOperationData(Method method) {
6467
log.debug("Mapping method \"{}\" to channels", method.getName());
6568

66-
Map<String, OperationBinding> operationBindings = AsyncAnnotationScannerUtil.processBindingFromAnnotation(method, operationBindingProcessors);
69+
Map<String, OperationBinding> operationBindings = AsyncAnnotationScannerUtil.processOperationBindingFromAnnotation(method, operationBindingProcessors);
70+
Map<String, MessageBinding> messageBindings = AsyncAnnotationScannerUtil.processMessageBindingFromAnnotation(method, messageBindingProcessors);
6771

6872
Class<AsyncPublisher> annotationClass = AsyncPublisher.class;
6973
AsyncPublisher annotation = Optional.of(method.getAnnotation(annotationClass))
@@ -78,6 +82,7 @@ private OperationData mapMethodToOperationData(Method method) {
7882
.headers(AsyncAnnotationScannerUtil.getAsyncHeaders(op))
7983
.payloadType(payloadType)
8084
.operationBinding(operationBindings)
85+
.messageBinding(messageBindings)
8186
.build();
8287
}
8388

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.annotation;
2+
3+
import io.github.stavshamir.springwolf.asyncapi.scanners.channels.operationdata.ProcessedMessageBinding;
4+
5+
import java.lang.reflect.Method;
6+
import java.util.Optional;
7+
8+
public interface MessageBindingProcessor {
9+
10+
/**
11+
* Process the methods annotated with {@link AsyncPublisher} and {@link AsyncSubscriber}
12+
* for protocol specific messageBinding annotations, method parameters, etc
13+
*
14+
* @param method The method being annotated
15+
* @return A message binding, if found
16+
*/
17+
Optional<ProcessedMessageBinding> process(Method method);
18+
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/types/ConsumerData.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.stavshamir.springwolf.asyncapi.types;
22

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.AsyncHeaders;
67
import lombok.AllArgsConstructor;
@@ -61,4 +62,13 @@ public class ConsumerData implements OperationData {
6162
*/
6263
protected Map<String, ? extends OperationBinding> operationBinding;
6364

65+
/**
66+
* The message binding of the consumer.
67+
* <br>
68+
* For example:
69+
* <code>
70+
* ImmutableMap.of("kafka", new KafkaMessageBinding())
71+
* </code>
72+
*/
73+
protected Map<String, ? extends MessageBinding> messageBinding;
6474
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/types/OperationData.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.stavshamir.springwolf.asyncapi.types;
22

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.AsyncHeaders;
67

@@ -40,10 +41,16 @@ public interface OperationData {
4041
*/
4142
Map<String, ? extends OperationBinding> getOperationBinding();
4243

44+
/**
45+
* The message binding.
46+
*/
47+
Map<String, ? extends MessageBinding> getMessageBinding();
48+
4349
enum OperationType {
4450
PUBLISH("publish"), SUBSCRIBE("subscribe");
4551

4652
public final String operationName;
53+
4754
OperationType(String operationName) {
4855
this.operationName = operationName;
4956
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/types/ProducerData.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.stavshamir.springwolf.asyncapi.types;
22

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.AsyncHeaders;
67
import lombok.AllArgsConstructor;
@@ -61,4 +62,14 @@ public class ProducerData implements OperationData {
6162
*/
6263
protected Map<String, ? extends OperationBinding> operationBinding;
6364

65+
/**
66+
* The message binding of the producer.
67+
* <br>
68+
* For example:
69+
* <code>
70+
* ImmutableMap.of("kafka", new KafkaMessageBinding())
71+
* </code>
72+
*/
73+
protected Map<String, ? extends MessageBinding> messageBinding;
74+
6475
}

springwolf-core/src/main/java/io/github/stavshamir/springwolf/asyncapi/types/channel/operation/message/Message.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message;
22

3+
import com.asyncapi.v2.binding.MessageBinding;
34
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.header.HeaderReference;
45
import lombok.*;
56

7+
import java.util.Map;
8+
69
/**
710
* Describes a message received on a given channel and operation.
811
*
@@ -34,4 +37,6 @@ public class Message {
3437
private PayloadReference payload;
3538

3639
private HeaderReference headers;
40+
41+
private Map<String, ? extends MessageBinding> bindings;
3742
}

0 commit comments

Comments
 (0)