diff --git a/api/src/main/java/io/cloudevents/format/EventDeserializationException.java b/api/src/main/java/io/cloudevents/format/EventDeserializationException.java new file mode 100644 index 00000000..49ba60f8 --- /dev/null +++ b/api/src/main/java/io/cloudevents/format/EventDeserializationException.java @@ -0,0 +1,7 @@ +package io.cloudevents.format; + +public class EventDeserializationException extends RuntimeException { + public EventDeserializationException(Throwable e) { + super(e); + } +} diff --git a/api/src/main/java/io/cloudevents/format/EventFormat.java b/api/src/main/java/io/cloudevents/format/EventFormat.java index 496d6941..9e118d23 100644 --- a/api/src/main/java/io/cloudevents/format/EventFormat.java +++ b/api/src/main/java/io/cloudevents/format/EventFormat.java @@ -6,9 +6,9 @@ import java.util.Set; public interface EventFormat { - byte[] serialize(CloudEvent event); + byte[] serialize(CloudEvent event) throws EventSerializationException; - CloudEvent deserialize(byte[] event); + CloudEvent deserialize(byte[] event) throws EventDeserializationException; Set supportedContentTypes(); diff --git a/api/src/main/java/io/cloudevents/format/EventSerializationException.java b/api/src/main/java/io/cloudevents/format/EventSerializationException.java new file mode 100644 index 00000000..afb5e7df --- /dev/null +++ b/api/src/main/java/io/cloudevents/format/EventSerializationException.java @@ -0,0 +1,7 @@ +package io.cloudevents.format; + +public class EventSerializationException extends RuntimeException { + public EventSerializationException(Throwable e) { + super(e); + } +} diff --git a/api/src/main/java/io/cloudevents/impl/CloudEventImpl.java b/api/src/main/java/io/cloudevents/impl/CloudEventImpl.java index 84925d7e..03a8c08d 100644 --- a/api/src/main/java/io/cloudevents/impl/CloudEventImpl.java +++ b/api/src/main/java/io/cloudevents/impl/CloudEventImpl.java @@ -13,7 +13,7 @@ public final class CloudEventImpl implements CloudEvent, BinaryMessage { private final byte[] data; private final Map extensions; - protected CloudEventImpl(Attributes attributes, byte[] data, Map extensions) { + public CloudEventImpl(Attributes attributes, byte[] data, Map extensions) { Objects.requireNonNull(attributes); this.attributes = (AttributesInternal) attributes; this.data = data; diff --git a/formats/json-jackson/src/main/java/io/cloudevents/format/json/JsonFormat.java b/formats/json-jackson/src/main/java/io/cloudevents/format/json/JsonFormat.java index 86db27fe..cbb2576a 100644 --- a/formats/json-jackson/src/main/java/io/cloudevents/format/json/JsonFormat.java +++ b/formats/json-jackson/src/main/java/io/cloudevents/format/json/JsonFormat.java @@ -15,11 +15,16 @@ */ package io.cloudevents.format.json; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import io.cloudevents.CloudEvent; +import io.cloudevents.format.EventDeserializationException; import io.cloudevents.format.EventFormat; +import io.cloudevents.format.EventSerializationException; +import io.cloudevents.impl.CloudEventImpl; +import java.io.IOException; import java.time.ZonedDateTime; import java.util.Collections; import java.util.Set; @@ -36,18 +41,39 @@ public final class JsonFormat implements EventFormat { MAPPER.registerModule(module); } + private boolean forceDataBase64Serialization = false; + private boolean forceStringSerialization = false; + @Override - public byte[] serialize(CloudEvent event) { - return new byte[0]; + public byte[] serialize(CloudEvent event) throws EventSerializationException { + try { + return MAPPER.writeValueAsBytes(event); + } catch (JsonProcessingException e) { + throw new EventSerializationException(e); + } } @Override - public CloudEvent deserialize(byte[] event) { - return null; + public CloudEvent deserialize(byte[] event) throws EventDeserializationException { + try { + return MAPPER.readValue(event, CloudEventImpl.class); + } catch (IOException e) { + throw new EventDeserializationException(e); + } } @Override public Set supportedContentTypes() { return Collections.singleton("application/cloudevents+json"); } + + public JsonFormat forceDataBase64Serialization(boolean forceBase64Serialization) { + this.forceDataBase64Serialization = forceBase64Serialization; + return this; + } + + public JsonFormat forceDataStringSerialization(boolean forceStringSerialization) { + this.forceStringSerialization = forceStringSerialization; + return this; + } } diff --git a/formats/json-jackson/src/test/java/io/cloudevents/format/json/JsonFormatTest.java b/formats/json-jackson/src/test/java/io/cloudevents/format/json/JsonFormatTest.java index 8b66d6ec..498510f0 100644 --- a/formats/json-jackson/src/test/java/io/cloudevents/format/json/JsonFormatTest.java +++ b/formats/json-jackson/src/test/java/io/cloudevents/format/json/JsonFormatTest.java @@ -66,6 +66,14 @@ class JsonFormatTest { } private static Stream serializeTestArguments() { + return deserializeTestArguments().map(a -> { + List vals = new ArrayList<>(Arrays.asList(a.get())); + Collections.reverse(vals); + return Arguments.of(vals.toArray()); + }); + } + + private static Stream deserializeTestArguments() { return Stream.of( Arguments.of("v03/min.json", V03_MIN), Arguments.of("v03/json_data.json", V03_WITH_JSON_DATA), @@ -84,14 +92,6 @@ class JsonFormatTest { ); } - private static Stream deserializeTestArguments() { - return serializeTestArguments().map(a -> { - List vals = new ArrayList<>(Arrays.asList(a.get())); - Collections.reverse(vals); - return Arguments.of(vals.toArray()); - }); - } - private static Stream roundTripTestArguments() { return Stream.of( "v03/min.json", @@ -123,7 +123,7 @@ class JsonFormatTest { } private EventFormat getFormat() { - return EventFormatProvider.getInstance().resolveFormat("application/json"); + return EventFormatProvider.getInstance().resolveFormat("application/cloudevents+json"); } }