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
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());
}
}