diff --git a/api/pom.xml b/api/pom.xml index e13af0d08..429313935 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -33,9 +33,9 @@ json-schema-validator - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml - + org.hibernate.validator hibernate-validator diff --git a/api/src/main/java/org/openworkflow/sdk/api/ObjectMapperFactory.java b/api/src/main/java/org/openworkflow/sdk/api/ObjectMapperFactory.java index d99803e66..82922112a 100644 --- a/api/src/main/java/org/openworkflow/sdk/api/ObjectMapperFactory.java +++ b/api/src/main/java/org/openworkflow/sdk/api/ObjectMapperFactory.java @@ -15,28 +15,26 @@ */ package org.openworkflow.sdk.api; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature; +import com.fasterxml.jackson.annotation.JsonInclude; import java.net.URI; import org.openworkflow.sdk.api.types.jackson.JacksonMixInModule; import org.openworkflow.sdk.serialization.BeanDeserializerModifierWithValidation; import org.openworkflow.sdk.serialization.URIDeserializer; import org.openworkflow.sdk.serialization.URISerializer; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.cfg.MapperBuilder; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; class ObjectMapperFactory { - private static final ObjectMapper jsonMapper = configure(new ObjectMapper()); + private static final ObjectMapper jsonMapper = configureJson(); - private static final ObjectMapper yamlMapper = - configure( - new ObjectMapper( - new YAMLFactory() - .enable(Feature.MINIMIZE_QUOTES) - .enable(Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS))); + private static final ObjectMapper yamlMapper = configureYaml(); public static ObjectMapper jsonMapper() { return jsonMapper; @@ -46,21 +44,34 @@ public static ObjectMapper yamlMapper() { return yamlMapper; } - private static ObjectMapper configure(ObjectMapper mapper) { - SimpleModule validationModule = new SimpleModule(); + private static ObjectMapper configureJson() { + return configure(JsonMapper.builder()).build(); + } + + private static ObjectMapper configureYaml() { + return configure(YAMLMapper.builder()) + .enable(YAMLWriteFeature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS) + .enable(YAMLWriteFeature.MINIMIZE_QUOTES) + .build(); + } + + private static > T configure(T builder) { + SimpleModule validationModule = new SimpleModule("JakartaValidationModule"); validationModule.addDeserializer(URI.class, new URIDeserializer()); validationModule.addSerializer(URI.class, new URISerializer()); validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); - - return mapper - .setDefaultPropertyInclusion(Include.NON_NULL) - .configure(SerializationFeature.INDENT_OUTPUT, true) - .configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false) - .configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false) - .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) - .registerModule(validationModule) - .registerModule(new JacksonMixInModule()) - .findAndRegisterModules(); + return builder + .enable(SerializationFeature.INDENT_OUTPUT) + .enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) + .addModule(validationModule) + .changeDefaultPropertyInclusion( + v -> + v.withValueInclusion(JsonInclude.Include.NON_NULL) + .withContentInclusion(JsonInclude.Include.NON_NULL)) + .addModule(new JacksonMixInModule()) + .findAndAddModules(); } private ObjectMapperFactory() {} diff --git a/api/src/main/java/org/openworkflow/sdk/api/ValidationReader.java b/api/src/main/java/org/openworkflow/sdk/api/ValidationReader.java index 97950caec..a27be4ccf 100644 --- a/api/src/main/java/org/openworkflow/sdk/api/ValidationReader.java +++ b/api/src/main/java/org/openworkflow/sdk/api/ValidationReader.java @@ -15,9 +15,6 @@ */ package org.openworkflow.sdk.api; -import com.fasterxml.jackson.core.exc.StreamReadException; -import com.fasterxml.jackson.databind.DatabindException; -import com.fasterxml.jackson.databind.JsonNode; import com.networknt.schema.Error; import com.networknt.schema.InputFormat; import com.networknt.schema.Schema; @@ -30,6 +27,9 @@ import java.util.Collection; import java.util.stream.Collectors; import org.openworkflow.sdk.api.types.Workflow; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.JsonNode; class ValidationReader implements WorkflowReaderOperations { private final Schema schemaObject; diff --git a/api/src/main/java/org/openworkflow/sdk/api/WorkflowFormat.java b/api/src/main/java/org/openworkflow/sdk/api/WorkflowFormat.java index ba79286e4..b4f0aa25d 100644 --- a/api/src/main/java/org/openworkflow/sdk/api/WorkflowFormat.java +++ b/api/src/main/java/org/openworkflow/sdk/api/WorkflowFormat.java @@ -15,8 +15,8 @@ */ package org.openworkflow.sdk.api; -import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.file.Path; +import tools.jackson.databind.ObjectMapper; /** * Enum representing the supported formats for Open Workflow definitions. diff --git a/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerModifierWithValidation.java b/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerModifierWithValidation.java index 7353521ca..fe3a4d155 100644 --- a/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerModifierWithValidation.java +++ b/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerModifierWithValidation.java @@ -15,21 +15,20 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.DeserializationConfig; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.deser.ValueDeserializerModifier; -public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { +public class BeanDeserializerModifierWithValidation extends ValueDeserializerModifier { private static final long serialVersionUID = 1L; @Override - public JsonDeserializer modifyDeserializer( - DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { - return deserializer instanceof BeanDeserializer - ? new BeanDeserializerWithValidation((BeanDeserializer) deserializer) - : deserializer; + public ValueDeserializer modifyDeserializer( + DeserializationConfig config, + BeanDescription.Supplier beanDesc, + ValueDeserializer deserializer) { + return new BeanDeserializerWithValidation(deserializer); } } diff --git a/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerWithValidation.java b/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerWithValidation.java index b8c1728c6..c0f9bb118 100644 --- a/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerWithValidation.java +++ b/api/src/main/java/org/openworkflow/sdk/serialization/BeanDeserializerWithValidation.java @@ -15,27 +15,25 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.Validator; -import java.io.IOException; import java.util.Set; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.deser.std.DelegatingDeserializer; -public class BeanDeserializerWithValidation extends BeanDeserializer { - private static final long serialVersionUID = 1L; +public class BeanDeserializerWithValidation extends DelegatingDeserializer { private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); - protected BeanDeserializerWithValidation(BeanDeserializerBase src) { - super(src); + protected BeanDeserializerWithValidation(ValueDeserializer delegatee) { + super(delegatee); } - private void validate(T t) throws IOException { + private void validate(T t) { Set> violations = validator.validate(t); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); @@ -43,8 +41,13 @@ private void validate(T t) throws IOException { } @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - Object instance = super.deserialize(p, ctxt); + protected ValueDeserializer newDelegatingInstance(ValueDeserializer newDelegatee) { + return new BeanDeserializerWithValidation(newDelegatee); + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) { + Object instance = _delegatee.deserialize(p, ctxt); validate(instance); return instance; } diff --git a/api/src/main/java/org/openworkflow/sdk/serialization/URIDeserializer.java b/api/src/main/java/org/openworkflow/sdk/serialization/URIDeserializer.java index 702afff53..c57f4e31d 100644 --- a/api/src/main/java/org/openworkflow/sdk/serialization/URIDeserializer.java +++ b/api/src/main/java/org/openworkflow/sdk/serialization/URIDeserializer.java @@ -15,25 +15,30 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonMappingException; -import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.exc.InvalidFormatException; + +public class URIDeserializer extends ValueDeserializer { -public class URIDeserializer extends JsonDeserializer { @Override - public URI deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + public Class handledType() { + return URI.class; + } + + @Override + public URI deserialize(JsonParser p, DeserializationContext ctxt) { + String uriStr = p.getValueAsString(); + if (uriStr == null) { + throw InvalidFormatException.from(p, "URI is not a string", uriStr, URI.class); + } try { - String uriStr = p.getValueAsString(); - if (uriStr == null) { - throw new JsonMappingException(p, "URI is not an string"); - } return new URI(uriStr); } catch (URISyntaxException ex) { - throw new JsonMappingException(p, ex.getMessage()); + throw InvalidFormatException.from(p, ex.getMessage(), uriStr, URI.class); } } } diff --git a/api/src/main/java/org/openworkflow/sdk/serialization/URISerializer.java b/api/src/main/java/org/openworkflow/sdk/serialization/URISerializer.java index f4b8360a9..fde3c0e81 100644 --- a/api/src/main/java/org/openworkflow/sdk/serialization/URISerializer.java +++ b/api/src/main/java/org/openworkflow/sdk/serialization/URISerializer.java @@ -15,17 +15,15 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; import java.net.URI; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -public class URISerializer extends JsonSerializer { +public class URISerializer extends ValueSerializer { @Override - public void serialize(URI value, JsonGenerator gen, SerializerProvider serializers) - throws IOException { + public void serialize(URI value, JsonGenerator gen, SerializationContext serializers) { gen.writeString(value.toString()); } } diff --git a/examples/pom.xml b/examples/pom.xml index 24d8f6722..5d3d1b85b 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -43,7 +43,7 @@ org.glassfish.jersey.media - jersey-media-json-jackson + jersey-media-json-jackson3 ${version.org.glassfish.jersey} runtime diff --git a/examples/simpleGet/pom.xml b/examples/simpleGet/pom.xml index 748d5908e..cb3cd8327 100644 --- a/examples/simpleGet/pom.xml +++ b/examples/simpleGet/pom.xml @@ -23,7 +23,7 @@ org.glassfish.jersey.media - jersey-media-json-jackson + jersey-media-json-jackson3 org.glassfish.jersey.core diff --git a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/graalvm/ReflectNativeFileHandler.java b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/graalvm/ReflectNativeFileHandler.java index 8bda80fd1..1a640d5db 100644 --- a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/graalvm/ReflectNativeFileHandler.java +++ b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/graalvm/ReflectNativeFileHandler.java @@ -15,15 +15,15 @@ */ package org.openworkflow.sdk.generator.graalvm; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.sun.codemodel.JDefinedClass; import java.io.IOException; import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; import java.util.stream.Stream; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; public class ReflectNativeFileHandler { diff --git a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/GeneratorUtils.java b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/GeneratorUtils.java index fba76199f..a7e78b234 100644 --- a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/GeneratorUtils.java +++ b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/GeneratorUtils.java @@ -15,12 +15,6 @@ */ package org.openworkflow.sdk.generator.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; import com.sun.codemodel.JClassAlreadyExistsException; @@ -31,11 +25,16 @@ import com.sun.codemodel.JPackage; import com.sun.codemodel.JType; import com.sun.codemodel.JVar; -import java.io.IOException; import java.util.Collection; import java.util.List; import org.openworkflow.sdk.serialization.DeserializeHelper; import org.openworkflow.sdk.serialization.SerializeHelper; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.ValueSerializer; public class GeneratorUtils { @@ -46,27 +45,26 @@ public interface SerializerFiller { @FunctionalInterface public interface DeserializerFiller { - void accept(JMethod method, JVar parserParam); + void accept(JMethod method, JVar parserParam, JVar ctxParam); } public static JDefinedClass serializerClass(JPackage jPackage, JClass relatedClass) throws JClassAlreadyExistsException { - return createClass(jPackage, relatedClass, JsonSerializer.class, "Serializer"); + return createClass(jPackage, relatedClass, ValueSerializer.class, "Serializer"); } public static JDefinedClass deserializerClass(JPackage jPackage, JClass relatedClass) throws JClassAlreadyExistsException { - return createClass(jPackage, relatedClass, JsonDeserializer.class, "Deserializer"); + return createClass(jPackage, relatedClass, ValueDeserializer.class, "Deserializer"); } public static void fillSerializer( JDefinedClass definedClass, JClass relatedClass, SerializerFiller filler) { JMethod method = definedClass.method(JMod.PUBLIC, void.class, "serialize"); method.annotate(Override.class); - method._throws(IOException.class); JVar valueParam = method.param(relatedClass, "value"); JVar genParam = method.param(JsonGenerator.class, "gen"); - method.param(SerializerProvider.class, "serializers"); + method.param(SerializationContext.class, "serializers"); filler.accept(method, valueParam, genParam); } @@ -74,10 +72,9 @@ public static void fillDeserializer( JDefinedClass definedClass, JClass relatedClass, DeserializerFiller filler) { JMethod method = definedClass.method(JMod.PUBLIC, relatedClass, "deserialize"); method.annotate(Override.class); - method._throws(IOException.class); JVar parserParam = method.param(JsonParser.class, "parser"); - method.param(DeserializationContext.class, "dctx"); - filler.accept(method, parserParam); + JVar ctxParam = method.param(DeserializationContext.class, "dctx"); + filler.accept(method, parserParam, ctxParam); } private static JDefinedClass createClass( @@ -110,7 +107,7 @@ public static JDefinedClass generateDeserializer( GeneratorUtils.fillDeserializer( definedClass, relatedClass, - (method, parserParam) -> { + (method, parserParam, ctxParam) -> { JBlock body = method.body(); body._return( @@ -119,6 +116,7 @@ public static JDefinedClass generateDeserializer( .ref(DeserializeHelper.class) .staticInvoke("deserializeOneOf") .arg(parserParam) + .arg(ctxParam) .arg(relatedClass.dotclass()) .arg(list(definedClass, oneOfTypes))); }); @@ -132,7 +130,7 @@ public static JDefinedClass generateDeserializer( GeneratorUtils.fillDeserializer( definedClass, relatedClass, - (method, parserParam) -> + (method, parserParam, ctxParam) -> method .body() ._return( @@ -141,6 +139,7 @@ public static JDefinedClass generateDeserializer( .ref(DeserializeHelper.class) .staticInvoke("deserializeItem") .arg(parserParam) + .arg(ctxParam) .arg(relatedClass.dotclass()) .arg(((JClass) propertyType).dotclass()))); return definedClass; @@ -156,7 +155,7 @@ public static JDefinedClass generateSerializer( (method, valueParam, genParam) -> { JBlock body = method.body(); body.invoke(genParam, "writeStartObject"); - body.invoke(genParam, "writeObjectField") + body.invoke(genParam, "writePOJOProperty") .arg(valueParam.invoke(keyMethod)) .arg(valueParam.invoke(valueMethod)); body.invoke(genParam, "writeEndObject"); diff --git a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/JacksonMixInPojo.java b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/JacksonMixInPojo.java index 4ede3fb98..29f059805 100644 --- a/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/JacksonMixInPojo.java +++ b/generators/jackson/src/main/java/org/openworkflow/sdk/generator/jackson/JacksonMixInPojo.java @@ -22,10 +22,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.databind.Module.SetupContext; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.module.SimpleModule; import com.sun.codemodel.JClass; import com.sun.codemodel.JClassAlreadyExistsException; import com.sun.codemodel.JCodeModel; @@ -66,6 +62,10 @@ import org.openworkflow.sdk.annotations.ItemKey; import org.openworkflow.sdk.annotations.ItemValue; import org.openworkflow.sdk.generator.graalvm.ReflectNativeFileHandler; +import tools.jackson.databind.JacksonModule.SetupContext; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.module.SimpleModule; @Mojo( name = "generate", diff --git a/generators/types/pom.xml b/generators/types/pom.xml index df636b2b7..fa23f1bb2 100644 --- a/generators/types/pom.xml +++ b/generators/types/pom.xml @@ -15,6 +15,6 @@ org.openworkflow.sdk openworkflow-annotations - + \ No newline at end of file diff --git a/impl/container/pom.xml b/impl/container/pom.xml index b2b4bf384..059f57fcc 100644 --- a/impl/container/pom.xml +++ b/impl/container/pom.xml @@ -26,5 +26,37 @@ com.github.docker-java docker-java-transport-httpclient5 + + org.junit.jupiter + junit-jupiter-engine + + + org.junit.jupiter + junit-jupiter-params + + + org.openworkflow.sdk + openworkflow-api + test + + + org.openworkflow.sdk + openworkflow-impl-jackson + test + + + org.assertj + assertj-core + + + org.slf4j + slf4j-simple + test + + + org.awaitility + awaitility + + \ No newline at end of file diff --git a/impl/container/src/main/java/org/openworkflow/sdk/impl/container/executors/ContainerRunner.java b/impl/container/src/main/java/org/openworkflow/sdk/impl/container/executors/ContainerRunner.java index c4d706c9e..fb5f0c0b7 100644 --- a/impl/container/src/main/java/org/openworkflow/sdk/impl/container/executors/ContainerRunner.java +++ b/impl/container/src/main/java/org/openworkflow/sdk/impl/container/executors/ContainerRunner.java @@ -15,14 +15,12 @@ */ package org.openworkflow.sdk.impl.container.executors; -import static org.openworkflow.sdk.api.types.ContainerLifetime.*; import static org.openworkflow.sdk.impl.WorkflowUtils.isValid; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.WaitContainerResultCallback; -import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientImpl; @@ -58,7 +56,7 @@ public ContainerRunner( String containerImage) { this.propertySetters = propertySetters; this.timeout = timeout; - this.policy = policy; + this.policy = policy == null ? ContainerCleanupPolicy.NEVER : policy; this.containerImage = containerImage; } @@ -133,20 +131,19 @@ private Integer waitAccordingToLifetime( DockerClient dockerClient) throws IOException { try (var cb = dockerClient.waitContainerCmd(id).exec(new WaitContainerResultCallback())) { - if (policy == ContainerCleanupPolicy.EVENTUALLY) { - Duration timeout = - this.timeout - .map(t -> t.apply(workflowContext, taskContext, input)) - .orElse(Duration.ZERO); - try { - Integer exit = cb.awaitStatusCode(timeout.toMillis(), TimeUnit.MILLISECONDS); - safeStop(id, dockerClient); - return exit; - } catch (DockerClientException timeoutOrOther) { + try { + return policy != ContainerCleanupPolicy.EVENTUALLY + ? cb.awaitStatusCode() + : cb.awaitStatusCode( + this.timeout + .map(t -> t.apply(workflowContext, taskContext, input)) + .orElse(Duration.ZERO) + .toMillis(), + TimeUnit.MILLISECONDS); + } finally { + if (policy != ContainerCleanupPolicy.NEVER) { safeStop(id, dockerClient); } - } else { - return cb.awaitStatusCode(); } } catch (NotFoundException e) { // container already removed diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java b/impl/container/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java similarity index 55% rename from impl/test/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java rename to impl/container/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java index 83d6b6f67..a086eef35 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java +++ b/impl/container/src/test/java/org/openworkflow/sdk/impl/test/ContainerTest.java @@ -15,6 +15,7 @@ */ package org.openworkflow.sdk.impl.test; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -22,6 +23,7 @@ import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.ExposedPort; @@ -29,13 +31,13 @@ import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientImpl; -import com.github.dockerjava.core.command.LogContainerResultCallback; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.Duration; import java.util.Arrays; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -51,18 +53,28 @@ public class ContainerTest { private static DockerClient dockerClient; private static Logger logger = LoggerFactory.getLogger(ContainerTest.class); - { - DefaultDockerClientConfig defaultConfig = - DefaultDockerClientConfig.createDefaultConfigBuilder().build(); - dockerClient = - DockerClientImpl.getInstance( - defaultConfig, - new ApacheDockerHttpClient.Builder().dockerHost(defaultConfig.getDockerHost()).build()); + private static void removeContainer(String containerName) { + findContainerIdByName(containerName) + .ifPresent(id -> dockerClient.removeContainerCmd(id).withForce(true).exec()); + } + + private static void initDockerClient() { + if (dockerClient == null) { + DefaultDockerClientConfig defaultConfig = + DefaultDockerClientConfig.createDefaultConfigBuilder().build(); + dockerClient = + DockerClientImpl.getInstance( + defaultConfig, + new ApacheDockerHttpClient.Builder() + .dockerHost(defaultConfig.getDockerHost()) + .build()); + } } @SuppressWarnings("unused") private static boolean isDockerNotAvailable() { try { + initDockerClient(); dockerClient.pingCmd().exec(); return false; } catch (Exception ex) { @@ -76,6 +88,7 @@ private static boolean isDockerNotAvailable() { @BeforeAll static void init() { app = WorkflowApplication.builder().build(); + initDockerClient(); } @AfterAll @@ -85,23 +98,22 @@ static void cleanup() throws IOException { @Test public void testContainer() throws IOException, InterruptedException { - Workflow workflow = - readWorkflowFromClasspath("workflows-samples/container/container-test-command.yaml"); + Workflow workflow = readWorkflowFromClasspath("workflows-samples/container-test-command.yaml"); String containerName = "hello-world"; + try { Map result = app.workflowDefinition(workflow).instance(Map.of()).start().join().asMap().orElseThrow(); - String containerId = findContainerIdByName(containerName); ByteArrayOutputStream output = new ByteArrayOutputStream(); dockerClient - .logContainerCmd(containerId) + .logContainerCmd(findContainerIdByName(containerName).orElseThrow()) .withStdOut(true) .withStdErr(true) .withTimestamps(true) .exec( - new LogContainerResultCallback() { + new ResultCallback.Adapter<>() { @Override public void onNext(Frame frame) { output.writeBytes(frame.getPayload()); @@ -112,13 +124,13 @@ public void onNext(Frame frame) { assertTrue(output.toString().contains("Hello World")); assertNotNull(result); } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); + removeContainer(containerName); } } @Test public void testContainerEnv() throws IOException, InterruptedException { - Workflow workflow = readWorkflowFromClasspath("workflows-samples/container/container-env.yaml"); + Workflow workflow = readWorkflowFromClasspath("workflows-samples/container-env.yaml"); String containerName = "hello-world-envs"; Map input = Map.of("someValue", "Tested"); @@ -130,12 +142,12 @@ public void testContainerEnv() throws IOException, InterruptedException { ByteArrayOutputStream output = new ByteArrayOutputStream(); dockerClient - .logContainerCmd(findContainerIdByName(containerName)) + .logContainerCmd(findContainerIdByName(containerName).orElseThrow()) .withStdOut(true) .withStdErr(true) .withTimestamps(true) .exec( - new LogContainerResultCallback() { + new ResultCallback.Adapter() { @Override public void onNext(Frame frame) { output.writeBytes(frame.getPayload()); @@ -146,45 +158,55 @@ public void onNext(Frame frame) { assertTrue(output.toString().contains("FOO=Tested")); assertNotNull(result); } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); + removeContainer(containerName); } } @Test public void testContainerTimeout() throws IOException { String containerName = "hello-world-timeout"; - try { - Workflow workflow = - readWorkflowFromClasspath("workflows-samples/container/container-timeout.yaml"); + Workflow workflow = readWorkflowFromClasspath("workflows-samples/container-timeout.yaml"); + assertThatThrownBy( + () -> + app.workflowDefinition(workflow) + .instance(Map.of()) + .start() + .join() + .asMap() + .orElseThrow()); + assertTrue(isContainerGone(containerName)); + } - Map result = - app.workflowDefinition(workflow).instance(Map.of()).start().join().asMap().orElseThrow(); + @Test + void testPortBindings() throws Exception { + Workflow workflow = readWorkflowFromClasspath("workflows-samples/container-ports.yaml"); + String containerName = "hello-world-ports"; - String containerId = findContainerIdByName(containerName); + app.workflowDefinition(workflow).instance(Map.of()).start(); + await() + .pollInterval(Duration.ofMillis(100)) + .atMost(Duration.ofSeconds(2)) + .until(() -> findContainerIdByName(containerName).isPresent()); - assertTrue(isContainerGone(containerId)); - assertNotNull(result); - } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); - } + String containerId = findContainerIdByName(containerName).orElseThrow(); + InspectContainerResponse inspect = dockerClient.inspectContainerCmd(containerId).exec(); + Map ports = inspect.getNetworkSettings().getPorts().getBindings(); + + assertTrue(ports.containsKey(ExposedPort.tcp(8880))); + assertTrue(ports.containsKey(ExposedPort.tcp(8881))); + assertTrue(ports.containsKey(ExposedPort.tcp(8882))); } @Test public void testContainerCleanup() throws IOException { String containerName = "hello-world-cleanup"; - try { - Workflow workflow = - readWorkflowFromClasspath("workflows-samples/container/container-cleanup.yaml"); + Workflow workflow = readWorkflowFromClasspath("workflows-samples/container-cleanup.yaml"); - Map result = - app.workflowDefinition(workflow).instance(Map.of()).start().join().asMap().orElseThrow(); + Map result = + app.workflowDefinition(workflow).instance(Map.of()).start().join().asMap().orElseThrow(); - String containerId = findContainerIdByName(containerName); - assertTrue(isContainerGone(containerId)); - assertNotNull(result); - } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); - } + assertTrue(isContainerGone(containerName)); + assertNotNull(result); } @Test @@ -192,72 +214,31 @@ public void testContainerCleanupDefault() throws IOException { String containerName = "hello-world-cleanup-default"; try { Workflow workflow = - readWorkflowFromClasspath("workflows-samples/container/container-cleanup-default.yaml"); + readWorkflowFromClasspath("workflows-samples/container-cleanup-default.yaml"); Map result = app.workflowDefinition(workflow).instance(Map.of()).start().join().asMap().orElseThrow(); - String containerId = findContainerIdByName(containerName); - assertFalse(isContainerGone(containerId)); + assertFalse(isContainerGone(containerName)); assertNotNull(result); } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); + removeContainer(containerName); } } - @Test - void testPortBindings() throws Exception { - Workflow workflow = - readWorkflowFromClasspath("workflows-samples/container/container-ports.yaml"); - String containerName = "hello-world-ports"; - - try { - new Thread( - () -> { - app.workflowDefinition(workflow) - .instance(Map.of()) - .start() - .join() - .asMap() - .orElseThrow(); - }) - .start(); - - await() - .pollInterval(Duration.ofSeconds(1)) - .atMost(Duration.ofSeconds(10)) - .until(() -> findContainerIdByName(containerName) != null); - - String containerId = findContainerIdByName(containerName); - InspectContainerResponse inspect = dockerClient.inspectContainerCmd(containerId).exec(); - Map ports = - inspect.getNetworkSettings().getPorts().getBindings(); - - assertTrue(ports.containsKey(ExposedPort.tcp(8880))); - assertTrue(ports.containsKey(ExposedPort.tcp(8881))); - assertTrue(ports.containsKey(ExposedPort.tcp(8882))); - } finally { - dockerClient.removeContainerCmd(findContainerIdByName(containerName)).withForce(true).exec(); - } + private static Optional findContainerIdByName(String containerName) { + return dockerClient.listContainersCmd().withShowAll(true).exec().stream() + .filter(c -> test(c, containerName)) + .map(Container::getId) + .findFirst(); } - private static String findContainerIdByName(String containerName) { - var containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - - return containers.stream() - .filter( - c -> - c.getNames() != null - && Arrays.stream(c.getNames()).anyMatch(n -> n.equals("/" + containerName))) - .map(Container::getId) - .findFirst() - .orElse(null); + private static boolean isContainerGone(String containerName) { + return dockerClient.listContainersCmd().withShowAll(true).exec().stream() + .noneMatch(c -> test(c, containerName)); } - private static boolean isContainerGone(String id) { - if (id == null) { - return true; - } - var containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - return containers.stream().noneMatch(c -> c.getId().startsWith(id)); + private static boolean test(Container c, String containerName) { + return c.getNames() != null + && Arrays.stream(c.getNames()).anyMatch(n -> n.equals("/" + containerName)); } } diff --git a/impl/test/src/test/resources/workflows-samples/container/container-cleanup-default.yaml b/impl/container/src/test/resources/workflows-samples/container-cleanup-default.yaml similarity index 100% rename from impl/test/src/test/resources/workflows-samples/container/container-cleanup-default.yaml rename to impl/container/src/test/resources/workflows-samples/container-cleanup-default.yaml diff --git a/impl/test/src/test/resources/workflows-samples/container/container-cleanup.yaml b/impl/container/src/test/resources/workflows-samples/container-cleanup.yaml similarity index 100% rename from impl/test/src/test/resources/workflows-samples/container/container-cleanup.yaml rename to impl/container/src/test/resources/workflows-samples/container-cleanup.yaml diff --git a/impl/test/src/test/resources/workflows-samples/container/container-env.yaml b/impl/container/src/test/resources/workflows-samples/container-env.yaml similarity index 100% rename from impl/test/src/test/resources/workflows-samples/container/container-env.yaml rename to impl/container/src/test/resources/workflows-samples/container-env.yaml diff --git a/impl/test/src/test/resources/workflows-samples/container/container-ports.yaml b/impl/container/src/test/resources/workflows-samples/container-ports.yaml similarity index 84% rename from impl/test/src/test/resources/workflows-samples/container/container-ports.yaml rename to impl/container/src/test/resources/workflows-samples/container-ports.yaml index 3840b8767..3d4645a15 100644 --- a/impl/test/src/test/resources/workflows-samples/container/container-ports.yaml +++ b/impl/container/src/test/resources/workflows-samples/container-ports.yaml @@ -8,11 +8,11 @@ do: run: container: image: busybox:latest - command: sleep 300 + command: sleep 5 name: hello-world-ports ports: 8880: 8880 8881: 8881 8882: 8882 lifetime: - cleanup: never \ No newline at end of file + cleanup: always \ No newline at end of file diff --git a/impl/test/src/test/resources/workflows-samples/container/container-test-command.yaml b/impl/container/src/test/resources/workflows-samples/container-test-command.yaml similarity index 88% rename from impl/test/src/test/resources/workflows-samples/container/container-test-command.yaml rename to impl/container/src/test/resources/workflows-samples/container-test-command.yaml index 54887ecb5..c3fb1589e 100644 --- a/impl/test/src/test/resources/workflows-samples/container/container-test-command.yaml +++ b/impl/container/src/test/resources/workflows-samples/container-test-command.yaml @@ -7,7 +7,7 @@ do: - runContainer: run: container: - image: busybox:3.20 + image: busybox:latest command: echo Hello World name: hello-world lifetime: diff --git a/impl/test/src/test/resources/workflows-samples/container/container-timeout.yaml b/impl/container/src/test/resources/workflows-samples/container-timeout.yaml similarity index 82% rename from impl/test/src/test/resources/workflows-samples/container/container-timeout.yaml rename to impl/container/src/test/resources/workflows-samples/container-timeout.yaml index 82f18891a..c9f3eb78c 100644 --- a/impl/test/src/test/resources/workflows-samples/container/container-timeout.yaml +++ b/impl/container/src/test/resources/workflows-samples/container-timeout.yaml @@ -8,9 +8,9 @@ do: run: container: image: busybox:latest - command: sleep 300 + command: sleep 1 name: hello-world-timeout lifetime: cleanup: eventually after: - seconds: 1 \ No newline at end of file + milliseconds: 500 \ No newline at end of file diff --git a/impl/http/pom.xml b/impl/http/pom.xml index 9e467b4e5..d27dcafb4 100644 --- a/impl/http/pom.xml +++ b/impl/http/pom.xml @@ -39,7 +39,7 @@ org.glassfish.jersey.media - jersey-media-json-jackson + jersey-media-json-jackson3 test diff --git a/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpression.java b/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpression.java index 82b8ab7f8..e45c49790 100644 --- a/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpression.java +++ b/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpression.java @@ -17,8 +17,6 @@ import static org.openworkflow.sdk.impl.jackson.JsonUtils.modelToJson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import java.util.Map; import java.util.function.Supplier; import net.thisptr.jackson.jq.Output; @@ -37,6 +35,8 @@ import org.openworkflow.sdk.impl.expressions.WorkflowDescriptor; import org.openworkflow.sdk.impl.jackson.FunctionJsonNode; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; public class JQExpression implements ObjectExpression { diff --git a/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpressionFactory.java b/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpressionFactory.java index be628a846..d27c55999 100644 --- a/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpressionFactory.java +++ b/impl/jq/src/main/java/org/openworkflow/sdk/impl/expressions/jq/JQExpressionFactory.java @@ -16,7 +16,7 @@ package org.openworkflow.sdk.impl.expressions.jq; import io.cloudevents.CloudEventData; -import io.cloudevents.jackson.JsonCloudEventData; +import io.cloudevents.jackson3.JsonCloudEventData; import java.time.OffsetDateTime; import java.util.Collection; import java.util.Map; diff --git a/impl/json-utils/pom.xml b/impl/json-utils/pom.xml index eba1b1334..4ed31afe1 100644 --- a/impl/json-utils/pom.xml +++ b/impl/json-utils/pom.xml @@ -9,7 +9,7 @@ Open Workflow :: Impl :: Json utils - com.fasterxml.jackson.core + tools.jackson.core jackson-databind @@ -18,11 +18,7 @@ io.cloudevents - cloudevents-json-jackson - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 + cloudevents-json-jackson3 org.junit.jupiter diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionBaseJsonNode.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionBaseJsonNode.java index 7d0083c9b..1587b17fd 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionBaseJsonNode.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionBaseJsonNode.java @@ -15,17 +15,16 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonPointer; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.jsontype.TypeSerializer; -import com.fasterxml.jackson.databind.node.BaseJsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.fasterxml.jackson.databind.node.MissingNode; -import java.io.IOException; import java.util.List; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.JsonPointer; +import tools.jackson.core.JsonToken; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.jsontype.TypeSerializer; +import tools.jackson.databind.node.BaseJsonNode; +import tools.jackson.databind.node.JsonNodeType; +import tools.jackson.databind.node.MissingNode; public class FunctionBaseJsonNode extends BaseJsonNode { @@ -42,8 +41,8 @@ public boolean isObject() { } @Override - public T deepCopy() { - return (T) this; + public FunctionBaseJsonNode deepCopy() { + return this; } @Override @@ -72,8 +71,8 @@ public JsonNodeType getNodeType() { } @Override - public String asText() { - return null; + public String _valueDesc() { + return "FunctionNode"; } @Override @@ -98,8 +97,8 @@ public List findValues(String fieldName, List foundSoFar) { } @Override - public List findValuesAsText(String fieldName, List foundSoFar) { - foundSoFar.add(findValue(fieldName).asText()); + public List findValuesAsString(String fieldName, List foundSoFar) { + foundSoFar.add(findValue(fieldName).asString()); return foundSoFar; } @@ -120,13 +119,13 @@ public int hashCode() { } @Override - public void serialize(JsonGenerator jgen, SerializerProvider provider) throws IOException { + public void serialize(JsonGenerator jgen, SerializationContext provider) { // not serialize } @Override public void serializeWithType( - JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer) throws IOException { + JsonGenerator jgen, SerializationContext provider, TypeSerializer typeSer) { // not serialize } } diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionJsonNode.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionJsonNode.java index 5cb800a48..14dbd9c7f 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionJsonNode.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/FunctionJsonNode.java @@ -15,8 +15,8 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.databind.JsonNode; import java.util.function.Function; +import tools.jackson.databind.JsonNode; public class FunctionJsonNode extends FunctionBaseJsonNode { diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtils.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtils.java index 7d7a5aa9e..8e966f665 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtils.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtils.java @@ -15,18 +15,16 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.POJONode; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventData; -import io.cloudevents.jackson.JsonCloudEventData; -import java.io.IOException; -import java.io.UncheckedIOException; +import io.cloudevents.jackson3.JsonCloudEventData; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.Date; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.POJONode; public class JacksonCloudEventUtils { @@ -49,13 +47,9 @@ public static JsonNode toJsonNode(CloudEventData data) { if (data == null) { return NullNode.instance; } - try { - return data instanceof JsonCloudEventData - ? ((JsonCloudEventData) data).getNode() - : JsonUtils.mapper().readTree(data.toBytes()); - } catch (IOException io) { - throw new UncheckedIOException(io); - } + return data instanceof JsonCloudEventData jsonData + ? jsonData.getNode() + : JsonUtils.mapper().readTree(data.toBytes()); } public static CloudEvent toCloudEvent(JsonNode node) { diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JsonUtils.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JsonUtils.java index 0da058750..a575d851b 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JsonUtils.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/JsonUtils.java @@ -15,25 +15,8 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.BigIntegerNode; -import com.fasterxml.jackson.databind.node.BinaryNode; -import com.fasterxml.jackson.databind.node.BooleanNode; -import com.fasterxml.jackson.databind.node.DecimalNode; -import com.fasterxml.jackson.databind.node.DoubleNode; -import com.fasterxml.jackson.databind.node.FloatNode; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.LongNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.ShortNode; -import com.fasterxml.jackson.databind.node.TextNode; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventData; -import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.time.Instant; @@ -53,6 +36,22 @@ import java.util.function.Supplier; import java.util.stream.Collector; import org.openworkflow.sdk.impl.WorkflowModel; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.BigIntegerNode; +import tools.jackson.databind.node.BinaryNode; +import tools.jackson.databind.node.BooleanNode; +import tools.jackson.databind.node.DecimalNode; +import tools.jackson.databind.node.DoubleNode; +import tools.jackson.databind.node.FloatNode; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.LongNode; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.ShortNode; +import tools.jackson.databind.node.StringNode; public class JsonUtils { @@ -153,11 +152,11 @@ public static JsonNode fromString(String value) { if (trimmedValue.startsWith("{") && trimmedValue.endsWith("}")) { try { return mapper().readTree(trimmedValue); - } catch (IOException ex) { - // ignore and return test node + } catch (JacksonException ex) { + // ignore and return string node } } - return new TextNode(value); + return new StringNode(value); } private static Object toJavaValue(ObjectNode node) { @@ -201,7 +200,7 @@ public static T convertValue(JsonNode jsonNode, Class returnType) { } else if (Long.class.isAssignableFrom(returnType)) { obj = jsonNode.asLong(); } else if (String.class.isAssignableFrom(returnType)) { - obj = jsonNode.asText(); + obj = jsonNode.asString(); } else if (CloudEvent.class.isAssignableFrom(returnType)) { obj = JacksonCloudEventUtils.toCloudEvent(jsonNode); } else if (CloudEventData.class.isAssignableFrom(returnType)) { @@ -253,8 +252,8 @@ private static Object internalToJavaValue( Function arrayFunction) { if (jsonNode.isNull()) { return null; - } else if (jsonNode.isTextual()) { - return jsonNode.asText(); + } else if (jsonNode.isString()) { + return jsonNode.asString(); } else if (jsonNode.isBoolean()) { return jsonNode.asBoolean(); } else if (jsonNode.isInt()) { @@ -272,7 +271,7 @@ private static Object internalToJavaValue( } } - public static String toString(JsonNode node) throws JsonProcessingException { + public static String toString(JsonNode node) { return mapper().writeValueAsString(node); } @@ -308,8 +307,8 @@ public static ArrayNode array() { } public static Optional toDate(JsonNode node) { - if (node.isTextual()) { - return Optional.of(OffsetDateTime.parse(node.asText())); + if (node.isString()) { + return Optional.of(OffsetDateTime.parse(node.asString())); } else if (node.isNumber()) { return Optional.of( OffsetDateTime.ofInstant(Instant.ofEpochMilli(node.asLong()), ZoneOffset.UTC)); diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/MergeUtils.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/MergeUtils.java index 9f9d1fc8b..f158e7fdc 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/MergeUtils.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/MergeUtils.java @@ -15,12 +15,12 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.HashSet; import java.util.Map; import java.util.Set; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; public class MergeUtils { /** diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactory.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactory.java index 04c742d5f..f29d8292b 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactory.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactory.java @@ -15,8 +15,8 @@ */ package org.openworkflow.sdk.impl.jackson; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.function.Supplier; import org.openworkflow.sdk.impl.ServicePriority; +import tools.jackson.databind.ObjectMapper; public interface ObjectMapperFactory extends Supplier, ServicePriority {} diff --git a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactoryProvider.java b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactoryProvider.java index 40c4de571..4390e2386 100644 --- a/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactoryProvider.java +++ b/impl/json-utils/src/main/java/org/openworkflow/sdk/impl/jackson/ObjectMapperFactoryProvider.java @@ -17,12 +17,13 @@ import static org.openworkflow.sdk.impl.WorkflowUtils.loadFirst; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import io.cloudevents.jackson.JsonFormat; +import io.cloudevents.jackson3.JsonFormat; import java.util.Objects; import java.util.function.Supplier; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; public class ObjectMapperFactoryProvider implements Supplier { @@ -60,12 +61,13 @@ private static class DefaultObjectMapperFactory implements ObjectMapperFactory { DefaultObjectMapperFactory() { this.mapper = - new ObjectMapper() - .findAndRegisterModules() - .registerModule(JsonFormat.getCloudEventJacksonModule()) + JsonMapper.builder() + .addModule(JsonFormat.getCloudEventJacksonModule()) + .findAndAddModules() .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .disable(DateTimeFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE) + .build(); } @Override diff --git a/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtilsTest.java b/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtilsTest.java index 4bdef169b..f234b79e4 100644 --- a/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtilsTest.java +++ b/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JacksonCloudEventUtilsTest.java @@ -20,15 +20,15 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.fasterxml.jackson.databind.JsonNode; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventData; import io.cloudevents.core.builder.CloudEventBuilder; import io.cloudevents.core.data.BytesCloudEventData; -import io.cloudevents.jackson.JsonCloudEventData; +import io.cloudevents.jackson3.JsonCloudEventData; import java.net.URI; import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Test; +import tools.jackson.databind.JsonNode; public class JacksonCloudEventUtilsTest { @@ -55,12 +55,12 @@ public void testCloudEventSerializationNullData() { assertNotNull(node); assertTrue(node.has("specversion"), "Missing mandatory specversion attribute"); - assertEquals("1.0", node.get("specversion").asText()); + assertEquals("1.0", node.get("specversion").asString()); assertFalse(node.has("specVersion"), "Jackson POJO serializer mangled the envelope!"); - assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asText()); - assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asText()); + assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asString()); + assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asString()); assertFalse(node.has("data")); } @@ -73,15 +73,15 @@ public void testCloudEventSerialization() { assertNotNull(node); assertTrue(node.has("specversion"), "Missing mandatory specversion attribute"); - assertEquals("1.0", node.get("specversion").asText()); + assertEquals("1.0", node.get("specversion").asString()); assertFalse(node.has("specVersion"), "Jackson POJO serializer mangled the envelope!"); - assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asText()); - assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asText()); + assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asString()); + assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asString()); assertTrue(node.has("data")); - assertEquals("NEEDS_REVISION", node.get("data").get("status").asText()); + assertEquals("NEEDS_REVISION", node.get("data").get("status").asString()); } @Test @@ -97,15 +97,15 @@ public void testCloudEventSerializationJson() { assertNotNull(node); assertTrue(node.has("specversion"), "Missing mandatory specversion attribute"); - assertEquals("1.0", node.get("specversion").asText()); + assertEquals("1.0", node.get("specversion").asString()); assertFalse(node.has("specVersion"), "Jackson POJO serializer mangled the envelope!"); - assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asText()); - assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asText()); + assertEquals("5dc4698e-5f98-470e-bb76-04218fe2dd0f", node.get("id").asString()); + assertEquals("01KMRBFA19GZYW3XY895Z4SNCK", node.get("flowinstanceid").asString()); assertTrue(node.has("data")); - assertEquals("NEEDS_REVISION", node.get("data").get("status").asText()); + assertEquals("NEEDS_REVISION", node.get("data").get("status").asString()); } @Test @@ -130,7 +130,7 @@ public void testCloudEventDataRoundTrip() { JsonNode dataNode = JacksonCloudEventUtils.toJsonNode(originalData); assertNotNull(dataNode); - assertEquals("Bullish Market Update", dataNode.get("draft").asText()); + assertEquals("Bullish Market Update", dataNode.get("draft").asString()); CloudEventData restoredData = JacksonCloudEventUtils.toCloudEventData(dataNode); assertNotNull(restoredData); diff --git a/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JsonUtilsStaticInitTest.java b/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JsonUtilsStaticInitTest.java index ecd8b950f..c3f0f06c0 100644 --- a/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JsonUtilsStaticInitTest.java +++ b/impl/json-utils/src/test/java/org/openworkflow/sdk/impl/jackson/JsonUtilsStaticInitTest.java @@ -18,10 +18,10 @@ import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertSame; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import tools.jackson.databind.ObjectMapper; public class JsonUtilsStaticInitTest { diff --git a/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/jackson/JacksonModelConverterFactory.java b/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/jackson/JacksonModelConverterFactory.java index 8b77e5a5d..072cd5ae9 100644 --- a/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/jackson/JacksonModelConverterFactory.java +++ b/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/jackson/JacksonModelConverterFactory.java @@ -15,12 +15,12 @@ */ package org.openworkflow.sdk.impl.executors.http.jackson; -import com.fasterxml.jackson.databind.JsonNode; import org.openworkflow.sdk.impl.TaskContextData; import org.openworkflow.sdk.impl.WorkflowContextData; import org.openworkflow.sdk.impl.additional.NamedWorkflowAdditionalObject; import org.openworkflow.sdk.impl.executors.http.HttpConverterResolver; import org.openworkflow.sdk.impl.executors.http.HttpModelConverter; +import tools.jackson.databind.JsonNode; public class JacksonModelConverterFactory implements NamedWorkflowAdditionalObject { diff --git a/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/oauth/jackson/JacksonJWTConverter.java b/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/oauth/jackson/JacksonJWTConverter.java index bdd0b0db0..edaff4f29 100644 --- a/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/oauth/jackson/JacksonJWTConverter.java +++ b/impl/jwt-impl/src/main/java/org/openworkflow/sdk/impl/executors/http/oauth/jackson/JacksonJWTConverter.java @@ -15,14 +15,14 @@ */ package org.openworkflow.sdk.impl.executors.http.oauth.jackson; -import com.fasterxml.jackson.core.type.TypeReference; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Map; import org.openworkflow.sdk.impl.auth.JWT; import org.openworkflow.sdk.impl.auth.JWTConverter; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; public class JacksonJWTConverter implements JWTConverter { @@ -43,7 +43,7 @@ private static final Map fromPart2Map(String part) { String decoded = new String(Base64.getUrlDecoder().decode(part), StandardCharsets.UTF_8); try { return JsonUtils.mapper().readValue(decoded, new TypeReference>() {}); - } catch (IOException e) { + } catch (JacksonException e) { throw new IllegalArgumentException( "Invalid JTW token format. " + decoded + " is not a valid json", e); } diff --git a/impl/lifecycleevent/src/main/java/org/openworkflow/sdk/impl/jackson/events/JacksonLifeCyclePublisher.java b/impl/lifecycleevent/src/main/java/org/openworkflow/sdk/impl/jackson/events/JacksonLifeCyclePublisher.java index 76e509231..7799bb1dd 100644 --- a/impl/lifecycleevent/src/main/java/org/openworkflow/sdk/impl/jackson/events/JacksonLifeCyclePublisher.java +++ b/impl/lifecycleevent/src/main/java/org/openworkflow/sdk/impl/jackson/events/JacksonLifeCyclePublisher.java @@ -15,8 +15,6 @@ */ package org.openworkflow.sdk.impl.jackson.events; -import com.fasterxml.jackson.core.JsonProcessingException; -import java.io.UncheckedIOException; import org.openworkflow.sdk.impl.jackson.JsonUtils; import org.openworkflow.sdk.impl.lifecycle.ce.AbstractLifeCyclePublisher; @@ -24,10 +22,6 @@ public class JacksonLifeCyclePublisher extends AbstractLifeCyclePublisher { @Override protected byte[] convertToBytes(T data) { - try { - return JsonUtils.mapper().writeValueAsBytes(data); - } catch (JsonProcessingException e) { - throw new UncheckedIOException(e); - } + return JsonUtils.mapper().writeValueAsBytes(data); } } diff --git a/impl/model/pom.xml b/impl/model/pom.xml index 653bf9234..3a7143b6f 100644 --- a/impl/model/pom.xml +++ b/impl/model/pom.xml @@ -8,6 +8,10 @@ openworkflow-impl-model Open Workflow :: Impl :: Model + + tools.jackson.core + jackson-databind + org.openworkflow.sdk openworkflow-impl-json diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/AbstractJacksonMarshaller.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/AbstractJacksonMarshaller.java index d917d81fd..73fd6f5de 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/AbstractJacksonMarshaller.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/AbstractJacksonMarshaller.java @@ -15,9 +15,6 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JsonProcessingException; -import java.io.IOException; -import java.io.UncheckedIOException; import org.openworkflow.sdk.impl.jackson.JsonUtils; import org.openworkflow.sdk.impl.marshaller.CustomObjectMarshaller; import org.openworkflow.sdk.impl.marshaller.WorkflowInputBuffer; @@ -27,19 +24,11 @@ public abstract class AbstractJacksonMarshaller implements CustomObjectMarsha @Override public void write(WorkflowOutputBuffer buffer, T object) { - try { - buffer.writeBytes(JsonUtils.mapper().writeValueAsBytes(object)); - } catch (JsonProcessingException e) { - throw new UncheckedIOException(e); - } + buffer.writeBytes(JsonUtils.mapper().writeValueAsBytes(object)); } @Override public T read(WorkflowInputBuffer buffer, Class clazz) { - try { - return JsonUtils.mapper().readValue(buffer.readBytes(), clazz); - } catch (IOException e) { - throw new UncheckedIOException(e); - } + return JsonUtils.mapper().readValue(buffer.readBytes(), clazz); } } diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModel.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModel.java index 2e50de1a9..f187cbf38 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModel.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModel.java @@ -16,12 +16,6 @@ package org.openworkflow.sdk.impl.model.jackson; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.BooleanNode; -import com.fasterxml.jackson.databind.node.NullNode; import java.math.BigDecimal; import java.math.BigInteger; import java.time.OffsetDateTime; @@ -33,6 +27,12 @@ import org.openworkflow.sdk.impl.AbstractWorkflowModel; import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.BooleanNode; +import tools.jackson.databind.node.NullNode; @JsonSerialize(using = JacksonModelSerializer.class) @JsonDeserialize(using = JacksonModelDeserializer.class) @@ -66,7 +66,7 @@ public Collection asCollection() { @Override public Optional asText() { - return node.isTextual() ? Optional.of(node.asText()) : Optional.of(node.toString()); + return node.isString() ? Optional.of(node.asString()) : Optional.of(node.toString()); } @Override diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollection.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollection.java index 6932c37ef..a0e7becf9 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollection.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollection.java @@ -15,10 +15,6 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.ArrayNode; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -29,6 +25,10 @@ import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.WorkflowModelCollection; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.node.ArrayNode; @JsonSerialize(using = JacksonModelCollectionSerializer.class) @JsonDeserialize(using = JacksonModelCollectionDeserializer.class) diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionDeserializer.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionDeserializer.java index ce2a604bc..a5e2f346e 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionDeserializer.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionDeserializer.java @@ -15,11 +15,9 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import java.io.IOException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.std.StdDeserializer; public class JacksonModelCollectionDeserializer extends StdDeserializer { @@ -30,8 +28,7 @@ protected JacksonModelCollectionDeserializer() { } @Override - public JacksonModelCollection deserialize(JsonParser p, DeserializationContext ctxt) - throws IOException, JacksonException { + public JacksonModelCollection deserialize(JsonParser p, DeserializationContext ctxt) { return new JacksonModelCollection(p.readValueAsTree()); } } diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionSerializer.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionSerializer.java index 5dd6229c1..c7ae4542e 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionSerializer.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelCollectionSerializer.java @@ -15,10 +15,9 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import java.io.IOException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ser.std.StdSerializer; public class JacksonModelCollectionSerializer extends StdSerializer { @@ -30,8 +29,7 @@ protected JacksonModelCollectionSerializer() { @Override public void serialize( - JacksonModelCollection value, JsonGenerator gen, SerializerProvider provider) - throws IOException { + JacksonModelCollection value, JsonGenerator gen, SerializationContext provider) { gen.writeTree(value.node); } } diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelDeserializer.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelDeserializer.java index 8efa252b7..e4a795207 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelDeserializer.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelDeserializer.java @@ -15,11 +15,9 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import java.io.IOException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.std.StdDeserializer; public class JacksonModelDeserializer extends StdDeserializer { @@ -30,8 +28,7 @@ protected JacksonModelDeserializer() { } @Override - public JacksonModel deserialize(JsonParser p, DeserializationContext ctxt) - throws IOException, JacksonException { + public JacksonModel deserialize(JsonParser p, DeserializationContext ctxt) { return new JacksonModel(p.readValueAsTree()); } } diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelFactory.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelFactory.java index 6cb69ad6d..4dead466d 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelFactory.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelFactory.java @@ -15,14 +15,6 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.DoubleNode; -import com.fasterxml.jackson.databind.node.FloatNode; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.LongNode; -import com.fasterxml.jackson.databind.node.ShortNode; -import com.fasterxml.jackson.databind.node.TextNode; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventData; import java.math.BigDecimal; @@ -33,6 +25,14 @@ import org.openworkflow.sdk.impl.WorkflowModelFactory; import org.openworkflow.sdk.impl.jackson.JacksonCloudEventUtils; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.DoubleNode; +import tools.jackson.databind.node.FloatNode; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.LongNode; +import tools.jackson.databind.node.ShortNode; +import tools.jackson.databind.node.StringNode; public class JacksonModelFactory implements WorkflowModelFactory { @@ -89,8 +89,8 @@ public WorkflowModel from(Number number) { public WorkflowModel from(String value) { try { return new JacksonModel(JsonUtils.mapper().readTree(value)); - } catch (JsonProcessingException ex) { - return new JacksonModel(new TextNode(value)); + } catch (JacksonException ex) { + return new JacksonModel(new StringNode(value)); } } @@ -106,7 +106,7 @@ public WorkflowModel from(CloudEventData ce) { @Override public WorkflowModel from(OffsetDateTime value) { - return new JacksonModel(JsonUtils.fromValue(new TextNode(value.toString()))); + return new JacksonModel(JsonUtils.fromValue(new StringNode(value.toString()))); } @Override diff --git a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelSerializer.java b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelSerializer.java index b657337aa..dc113d112 100644 --- a/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelSerializer.java +++ b/impl/model/src/main/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelSerializer.java @@ -15,10 +15,9 @@ */ package org.openworkflow.sdk.impl.model.jackson; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import java.io.IOException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ser.std.StdSerializer; public class JacksonModelSerializer extends StdSerializer { @@ -29,8 +28,7 @@ protected JacksonModelSerializer() { } @Override - public void serialize(JacksonModel value, JsonGenerator gen, SerializerProvider provider) - throws IOException { + public void serialize(JacksonModel value, JsonGenerator gen, SerializationContext provider) { gen.writeTree(value.node); } } diff --git a/impl/model/src/test/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelTest.java b/impl/model/src/test/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelTest.java index a96ce7217..48da37dde 100644 --- a/impl/model/src/test/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelTest.java +++ b/impl/model/src/test/java/org/openworkflow/sdk/impl/model/jackson/JacksonModelTest.java @@ -17,7 +17,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.databind.JsonNode; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; @@ -26,6 +25,7 @@ import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.WorkflowModelFactory; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; public class JacksonModelTest { diff --git a/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIMixInModule.java b/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIMixInModule.java index eab250c67..13fcfb662 100644 --- a/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIMixInModule.java +++ b/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIMixInModule.java @@ -15,8 +15,8 @@ */ package org.openworkflow.sdk.impl.executors.openapi.jackson; -import com.fasterxml.jackson.databind.module.SimpleModule; import org.openworkflow.sdk.impl.executors.openapi.UnifiedOpenAPI; +import tools.jackson.databind.module.SimpleModule; public class JacksonUnifiedOpenAPIMixInModule extends SimpleModule { diff --git a/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIReader.java b/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIReader.java index 0c9e061ed..39167ff99 100644 --- a/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIReader.java +++ b/impl/openapi-jackson/src/main/java/org/openworkflow/sdk/impl/executors/openapi/jackson/JacksonUnifiedOpenAPIReader.java @@ -15,13 +15,13 @@ */ package org.openworkflow.sdk.impl.executors.openapi.jackson; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; import org.openworkflow.sdk.api.WorkflowFormat; import org.openworkflow.sdk.impl.executors.openapi.UnifiedOpenAPI; import org.openworkflow.sdk.impl.executors.openapi.UnifiedOpenAPIReader; import org.openworkflow.sdk.impl.resources.ExternalResourceHandler; +import tools.jackson.databind.ObjectMapper; public class JacksonUnifiedOpenAPIReader implements UnifiedOpenAPIReader { diff --git a/impl/openapi-jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module b/impl/openapi-jackson/src/main/resources/META-INF/services/tools.jackson.databind.JacksonModule similarity index 100% rename from impl/openapi-jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module rename to impl/openapi-jackson/src/main/resources/META-INF/services/tools.jackson.databind.JacksonModule diff --git a/impl/openapi/src/test/java/org/openworkflow/sdk/impl/executors/openapi/OpenAPIProcessorTest.java b/impl/openapi/src/test/java/org/openworkflow/sdk/impl/executors/openapi/OpenAPIProcessorTest.java index c7d5d3aa7..34939c315 100644 --- a/impl/openapi/src/test/java/org/openworkflow/sdk/impl/executors/openapi/OpenAPIProcessorTest.java +++ b/impl/openapi/src/test/java/org/openworkflow/sdk/impl/executors/openapi/OpenAPIProcessorTest.java @@ -45,11 +45,15 @@ public void testGetPetById(UnifiedOpenAPI json) { assertEquals("GET", definition.getMethod()); assertEquals("/pet/{petId}", definition.getPath()); assertTrue(checkServer(definition.getServers(), "https://petstore.swagger.io/v2")); - assertEquals(1, definition.getParameters().size()); + assertEquals(2, definition.getParameters().size()); ParameterDefinition param = definition.getParameters().get(0); assertEquals("path", param.in()); assertEquals("petId", param.name()); assertTrue(param.required()); + ParameterDefinition optionalParam = definition.getParameters().get(1); + assertEquals("query", optionalParam.in()); + assertEquals("optionalUnused", optionalParam.name()); + assertFalse(optionalParam.required()); } @Test diff --git a/impl/openapi/src/test/resources/schema/openapi/petstore.json b/impl/openapi/src/test/resources/schema/openapi/petstore.json index 3da786fe2..837bacc6f 100644 --- a/impl/openapi/src/test/resources/schema/openapi/petstore.json +++ b/impl/openapi/src/test/resources/schema/openapi/petstore.json @@ -58,6 +58,11 @@ "type": "integer", "format": "int64" } + }, + { + "name":"optionalUnused", + "in": "query", + "description": "Optional query parameter" } ], "responses": { diff --git a/impl/openapi/src/test/resources/schema/swagger/petstore.json b/impl/openapi/src/test/resources/schema/swagger/petstore.json index e2b8a08e1..e98ceb631 100644 --- a/impl/openapi/src/test/resources/schema/swagger/petstore.json +++ b/impl/openapi/src/test/resources/schema/swagger/petstore.json @@ -63,7 +63,12 @@ "required": true, "type": "integer", "format": "int64" - } + }, + { + "name": "optionalUnused", + "in": "query", + "description": "Optional query parameter" + } ], "responses": { "200": { diff --git a/impl/persistence/tests/src/main/java/org/openworkflow/sdk/impl/persistence/test/AbstractCorrelationPersistenceTest.java b/impl/persistence/tests/src/main/java/org/openworkflow/sdk/impl/persistence/test/AbstractCorrelationPersistenceTest.java index 728a141f6..44dc5cbc4 100644 --- a/impl/persistence/tests/src/main/java/org/openworkflow/sdk/impl/persistence/test/AbstractCorrelationPersistenceTest.java +++ b/impl/persistence/tests/src/main/java/org/openworkflow/sdk/impl/persistence/test/AbstractCorrelationPersistenceTest.java @@ -21,7 +21,7 @@ import io.cloudevents.CloudEvent; import io.cloudevents.core.builder.CloudEventBuilder; -import io.cloudevents.jackson.JsonCloudEventData; +import io.cloudevents.jackson3.JsonCloudEventData; import java.io.IOException; import java.net.URI; import java.time.Duration; diff --git a/impl/pom.xml b/impl/pom.xml index b7808023f..d4ef34023 100644 --- a/impl/pom.xml +++ b/impl/pom.xml @@ -12,7 +12,7 @@ 2.5.252 5.2.4 4.0.0 - 1.6.5 + 2.0.0-alpha1 4.0.3 9.2.1 3.7.1 @@ -158,7 +158,7 @@ org.glassfish.jersey.media - jersey-media-json-jackson + jersey-media-json-jackson3 ${version.org.glassfish.jersey} test diff --git a/impl/test/pom.xml b/impl/test/pom.xml index 771b3f7f6..542b2c3ef 100644 --- a/impl/test/pom.xml +++ b/impl/test/pom.xml @@ -48,16 +48,12 @@ org.glassfish.jersey.media - jersey-media-json-jackson + jersey-media-json-jackson3 org.openworkflow.sdk openworkflow-impl-openapi - - org.openworkflow.sdk - openworkflow-impl-container - org.openworkflow.sdk openworkflow-impl-grpc diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/AccessTokenProvider.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/AccessTokenProvider.java index 389a559d5..fd4ee6bcb 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/AccessTokenProvider.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/AccessTokenProvider.java @@ -15,11 +15,11 @@ */ package org.openworkflow.sdk.impl.test; -import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.Base64; import java.util.Map; +import tools.jackson.databind.ObjectMapper; public class AccessTokenProvider { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CoreTaskTypesTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CoreTaskTypesTest.java index 04608745d..f393c43ff 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CoreTaskTypesTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CoreTaskTypesTest.java @@ -20,8 +20,6 @@ import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; import static org.openworkflow.sdk.fluent.spec.dsl.DSL.*; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import java.io.IOException; import java.net.URI; import java.time.Instant; @@ -44,6 +42,8 @@ import org.openworkflow.sdk.impl.WorkflowInstance; import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; @SuppressWarnings("unchecked") class CoreTaskTypesTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CorrelationTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CorrelationTest.java index 7445f42b1..97121c07c 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CorrelationTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/CorrelationTest.java @@ -22,7 +22,7 @@ import io.cloudevents.CloudEvent; import io.cloudevents.core.builder.CloudEventBuilder; -import io.cloudevents.jackson.JsonCloudEventData; +import io.cloudevents.jackson3.JsonCloudEventData; import java.io.IOException; import java.net.URI; import java.time.Duration; diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/DateTimeDescriptorTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/DateTimeDescriptorTest.java index 1982a803b..b975241fb 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/DateTimeDescriptorTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/DateTimeDescriptorTest.java @@ -17,11 +17,11 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.databind.JsonNode; import java.time.Instant; import org.junit.jupiter.api.Test; import org.openworkflow.sdk.impl.expressions.DateTimeDescriptor; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; class DateTimeDescriptorTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/EventDefinitionTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/EventDefinitionTest.java index 72db5bd60..90ec67abc 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/EventDefinitionTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/EventDefinitionTest.java @@ -17,10 +17,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -39,6 +35,10 @@ import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.WorkflowStatus; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; public class EventDefinitionTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OAuthHTTPWorkflowDefinitionTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OAuthHTTPWorkflowDefinitionTest.java index 5a5702c1f..3af637292 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OAuthHTTPWorkflowDefinitionTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OAuthHTTPWorkflowDefinitionTest.java @@ -21,7 +21,6 @@ import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; import static org.openworkflow.sdk.impl.test.AccessTokenProvider.fakeAccessToken; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; @@ -36,6 +35,7 @@ import org.junit.jupiter.api.Test; import org.openworkflow.sdk.api.types.Workflow; import org.openworkflow.sdk.impl.WorkflowApplication; +import tools.jackson.databind.ObjectMapper; public class OAuthHTTPWorkflowDefinitionTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OpenIDCHTTPWorkflowDefinitionTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OpenIDCHTTPWorkflowDefinitionTest.java index 5c1cf395d..663486aaf 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OpenIDCHTTPWorkflowDefinitionTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/OpenIDCHTTPWorkflowDefinitionTest.java @@ -20,7 +20,6 @@ import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; import static org.openworkflow.sdk.impl.test.AccessTokenProvider.fakeAccessToken; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; import okhttp3.mockwebserver.MockResponse; @@ -33,6 +32,7 @@ import org.junit.jupiter.api.Test; import org.openworkflow.sdk.api.types.Workflow; import org.openworkflow.sdk.impl.WorkflowApplication; +import tools.jackson.databind.ObjectMapper; public class OpenIDCHTTPWorkflowDefinitionTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/RetryTimeoutTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/RetryTimeoutTest.java index a8d0860d4..66c05097e 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/RetryTimeoutTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/RetryTimeoutTest.java @@ -19,7 +19,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; -import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.time.Duration; import java.util.Map; @@ -43,6 +42,7 @@ import org.openworkflow.sdk.impl.lifecycle.TaskEvent; import org.openworkflow.sdk.impl.lifecycle.TaskRetriedEvent; import org.openworkflow.sdk.impl.lifecycle.WorkflowExecutionListener; +import tools.jackson.databind.JsonNode; public class RetryTimeoutTest { diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ScheduleEventConsumerTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ScheduleEventConsumerTest.java index b06050aa9..0e4614f79 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ScheduleEventConsumerTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/ScheduleEventConsumerTest.java @@ -21,7 +21,7 @@ import io.cloudevents.CloudEvent; import io.cloudevents.core.builder.CloudEventBuilder; -import io.cloudevents.jackson.JsonCloudEventData; +import io.cloudevents.jackson3.JsonCloudEventData; import java.io.IOException; import java.net.URI; import java.time.Duration; diff --git a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/WorkflowDefinitionTest.java b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/WorkflowDefinitionTest.java index 8a45eeae6..ac413b136 100644 --- a/impl/test/src/test/java/org/openworkflow/sdk/impl/test/WorkflowDefinitionTest.java +++ b/impl/test/src/test/java/org/openworkflow/sdk/impl/test/WorkflowDefinitionTest.java @@ -20,8 +20,6 @@ import static org.openworkflow.sdk.api.WorkflowReader.readWorkflowFromClasspath; import static org.openworkflow.sdk.api.WorkflowReader.validation; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import java.io.IOException; import java.time.Instant; import java.util.Arrays; @@ -40,6 +38,8 @@ import org.openworkflow.sdk.impl.WorkflowInstance; import org.openworkflow.sdk.impl.WorkflowModel; import org.openworkflow.sdk.impl.jackson.JsonUtils; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; public class WorkflowDefinitionTest { diff --git a/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidator.java b/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidator.java index 2e01b2400..164e3de46 100644 --- a/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidator.java +++ b/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidator.java @@ -15,7 +15,6 @@ */ package org.openworkflow.sdk.impl.jackson.schema; -import com.fasterxml.jackson.databind.JsonNode; import com.networknt.schema.Error; import com.networknt.schema.Schema; import com.networknt.schema.SchemaRegistry; @@ -24,6 +23,7 @@ import java.util.Optional; import java.util.stream.Collectors; import org.openworkflow.sdk.impl.schema.AbstractSchemaValidator; +import tools.jackson.databind.JsonNode; public class JsonSchemaValidator extends AbstractSchemaValidator { diff --git a/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidatorFactory.java b/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidatorFactory.java index e7de1cbe5..f6b3a47ac 100644 --- a/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidatorFactory.java +++ b/impl/validation/src/main/java/org/openworkflow/sdk/impl/jackson/schema/JsonSchemaValidatorFactory.java @@ -15,7 +15,6 @@ */ package org.openworkflow.sdk.impl.jackson.schema; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; @@ -25,6 +24,7 @@ import org.openworkflow.sdk.impl.resources.ExternalResourceHandler; import org.openworkflow.sdk.impl.schema.SchemaValidator; import org.openworkflow.sdk.impl.schema.SchemaValidatorFactory; +import tools.jackson.databind.ObjectMapper; public class JsonSchemaValidatorFactory implements SchemaValidatorFactory { diff --git a/pom.xml b/pom.xml index f8bb332d8..58e952042 100644 --- a/pom.xml +++ b/pom.xml @@ -84,11 +84,11 @@ 4.3.0 4.32.1 - 2.22.3 + 3.0.0 2.22 - 2.0.8 + 3.0.8 5.5.0 - 5.0.0 + 5.1.0 4.8.198 3.1.1 1.5.2 @@ -117,26 +117,26 @@ our required version to it. --> - com.fasterxml.jackson + tools.jackson jackson-bom - ${version.com.fasterxml.jackson} + ${version.tools.jackson} pom import - com.fasterxml.jackson.core + tools.jackson.core jackson-core - ${version.com.fasterxml.jackson} + ${version.tools.jackson} - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - ${version.com.fasterxml.jackson} + ${version.tools.jackson} - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml - ${version.com.fasterxml.jackson} + ${version.tools.jackson} com.fasterxml.jackson.core @@ -150,7 +150,7 @@ io.cloudevents - cloudevents-json-jackson + cloudevents-json-jackson3 ${version.io.cloudevents} diff --git a/serialization/pom.xml b/serialization/pom.xml index 1b0c4c4ea..450c68491 100644 --- a/serialization/pom.xml +++ b/serialization/pom.xml @@ -14,7 +14,7 @@ ${project.version} - com.fasterxml.jackson.core + tools.jackson.core jackson-databind diff --git a/serialization/src/main/java/org/openworkflow/sdk/serialization/DeserializeHelper.java b/serialization/src/main/java/org/openworkflow/sdk/serialization/DeserializeHelper.java index c58e6c120..fcb000aef 100644 --- a/serialization/src/main/java/org/openworkflow/sdk/serialization/DeserializeHelper.java +++ b/serialization/src/main/java/org/openworkflow/sdk/serialization/DeserializeHelper.java @@ -15,43 +15,48 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.TreeNode; -import com.fasterxml.jackson.databind.JsonMappingException; import jakarta.validation.ConstraintViolationException; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import org.openworkflow.sdk.annotations.OneOfSetter; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; public class DeserializeHelper { public static T deserializeOneOf( - JsonParser p, Class targetClass, Collection> oneOfTypes) throws IOException { - return deserializeOneOf(p.readValueAsTree(), p, targetClass, oneOfTypes); + JsonParser p, + DeserializationContext ctx, + Class targetClass, + Collection> oneOfTypes) { + return deserializeOneOf(p.readValueAsTree(), ctx, targetClass, oneOfTypes); } public static T deserializeOneOf( - TreeNode node, JsonParser p, Class targetClass, Collection> oneOfTypes) - throws IOException { + JsonNode node, + DeserializationContext ctx, + Class targetClass, + Collection> oneOfTypes) { try { T result = targetClass.getDeclaredConstructor().newInstance(); Collection exceptions = new ArrayList<>(); for (Class oneOfType : oneOfTypes) { try { - assingIt(p, result, node, targetClass, oneOfType); + assingIt(ctx, result, node, targetClass, oneOfType); break; - } catch (IOException | ConstraintViolationException | InvocationTargetException ex) { + } catch (JacksonException | ConstraintViolationException | InvocationTargetException ex) { exceptions.add(ex); } } if (exceptions.size() == oneOfTypes.size()) { - JsonMappingException ex = - new JsonMappingException( - p, + DatabindException ex = + DatabindException.from( + ctx, String.format( "Error deserializing class %s, all oneOf alternatives %s has failed ", targetClass, oneOfTypes)); @@ -65,9 +70,9 @@ public static T deserializeOneOf( } private static void assingIt( - JsonParser p, T result, TreeNode node, Class targetClass, Class type) - throws JsonProcessingException, ReflectiveOperationException { - findSetMethod(targetClass, type).invoke(result, p.getCodec().treeToValue(node, type)); + DeserializationContext ctx, T result, JsonNode node, Class targetClass, Class type) + throws ReflectiveOperationException { + findSetMethod(targetClass, type).invoke(result, ctx.readTreeAsValue(node, type)); } private static Method findSetMethod(Class targetClass, Class type) { @@ -80,16 +85,16 @@ private static Method findSetMethod(Class targetClass, Class type) { throw new IllegalStateException("Cannot find a setter for type " + type); } - public static T deserializeItem(JsonParser p, Class targetClass, Class valueClass) - throws IOException { - TreeNode node = p.readValueAsTree(); - String fieldName = node.fieldNames().next(); + public static T deserializeItem( + JsonParser p, DeserializationContext ctx, Class targetClass, Class valueClass) { try { + JsonNode node = (JsonNode) p.readValueAsTree(); + String fieldName = node.propertyNames().iterator().next(); return targetClass .getConstructor(String.class, valueClass) - .newInstance(fieldName, p.getCodec().treeToValue(node.get(fieldName), valueClass)); + .newInstance(fieldName, ctx.readTreeAsValue(node.get(fieldName), valueClass)); } catch (ReflectiveOperationException e) { - throw new IOException(e); + throw DatabindException.from(p, "Failed to deserialize item", e); } } } diff --git a/serialization/src/main/java/org/openworkflow/sdk/serialization/SerializeHelper.java b/serialization/src/main/java/org/openworkflow/sdk/serialization/SerializeHelper.java index 34a850107..67c3c9eb1 100644 --- a/serialization/src/main/java/org/openworkflow/sdk/serialization/SerializeHelper.java +++ b/serialization/src/main/java/org/openworkflow/sdk/serialization/SerializeHelper.java @@ -15,13 +15,11 @@ */ package org.openworkflow.sdk.serialization; -import com.fasterxml.jackson.core.JsonGenerator; -import java.io.IOException; import org.openworkflow.sdk.annotations.OneOfValueProvider; +import tools.jackson.core.JsonGenerator; public class SerializeHelper { - public static void serializeOneOf(JsonGenerator jgen, OneOfValueProvider item) - throws IOException { - jgen.writeObject(item.get()); + public static void serializeOneOf(JsonGenerator jgen, OneOfValueProvider item) { + jgen.writePOJO(item.get()); } }