Skip to content

Commit 82c6c2e

Browse files
authored
Merge branch 'master' into componentschema-refactoring
2 parents 023ccfe + 37d6733 commit 82c6c2e

File tree

3 files changed

+34
-20
lines changed

3 files changed

+34
-20
lines changed

springwolf-asyncapi/src/main/java/io/github/springwolf/asyncapi/v3/model/ReferenceUtil.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package io.github.springwolf.asyncapi.v3.model;
33

4+
import java.util.Set;
5+
import java.util.stream.Collectors;
6+
47
public class ReferenceUtil {
5-
private static final String FORBIDDEN_ID_CHARACTER = "/";
8+
/**
9+
* Allowed characters in RFC 3986, section 3.5 fragments (used for AsyncAPI $ref values)
10+
* Excluding '~' and '/', since they have a special meaning JSON Pointer (RFC 6901)
11+
*/
12+
private static final Set<Character> ALLOWED_CHARACTERS =
13+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._!$&'()+,;=:@?%"
14+
.chars()
15+
.mapToObj(c -> (char) c)
16+
.collect(Collectors.toSet());
617

718
public static String toValidId(String name) {
8-
return name.replaceAll(FORBIDDEN_ID_CHARACTER, "_");
19+
StringBuilder sb = new StringBuilder();
20+
21+
for (char c : name.toCharArray()) {
22+
if (ALLOWED_CHARACTERS.contains(c)) {
23+
sb.append(c);
24+
} else {
25+
sb.append("_");
26+
}
27+
}
28+
29+
return sb.toString();
930
}
1031

1132
public static String getLastSegment(String ref) {

springwolf-asyncapi/src/test/java/io/github/springwolf/asyncapi/v3/model/ReferenceUtilTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33

44
import org.junit.jupiter.api.Nested;
55
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.CsvSource;
68

79
import static org.assertj.core.api.Assertions.assertThat;
810

911
class ReferenceUtilTest {
10-
@Test
11-
void shouldCorrectIllegalCharacter() {
12-
String name = "users/{userId}";
12+
@ParameterizedTest
13+
@CsvSource(value = {"users/userId", "users~userId", "users*userId", "users#userId"})
14+
void shouldReplaceIllegalCharacter(String name) {
15+
String result = ReferenceUtil.toValidId(name);
1316

14-
assertThat(ReferenceUtil.toValidId(name)).isEqualTo("users_{userId}");
17+
assertThat(result).isEqualTo("users_userId");
1518
}
1619

1720
@Nested

springwolf-plugins/springwolf-amqp-plugin/src/main/java/io/github/springwolf/plugins/amqp/asyncapi/scanners/bindings/RabbitListenerUtil.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,8 @@ public static String getChannelName(RabbitListener annotation, StringValueResolv
6565
}
6666

6767
public static String getChannelId(RabbitListener annotation, StringValueResolver stringValueResolver) {
68-
Stream<String> annotationBindingChannelIds = Arrays.stream(annotation.bindings())
69-
.flatMap(binding -> channelIdFromAnnotationBindings(
70-
binding.exchange().name(), binding.key())
71-
.map(stringValueResolver::resolveStringValue));
72-
73-
Stream<String> stream =
74-
Stream.concat(streamQueueNames(annotation).map(ReferenceUtil::toValidId), annotationBindingChannelIds);
75-
return resolveFirstValue(stream, stringValueResolver, "channel id");
68+
String channelName = getChannelName(annotation, stringValueResolver);
69+
return ReferenceUtil.toValidId(channelName);
7670
}
7771

7872
private static String getQueueName(RabbitListener annotation, StringValueResolver resolver) {
@@ -93,10 +87,6 @@ private static Stream<String> channelNameFromAnnotationBindings(String exchangeN
9387
return keys.stream().map(key -> String.join("_", exchangeName, key));
9488
}
9589

96-
private static Stream<String> channelIdFromAnnotationBindings(String exchangeName, String[] keys) {
97-
return channelNameFromAnnotationBindings(exchangeName, keys).map(ReferenceUtil::toValidId);
98-
}
99-
10090
/**
10191
*
10292
* @param rabbitListenerAnnotation a RabbitListener annotation
@@ -211,14 +201,14 @@ public static ChannelObject buildChannelObject(org.springframework.amqp.core.Que
211201
}
212202

213203
public static List<ChannelObject> buildChannelObject(Binding binding) {
214-
String exchangeId = channelIdFromAnnotationBindings(
204+
String exchangeName = channelNameFromAnnotationBindings(
215205
binding.getExchange(), List.of(binding.getRoutingKey()).toArray(String[]::new))
216206
.findFirst()
217207
.get();
218208
return List.of(
219209
// exchange
220210
ChannelObject.builder()
221-
.channelId(exchangeId)
211+
.channelId(ReferenceUtil.toValidId(exchangeName))
222212
.address(binding.getRoutingKey())
223213
.bindings(Map.of(
224214
BINDING_NAME,

0 commit comments

Comments
 (0)