Skip to content

Commit 87ebc2f

Browse files
committed
Refactor code to merge messages in ChannelMerger to respect the priority without relying on equals based on message name
1 parent 90a9da5 commit 87ebc2f

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.Message;
55
import lombok.extern.slf4j.Slf4j;
66

7-
import java.util.Arrays;
7+
import java.util.ArrayList;
88
import java.util.Collections;
99
import java.util.Comparator;
1010
import java.util.HashSet;
11+
import java.util.List;
1112
import java.util.Map;
1213
import java.util.Set;
1314
import java.util.TreeSet;
@@ -32,7 +33,7 @@ public static Object toMessageObjectOrComposition(Set<Message> messages) {
3233
case 1:
3334
return messages.toArray()[0];
3435
default:
35-
return ImmutableMap.of(ONE_OF, new HashSet<>(messages.stream().collect(Collectors.toCollection(messageSupplier))));
36+
return ImmutableMap.of(ONE_OF, new ArrayList<>(messages.stream().collect(Collectors.toCollection(messageSupplier))));
3637
}
3738
}
3839

@@ -43,12 +44,11 @@ public static Set<Message> messageObjectToSet(Object messageObject) {
4344
}
4445

4546
if (messageObject instanceof Map) {
46-
Set<Message> messages = ((Map<String, Set<Message>>) messageObject).get(ONE_OF);
47+
List<Message> messages = ((Map<String, List<Message>>) messageObject).get(ONE_OF);
4748
return new HashSet<>(messages);
4849
}
4950

5051
log.warn("Message object must contain either a Message or a Map<String, Set<Message>, but contained: {}", messageObject.getClass());
5152
return new HashSet<>();
5253
}
53-
5454
}

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@
55
import io.github.stavshamir.springwolf.asyncapi.MessageHelper;
66
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.Message;
77

8-
import java.util.*;
8+
import java.util.HashSet;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Optional;
12+
import java.util.Set;
13+
import java.util.TreeMap;
14+
import java.util.TreeSet;
15+
import java.util.function.Function;
16+
import java.util.stream.Collectors;
917

1018
import static io.github.stavshamir.springwolf.asyncapi.MessageHelper.toMessageObjectOrComposition;
1119

@@ -42,17 +50,25 @@ public static Map<String, ChannelItem> merge(List<Map.Entry<String, ChannelItem>
4250
}
4351

4452
private static Operation mergeOperation(Operation operation, Operation otherOperation) {
45-
Set<Message> mergedMessages = getMessages(operation);
46-
Set<Message> currentEntryMessages = getMessages(otherOperation);
47-
mergedMessages.addAll(currentEntryMessages);
48-
4953
Operation mergedOperation = operation != null ? operation : otherOperation;
54+
55+
Set<Message> mergedMessages = mergeMessages(getMessages(operation), getMessages(otherOperation));
5056
if (!mergedMessages.isEmpty()) {
5157
mergedOperation.setMessage(toMessageObjectOrComposition(mergedMessages));
5258
}
5359
return mergedOperation;
5460
}
5561

62+
private static Set<Message> mergeMessages(Set<Message> messages, Set<Message> otherMessages) {
63+
Map<String, Message> nameToMessage = messages.stream().collect(Collectors.toMap(Message::getName, Function.identity()));
64+
65+
for (Message otherMessage : otherMessages) {
66+
nameToMessage.putIfAbsent(otherMessage.getName(), otherMessage);
67+
}
68+
69+
return new HashSet<>(nameToMessage.values());
70+
}
71+
5672
private static Set<Message> getMessages(Operation operation) {
5773
return Optional
5874
.ofNullable(operation)

springwolf-core/src/test/java/io/github/stavshamir/springwolf/asyncapi/MessageHelperTest.java

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

3+
import com.google.common.collect.ImmutableList;
34
import com.google.common.collect.ImmutableMap;
45
import com.google.common.collect.ImmutableSet;
56
import io.github.stavshamir.springwolf.asyncapi.types.channel.operation.message.Message;
@@ -50,7 +51,7 @@ public void toMessageObjectOrComposition_multipleMessages() {
5051

5152
assertThat(asObject)
5253
.isInstanceOf(Map.class)
53-
.isEqualTo(ImmutableMap.of("oneOf", ImmutableSet.of(message1, message2)));
54+
.isEqualTo(ImmutableMap.of("oneOf", ImmutableList.of(message2, message1)));
5455
}
5556

5657
@Test
@@ -75,7 +76,7 @@ public void toMessageObjectOrComposition_multipleMessages_remove_duplicates() {
7576
// Message3 is not included as it is identical in terms of payload type (Message#name) to message 2
7677
assertThat(asObject)
7778
.isInstanceOf(Map.class)
78-
.isEqualTo(ImmutableMap.of("oneOf", ImmutableSet.of(message1, message2)));
79+
.isEqualTo(ImmutableMap.of("oneOf", ImmutableList.of(message2, message1)));
7980
}
8081

8182
@Test

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
public class ChannelMergerTest {
1818

19-
2019
@Test
2120
public void shouldNotMergeDifferentChannelNames() {
2221
// given
@@ -110,8 +109,7 @@ public void shouldMergeDifferentMessageForSameOperation() {
110109

111110
// then expectedMessage only includes message1 and message2.
112111
// Message3 is not included as it is identical in terms of payload type (Message#name) to message 2
113-
// TODO Is it really expected that the first occurrence is used? (no test in Message Helper...)
114-
Object expectedMessages = MessageHelper.toMessageObjectOrComposition(Sets.newHashSet(message1, message3));
112+
Object expectedMessages = MessageHelper.toMessageObjectOrComposition(Sets.newHashSet(message1, message2));
115113
assertThat(mergedChannels).hasSize(1)
116114
.hasEntrySatisfying(channelName, it -> {
117115
assertThat(it.getPublish()).isEqualTo(Operation.builder().operationId("publisher1").message(expectedMessages).build());

0 commit comments

Comments
 (0)