java.Jackson.xpt Maven / Gradle / Ivy
«EXTENSION java::Naming»
«EXTENSION java::ObjectMapper»
«EXTENSION java::GeneratorCommons»
«EXTENSION org::openarchitectureware::util::stdlib::io»
«EXTENSION entity::ModelProperties»
«EXTENSION java::OpenAPIFunctions»
«EXTENSION functions::Class»
«EXTENSION functions::AddToJSON»
«EXTENSION functions::JSONAlias»
«EXTENSION functions::SoftLink»
«EXTENSION functions::SystemProperties»
«EXTENSION functions::JEAFDeprecated»
«IMPORT uml»
«IMPORT JMM»
«DEFINE JacksonClassAnnotations FOR Class»
«IF generateJacksonAnnotations() && this.isStereotypeApplied("BeanParam") == false»
«IF enableSemVerForJSON() == true»
@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)
«ENDIF»
«IF (this.isTechnicalBaseClass() == false && this.superClass.size == 0 && this.getSubclasses().size > 0 ) ||
(superClass.size > 0 && superClass.first().isTechnicalBaseClass() && this.isTechnicalBaseClass() == false && this.getSubclasses().size > 0) »
«IF enableSemVerForJSON() == false»
@com.fasterxml.jackson.annotation.JsonIgnoreProperties(value = "objectType")
«ENDIF»
@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY, property = "objectType", visible = true)
«IF this.suppressSubtypesMapping() == false»
@com.fasterxml.jackson.annotation.JsonSubTypes({
«EXPAND SubtypesAnnotation -»
})
«ENDIF»
«ENDIF»
«IF needsToImplementIdentifiable() == true»
@com.fasterxml.jackson.annotation.JsonIdentityInfo(property = "objectID", generator = com.fasterxml.jackson.annotation.ObjectIdGenerators.PropertyGenerator.class)
«ENDIF»
«IF generateJSONAutoDetectAnnotationOnClass()»
@com.fasterxml.jackson.annotation.JsonAutoDetect(
fieldVisibility = com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY,
getterVisibility = com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE,
isGetterVisibility = com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE,
setterVisibility = com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE)
«ENDIF»
«IF this.hasAddToJSONProperty() || this.hasPropertyWithBckwardCompatibility()»
@com.fasterxml.jackson.annotation.JsonPropertyOrder(value = {
«FOREACH this.getAllPropertiesFromHierarchy() AS property SEPARATOR ", "»"«property.name»"«ENDFOREACH»
})
«ENDIF»
«ENDIF»
«ENDDEFINE»
«DEFINE SubtypesAnnotation FOR Class»
«FOREACH this.getSubclasses().typeSelect(Class) AS subclass SEPARATOR "," »
@com.fasterxml.jackson.annotation.JsonSubTypes.Type(value = «subclass.getNearestPackage().fqn()».«subclass.name».class, name = "«subclass.name»")
«IF subclass.getSubclasses().size >0»,
«EXPAND SubtypesAnnotation FOR subclass»
«ENDIF»
«ENDFOREACH»
«ENDDEFINE»
«DEFINE JSONAlias FOR Property»
«IF generateJacksonAnnotations()»
«IF this.isStereotypeApplied("OpenAPIAliasName") == true»
@com.fasterxml.jackson.annotation.JsonProperty("«((OpenAPIAliasName)this).openAPIPropertyName»")
«ELSEIF this.isSoftLink() && this.hasSoftLinkSuffix() && useSoftLinkSuffixInOpenAPI() == false»
@com.fasterxml.jackson.annotation.JsonProperty("«this.name»")
«ENDIF»
«IF this.isJSONAlias()»
@com.fasterxml.jackson.annotation.JsonAlias({«FOREACH this.asJSONAlias().aliasNames AS aliasName SEPARATOR ", "»"«aliasName»"«ENDFOREACH»})
«ENDIF»
«ENDIF»
«ENDDEFINE»
«DEFINE GenerateModuleFactory FOR ModuleFactory -»
«FILE packagePath() + "/" + name + ".java" src_gen»
«getFileHeader()»
package «this.packageName()»;
«EXPAND java::Helper::GenerateDeprecationAnnotation-»
/**
* Factory assembles all configured serializers / deserializers into a module.
*/
«IF isTargetRuntimeJEAF()»
@com.anaptecs.jeaf.json.annotations.ModuleFactory
«ENDIF»
public class «name» «IF isTargetRuntimeJEAF()»implements com.anaptecs.jeaf.json.api.ObjectMapperModuleFactory«ENDIF» {
«IF isTargetRuntimeJEAF()»
«IF this.getOpenAPIDataTypes().select(e|e.generateInternalViewOfCompositeDataType()).isEmpty == false»
«IF isTargetRuntimeJEAF() == false && hasCompositeDateTypeCustomSerialization() == false»
/**
* Composite type converter is used for serialization / deserialization in case that module factory contains composite data types.
*/
private final com.anaptecs.jeaf.rest.composite.api.CompositeTypeConverter compositeTypeConverter;
/**
* Initialize object.
*
* @param pCompositeTypeConverter {@link CompositeTypeConverter} implementation that should be used to serialize /
* deserialize composite data types.
*/
public «name»( com.anaptecs.jeaf.rest.composite.api.CompositeTypeConverter pCompositeTypeConverter ) {
compositeTypeConverter = pCompositeTypeConverter;
}
«ENDIF»
«ENDIF»
/**
* Method creates a module that consists of all serializers / deserializers of the current package.
*/
@Override
public com.fasterxml.jackson.databind.Module createModule( ) {
// Create module for serializers / deserializers that are located in this package
com.fasterxml.jackson.databind.module.SimpleModule lModule = new com.fasterxml.jackson.databind.module.SimpleModule(«fqn()».class.getName());
// Add serializers and deserializers for datatypes
«FOREACH this.getOpenAPIDataTypes() AS datatype»
«IF datatype.isStereotypeApplied("Ignore") == false»
«IF datatype.generateInternalViewOfCompositeDataType() && isTargetRuntimeJEAF()== false && datatype.hasCompositeDateTypeCustomSerialization() == false»
lModule.addSerializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Serializer(compositeTypeConverter));
lModule.addDeserializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Deserializer(compositeTypeConverter));
«ELSE»
lModule.addSerializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Serializer());
lModule.addDeserializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Deserializer());
«ENDIF»
«ENDIF»
«ENDFOREACH»
// Add serializers and deserializers for enumerations
«FOREACH this.clientDependency.supplier.typeSelect(uml::Package).allOwnedElements().typeSelect(JEAFEnumeration).select(e|e.extensibleEnum && e.ignore() == false).sortBy(e|e.name) AS enum»
lModule.addSerializer(«enum.fqn()».class, new «enum.packageName()».serializers.«enum.name»Serializer());
lModule.addDeserializer(«enum.fqn()».class, new «enum.packageName()».serializers.«enum.name»Deserializer());
«ENDFOREACH»
// Return created module.
return lModule;
}
«ENDIF»
/**
* Method creates a module that consists of all serializers / deserializers for data types.
*/
public static com.fasterxml.jackson.databind.Module createDataTypeSerializerModule( ) {
// Create module for serializers / deserializers that are located in this package
com.fasterxml.jackson.databind.module.SimpleModule lModule = new com.fasterxml.jackson.databind.module.SimpleModule("DataTypeSerializerModule." + «fqn()».class.getName());
// Add serializers and deserializers for data types
«FOREACH this.getOpenAPIDataTypes() AS datatype»
«IF datatype.isStereotypeApplied("Ignore") == false»
«IF datatype.generateInternalViewOfCompositeDataType() && isTargetRuntimeJEAF()== false && datatype.hasCompositeDateTypeCustomSerialization() == false»
«ELSE»
lModule.addSerializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Serializer());
lModule.addDeserializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Deserializer());
«ENDIF»
«ENDIF»
«ENDFOREACH»
// Return created module.
return lModule;
}
«IF this.requiresCompositeDataTypeConverter()»
/**
* Method creates a module that consists of all serializers / deserializers for composite data types.
*/
public static com.fasterxml.jackson.databind.Module createCompositeDataTypeSerializerModule(com.anaptecs.jeaf.rest.composite.api.CompositeTypeConverter pCompositeTypeConverter) {
// Create module for serializers / deserializers that are located in this package
com.fasterxml.jackson.databind.module.SimpleModule lModule = new com.fasterxml.jackson.databind.module.SimpleModule("CompositeDataTypeSerializerModule." + «fqn()».class.getName());
// Add serializers and deserializers for composite data types
«FOREACH this.getOpenAPIDataTypes() AS datatype»
«IF datatype.isStereotypeApplied("Ignore") == false»
«IF datatype.generateInternalViewOfCompositeDataType() && isTargetRuntimeJEAF()== false && datatype.hasCompositeDateTypeCustomSerialization() == false»
lModule.addSerializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Serializer(pCompositeTypeConverter));
lModule.addDeserializer(«datatype.fqn()».class, new «datatype.packageName()».serializers.«datatype.name»Deserializer(pCompositeTypeConverter));
«ENDIF»
«ENDIF»
«ENDFOREACH»
// Return created module.
return lModule;
}
«ENDIF»
/**
* Method creates a module that consists of all serializers / deserializers for enums.
*/
public static com.fasterxml.jackson.databind.Module createEnumSerializerModule( ) {
// Create module for serializers / deserializers that are located in this package
com.fasterxml.jackson.databind.module.SimpleModule lModule = new com.fasterxml.jackson.databind.module.SimpleModule("EnumSerializerModule." + «fqn()».class.getName());
// Add serializers and deserializers for enumerations
«FOREACH this.clientDependency.supplier.typeSelect(uml::Package).allOwnedElements().typeSelect(JEAFEnumeration).select(e|e.extensibleEnum && e.ignore() == false).sortBy(e|e.name) AS enum»
lModule.addSerializer(«enum.fqn()».class, new «enum.packageName()».serializers.«enum.name»Serializer());
lModule.addDeserializer(«enum.fqn()».class, new «enum.packageName()».serializers.«enum.name»Deserializer());
«ENDFOREACH»
// Return created module.
return lModule;
}
}
«ENDFILE»
«ENDDEFINE»
«DEFINE GenerateObjectMapperFactory FOR ObjectMapperFactory -»
«FILE packagePath() + "/" + name + ".java" src_gen»
«getFileHeader()»
package «this.packageName()»;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.VisibilityChecker;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.json.JsonMapper.Builder;
«EXPAND java::Helper::GenerateDeprecationAnnotation-»
/**
* Object Mapper Factory can be used to create a Jackson {@link ObjectMapper} that can be used to serialize and deserialize objects to / from JSON using Jackson.
*/
public class «name» {
/**
* Method creates a ready-to-use Jackson Object Mapper. The created object will be configured so that it matches best to the generated classes. It will also use the serializer modules as it was defined in the UML model.
* «IF this.isCompositeDataTypeConverterRequiredForObjectMapperFactory()» @param pCompositeTypeConverter {@link com.anaptecs.jeaf.rest.composite.api.CompositeTypeConverter} implementation that should be used to serialize / deserialize composite data types.«ENDIF»
* @return {@link ObjectMapper} Created object mapper. The method never returns null.
*/
public static ObjectMapper createObjectMapper(
«IF this.isCompositeDataTypeConverterRequiredForObjectMapperFactory()»
com.anaptecs.jeaf.rest.composite.api.CompositeTypeConverter pCompositeTypeConverter
«ENDIF») {
// Create builder for object mapper.
Builder lBuilder = JsonMapper.builder();
// Set default visibilities so that they match to the generated classes that are intended to be serialized using Jackson
VisibilityChecker> lVisibilityChecker = VisibilityChecker.Std.defaultInstance();
lVisibilityChecker = lVisibilityChecker.withFieldVisibility(JsonAutoDetect.Visibility.ANY);
lVisibilityChecker = lVisibilityChecker.withGetterVisibility(JsonAutoDetect.Visibility.NONE);
lVisibilityChecker = lVisibilityChecker.withIsGetterVisibility(JsonAutoDetect.Visibility.NONE);
lVisibilityChecker = lVisibilityChecker.withSetterVisibility(JsonAutoDetect.Visibility.NONE);
lVisibilityChecker = lVisibilityChecker.withCreatorVisibility(JsonAutoDetect.Visibility.ANY);
lBuilder.visibility(lVisibilityChecker);
// Configure mapper features
«FOREACH enabledMapperFeatures AS feature»
lBuilder.enable(com.fasterxml.jackson.databind.MapperFeature.«feature.toString()»);
«ENDFOREACH»
«FOREACH disabledMapperFeatures AS feature»
lBuilder.disable(com.fasterxml.jackson.databind.MapperFeature.«feature.toString()»);
«ENDFOREACH»
«FOREACH enabledSerializationFeatures AS feature»
lBuilder.enable(com.fasterxml.jackson.databind.SerializationFeature.«feature.toString()»);
«ENDFOREACH»
«FOREACH disabledSerializationFeatures AS feature»
lBuilder.disable(com.fasterxml.jackson.databind.SerializationFeature.«feature.toString()»);
«ENDFOREACH»
«FOREACH enabledDeserializationFeatures AS feature»
lBuilder.enable(com.fasterxml.jackson.databind.DeserializationFeature.«feature.toString()»);
«ENDFOREACH»
«FOREACH disabledDeserializationFeatures AS feature»
lBuilder.disable(com.fasterxml.jackson.databind.DeserializationFeature.«feature.toString()»);
«ENDFOREACH»
«IF enabledMapperFeatures.size == 0»
lBuilder.enable(com.fasterxml.jackson.databind.MapperFeature.PROPAGATE_TRANSIENT_MARKER);
«ENDIF»
«IF disabledDeserializationFeatures.size == 0 && enableSemVerForJSON()»
lBuilder.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
«ENDIF»
// Create configured modules and add them as well.
«FOREACH this.clientDependency.supplier.typeSelect(ModuleFactory).sortBy(e|e.name) AS moduleFactory»
lBuilder.addModule(«moduleFactory.fqn()».createDataTypeSerializerModule());
«IF moduleFactory.requiresCompositeDataTypeConverter()»
lBuilder.addModule(«moduleFactory.fqn()».createCompositeDataTypeSerializerModule(pCompositeTypeConverter));
«ENDIF»
lBuilder.addModule(«moduleFactory.fqn()».createEnumSerializerModule());
«ENDFOREACH»
// Create object mapper and return it
JsonMapper lObjectMapper = lBuilder.build();
lObjectMapper.setDefaultPropertyInclusion(Include.«defaultPropertyInclusion.name»);
return lObjectMapper;
}
}
«ENDFILE»
«ENDDEFINE»