Skip to content

Commit f8d27b0

Browse files
authored
Support dynamic JSON data content type (#471)
Now checks if `datacontenttype` matches the regex: `^(application|text)\/([a-zA-Z]+\+)?json$")` This regex support `application/foobar+json` or standard ``` application/json text/json ``` Signed-off-by: Isaac Aymerich <isaac.aymerich@roche.com>
1 parent 9125136 commit f8d27b0

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

formats/json-jackson/src/main/java/io/cloudevents/jackson/JsonFormat.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.cloudevents.rw.CloudEventRWException;
3030

3131
import java.io.IOException;
32+
import java.util.regex.Pattern;
3233

3334
/**
3435
* Implementation of {@link EventFormat} for <a href="https://github.com/cloudevents/spec/blob/v1.0/json-format.md">JSON event format</a>
@@ -43,7 +44,10 @@ public final class JsonFormat implements EventFormat {
4344
* Content type associated with the JSON event format
4445
*/
4546
public static final String CONTENT_TYPE = "application/cloudevents+json";
46-
47+
/**
48+
* JSON Data Content Type Discriminator
49+
*/
50+
private static final Pattern JSON_CONTENT_TYPE_PATTERN = Pattern.compile("^(application|text)\\/([a-zA-Z]+\\+)?json$");
4751
private final ObjectMapper mapper;
4852
private final JsonFormatOptions options;
4953

@@ -214,6 +218,6 @@ public static SimpleModule getCloudEventJacksonModule(JsonFormatOptions options)
214218

215219
static boolean dataIsJsonContentType(String contentType) {
216220
// If content type, spec states that we should assume is json
217-
return contentType == null || contentType.startsWith("application/json") || contentType.startsWith("text/json");
221+
return contentType == null || JSON_CONTENT_TYPE_PATTERN.matcher(contentType).matches();
218222
}
219223
}

formats/json-jackson/src/test/java/io/cloudevents/jackson/JsonCloudEventDataTest.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,21 @@
2323
import io.cloudevents.core.mock.MyCloudEventData;
2424
import io.cloudevents.core.provider.EventFormatProvider;
2525
import io.cloudevents.core.test.Data;
26-
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.params.ParameterizedTest;
27+
import org.junit.jupiter.params.provider.Arguments;
28+
import org.junit.jupiter.params.provider.MethodSource;
29+
30+
import java.util.stream.Stream;
2731

2832
import static org.assertj.core.api.Assertions.assertThat;
2933

3034
public class JsonCloudEventDataTest {
3135

32-
@Test
33-
public void testMapper() {
36+
@ParameterizedTest
37+
@MethodSource("textContentArguments")
38+
public void testMapper(String contentType) {
3439
CloudEvent event = CloudEventBuilder.v1(Data.V1_MIN)
35-
.withData("application/json", new JsonCloudEventData(JsonNodeFactory.instance.numberNode(10)))
40+
.withData(contentType, new JsonCloudEventData(JsonNodeFactory.instance.numberNode(10)))
3641
.build();
3742

3843
byte[] serialized = EventFormatProvider.getInstance().resolveFormat(JsonFormat.CONTENT_TYPE)
@@ -47,10 +52,19 @@ public void testMapper() {
4752
return new MyCloudEventData(((JsonCloudEventData) data).getNode().asInt());
4853
});
4954

55+
assertThat(deserialized.getDataContentType())
56+
.isEqualTo(contentType);
5057
assertThat(deserialized.getData())
5158
.isInstanceOf(MyCloudEventData.class);
5259
assertThat(((MyCloudEventData) deserialized.getData()).getValue())
5360
.isEqualTo(10);
5461
}
5562

63+
public static Stream<Arguments> textContentArguments() {
64+
return Stream.of(
65+
Arguments.of("application/json"),
66+
Arguments.of("text/json"),
67+
Arguments.of("application/foobar+json")
68+
);
69+
}
5670
}

0 commit comments

Comments
 (0)