From d34b27fdac37c24a78e636571b4ad5e22fbf82e0 Mon Sep 17 00:00:00 2001 From: Isaac Aymerich Date: Wed, 24 Aug 2022 09:37:00 +0200 Subject: [PATCH] support dynamic data content type Signed-off-by: Isaac Aymerich --- .../io/cloudevents/jackson/JsonFormat.java | 8 +++++-- .../jackson/JsonCloudEventDataTest.java | 21 ++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/formats/json-jackson/src/main/java/io/cloudevents/jackson/JsonFormat.java b/formats/json-jackson/src/main/java/io/cloudevents/jackson/JsonFormat.java index 49467980b..b6d35b9f7 100644 --- a/formats/json-jackson/src/main/java/io/cloudevents/jackson/JsonFormat.java +++ b/formats/json-jackson/src/main/java/io/cloudevents/jackson/JsonFormat.java @@ -29,6 +29,7 @@ import io.cloudevents.rw.CloudEventRWException; import java.io.IOException; +import java.util.regex.Pattern; /** * Implementation of {@link EventFormat} for JSON event format @@ -43,7 +44,10 @@ public final class JsonFormat implements EventFormat { * Content type associated with the JSON event format */ public static final String CONTENT_TYPE = "application/cloudevents+json"; - + /** + * Suppoted Content type + */ + private static final Pattern PATTERN_CONTENT_TYPE = Pattern.compile("^(application|text)\\/([a-zA-Z]+\\+)?json$"); private final ObjectMapper mapper; private final JsonFormatOptions options; @@ -214,6 +218,6 @@ public static SimpleModule getCloudEventJacksonModule(JsonFormatOptions options) static boolean dataIsJsonContentType(String contentType) { // If content type, spec states that we should assume is json - return contentType == null || contentType.startsWith("application/json") || contentType.startsWith("text/json"); + return contentType == null || PATTERN_CONTENT_TYPE.matcher(contentType).matches(); } } diff --git a/formats/json-jackson/src/test/java/io/cloudevents/jackson/JsonCloudEventDataTest.java b/formats/json-jackson/src/test/java/io/cloudevents/jackson/JsonCloudEventDataTest.java index 9a4537e12..8b71d3a77 100644 --- a/formats/json-jackson/src/test/java/io/cloudevents/jackson/JsonCloudEventDataTest.java +++ b/formats/json-jackson/src/test/java/io/cloudevents/jackson/JsonCloudEventDataTest.java @@ -20,19 +20,27 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import io.cloudevents.CloudEvent; import io.cloudevents.core.builder.CloudEventBuilder; +import io.cloudevents.core.impl.StringUtils; import io.cloudevents.core.mock.MyCloudEventData; import io.cloudevents.core.provider.EventFormatProvider; import io.cloudevents.core.test.Data; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; public class JsonCloudEventDataTest { - @Test - public void testMapper() { + @ParameterizedTest + @MethodSource("textContentArguments") + public void testMapper(String contentType) { CloudEvent event = CloudEventBuilder.v1(Data.V1_MIN) - .withData("application/json", new JsonCloudEventData(JsonNodeFactory.instance.numberNode(10))) + .withData(contentType, new JsonCloudEventData(JsonNodeFactory.instance.numberNode(10))) .build(); byte[] serialized = EventFormatProvider.getInstance().resolveFormat(JsonFormat.CONTENT_TYPE) @@ -53,4 +61,11 @@ public void testMapper() { .isEqualTo(10); } + public static Stream textContentArguments() { + return Stream.of( + Arguments.of("application/json"), + Arguments.of("text/json"), + Arguments.of("application/fubar+json") + ); + } }