Skip to content

Commit acb923e

Browse files
committed
Extend abstract class and method level listener scanners to include an empty message binding so that there is always a message binding
1 parent f758433 commit acb923e

File tree

6 files changed

+44
-10
lines changed

6 files changed

+44
-10
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ public class MessageHelper {
2121

2222
private static final Comparator<Message> byMessageName = Comparator.comparing(Message::getName);
2323

24-
// TODO Why do we need a SortedSet here? Using a comparator with only the message name will break deep equals on the Set
25-
// Unfortunately there are Tests relying on deep equals
26-
// see https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html
2724
private static final Supplier<Set<Message>> messageSupplier = () -> new TreeSet<>(byMessageName);
2825

2926
public static Object toMessageObjectOrComposition(Set<Message> messages) {

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

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

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import com.asyncapi.v2.model.channel.ChannelItem;
67
import com.asyncapi.v2.model.channel.operation.Operation;
@@ -18,7 +19,13 @@
1819

1920
import java.lang.annotation.Annotation;
2021
import java.lang.reflect.Method;
21-
import java.util.*;
22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.Comparator;
25+
import java.util.Map;
26+
import java.util.Optional;
27+
import java.util.Set;
28+
import java.util.TreeSet;
2229
import java.util.function.Supplier;
2330
import java.util.stream.Collectors;
2431

@@ -66,12 +73,18 @@ public abstract class AbstractClassLevelListenerScanner<ClassAnnotation extends
6673

6774
/**
6875
* @param annotation An instance of a listener annotation.
69-
* @return A map containing an channel binding pointed to by the protocol binding name.
76+
* @return A map containing a channel binding pointed to by the protocol binding name.
7077
*/
7178
protected abstract Map<String, ? extends ChannelBinding> buildChannelBinding(ClassAnnotation annotation);
7279

7380
/**
74-
* Can be overriden by implementations
81+
* @param method The specific method. Can be used to extract message binding from an annotation.
82+
* @return A map containing a message binding pointed to by the protocol binding name.
83+
*/
84+
protected abstract Map<String, ? extends MessageBinding> buildMessageBinding(Method method);
85+
86+
/**
87+
* Can be overridden by implementations
7588
*
7689
* @param method The specific method. Can be used to extract the payload type
7790
* @return The AsyncHeaders
@@ -159,6 +172,7 @@ private Message buildMessage(Method method) {
159172
.title(modelName)
160173
.payload(PayloadReference.fromModelName(modelName))
161174
.headers(HeaderReference.fromModelName(headerModelName))
175+
.bindings(buildMessageBinding(method))
162176
.build();
163177
}
164178

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

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

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import com.asyncapi.v2.model.channel.ChannelItem;
67
import com.asyncapi.v2.model.channel.operation.Operation;
@@ -17,7 +18,11 @@
1718

1819
import java.lang.annotation.Annotation;
1920
import java.lang.reflect.Method;
20-
import java.util.*;
21+
import java.util.Arrays;
22+
import java.util.Collection;
23+
import java.util.Map;
24+
import java.util.Optional;
25+
import java.util.Set;
2126

2227
import static java.util.stream.Collectors.toMap;
2328
import static java.util.stream.Collectors.toSet;
@@ -62,6 +67,12 @@ public Map<String, ChannelItem> scan() {
6267
*/
6368
protected abstract Map<String, ? extends OperationBinding> buildOperationBinding(T annotation);
6469

70+
/**
71+
* @param annotation An instance of a listener annotation.
72+
* @return A map containing a message binding pointed to by the protocol binding name.
73+
*/
74+
protected abstract Map<String, ? extends MessageBinding> buildMessageBinding(T annotation);
75+
6576
/**
6677
* @param method The listener method.
6778
* @return The class object of the payload received by the listener.
@@ -88,16 +99,18 @@ private Map.Entry<String, ChannelItem> mapMethodToChannel(Method method) {
8899

89100
Map<String, ? extends ChannelBinding> channelBinding = buildChannelBinding(annotation);
90101
Map<String, ? extends OperationBinding> operationBinding = buildOperationBinding(annotation);
102+
Map<String, ? extends MessageBinding> messageBinding = buildMessageBinding(annotation);
91103
Class<?> payload = getPayloadType(method);
92104
String operationId = channelName + "_publish_" + method.getName();
93-
ChannelItem channel = buildChannel(channelBinding, payload, operationBinding, operationId);
105+
ChannelItem channel = buildChannel(channelBinding, payload, operationBinding, messageBinding, operationId);
94106

95107
return Maps.immutableEntry(channelName, channel);
96108
}
97109

98110
private ChannelItem buildChannel(Map<String, ? extends ChannelBinding> channelBinding,
99111
Class<?> payloadType,
100112
Map<String, ? extends OperationBinding> operationBinding,
113+
Map<String, ? extends MessageBinding> messageBinding,
101114
String operationId) {
102115
String modelName = schemasService.register(payloadType);
103116
String headerModelName = schemasService.register(AsyncHeaders.NOT_DOCUMENTED);
@@ -107,6 +120,7 @@ private ChannelItem buildChannel(Map<String, ? extends ChannelBinding> channelBi
107120
.title(modelName)
108121
.payload(PayloadReference.fromModelName(modelName))
109122
.headers(HeaderReference.fromModelName(headerModelName))
123+
.bindings(messageBinding)
110124
.build();
111125

112126
Operation operation = Operation.builder()

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
*/
1414
@Data
1515
@Builder
16-
// TODO Why ignore other fields?
17-
//@EqualsAndHashCode(of = {"name"})
1816
@NoArgsConstructor
1917
@AllArgsConstructor
2018
public class Message {

springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/annotation/TestMethodLevelListenerScanner.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.scanners.channels.annotation;
22

33
import com.asyncapi.v2.binding.ChannelBinding;
4+
import com.asyncapi.v2.binding.MessageBinding;
45
import com.asyncapi.v2.binding.OperationBinding;
56
import com.google.common.collect.ImmutableMap;
67
import lombok.EqualsAndHashCode;
@@ -30,6 +31,11 @@ protected String getChannelName(TestMethodLevelListenerScannerTest.TestChannelLi
3031
return ImmutableMap.of("test-operation-binding", new TestOperationBinding());
3132
}
3233

34+
@Override
35+
protected Map<String, ? extends MessageBinding> buildMessageBinding(TestMethodLevelListenerScannerTest.TestChannelListener annotation) {
36+
return ImmutableMap.of("test-message-binding", new TestMessageBinding());
37+
}
38+
3339
@Override
3440
protected Class<?> getPayloadType(Method method) {
3541
Class<?>[] parameterTypes = method.getParameterTypes();
@@ -49,4 +55,8 @@ public static class TestChannelBinding extends ChannelBinding {
4955
public static class TestOperationBinding extends OperationBinding {
5056
}
5157

58+
@EqualsAndHashCode(callSuper = true)
59+
public static class TestMessageBinding extends MessageBinding {
60+
}
61+
5262
}

springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/scanners/channels/annotation/TestMethodLevelListenerScannerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public void scan_componentHasListenerMethod() {
7272
.title(SimpleFoo.class.getSimpleName())
7373
.payload(PayloadReference.fromModelName(SimpleFoo.class.getSimpleName()))
7474
.headers(HeaderReference.fromModelName(AsyncHeaders.NOT_DOCUMENTED.getSchemaName()))
75+
.bindings(ImmutableMap.of("test-message-binding", new TestMethodLevelListenerScanner.TestMessageBinding()))
7576
.build();
7677

7778
Operation operation = Operation.builder()

0 commit comments

Comments
 (0)