Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
<artifactId>json-schema-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Comment thread
fjtirado marked this conversation as resolved.
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;
Expand All @@ -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 <V extends ObjectMapper, T extends MapperBuilder<V, T>> 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() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,39 @@
*/
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 <T> void validate(T t) throws IOException {
private <T> void validate(T t) {
Set<ConstraintViolation<T>> violations = validator.validate(t);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}

@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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<URI> {

public class URIDeserializer extends JsonDeserializer<URI> {
@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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<URI> {
public class URISerializer extends ValueSerializer<URI> {

@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());
}
}
2 changes: 1 addition & 1 deletion examples/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<artifactId>jersey-media-json-jackson3</artifactId>
<version>${version.org.glassfish.jersey}</version>
<scope>runtime</scope>
</dependency>
Expand Down
2 changes: 1 addition & 1 deletion examples/simpleGet/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<artifactId>jersey-media-json-jackson3</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down
Loading
Loading