Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make @JsonFormat annotation configurable #710

Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
@RecordBuilder
public record JavaCodeGenerationConfig(
boolean enableJacksonAnnotations,
Boolean enableJacksonAnnotationJsonFormatShapeObject,
JsonTypeInfoType jsonTypeInfo,
String packageName,
ImportTracker importTracker,
Expand All @@ -49,6 +50,9 @@ public enum JsonTypeInfoType {
}

public JavaCodeGenerationConfig {
if ( enableJacksonAnnotationJsonFormatShapeObject == null ) {
enableJacksonAnnotationJsonFormatShapeObject = true;
}
if ( jsonTypeInfo == null ) {
jsonTypeInfo = JsonTypeInfoType.DEDUCTION;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ $codeGenerationConfig.importTracker().importExplicit( $Arrays )
/**
* Generated class {@link ${enumeration.name}}.
*/
#if( $codeGenerationConfig.enableJacksonAnnotations() )@JsonFormat(shape = JsonFormat.Shape.OBJECT) #end
#if( $codeGenerationConfig.enableJacksonAnnotationJsonFormatShapeObject() && $codeGenerationConfig.enableJacksonAnnotations() )@JsonFormat(shape = JsonFormat.Shape.OBJECT) #end
public enum ${enumeration.name} {
#foreach( $value in $enumeration.values )
$util.generateEnumKey($value)($util.generateEnumValue($value, $codeGenerationConfig))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;

import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;

Expand Down Expand Up @@ -63,16 +64,20 @@
import org.junit.jupiter.params.provider.EnumSource;

public class AspectModelJavaGeneratorTest {
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final String customJavaPackageName ) {
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final JavaCodeGenerationConfig config ) {
final Aspect aspect = TestResources.load( testAspect ).aspect();
final JavaCodeGenerationConfig config = JavaCodeGenerationConfigBuilder.builder()
.packageName( customJavaPackageName )
.enableJacksonAnnotations( true )
.executeLibraryMacros( false )
.build();
return List.of( new AspectModelJavaGenerator( aspect, config ) );
}

private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final String customJavaPackageName ) {
return getGenerators( testAspect,
JavaCodeGenerationConfigBuilder.builder()
.packageName( customJavaPackageName )
.enableJacksonAnnotations( true )
.executeLibraryMacros( false )
.build() );
}

private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final boolean enableJacksonAnnotations,
final boolean executeLibraryMacros, final File templateLibPath ) {
final Aspect aspect = TestResources.load( testAspect ).aspect();
Expand Down Expand Up @@ -524,6 +529,23 @@ ImmutableMap.<String, String> builder()

result.assertFields( "YesNo", ImmutableMap.<String, Object> builder().put( "value", String.class ).build(), new HashMap<>() );
result.assertEnumConstants( "YesNo", ImmutableSet.of( "YES", "NO" ), Collections.emptyMap() );

assertThat( result.getGeneratedSource( new QualifiedName( "EvaluationResults", "org.eclipse.esmf.test" ) ) )
.contains( "@JsonFormat" );
}

@Test
void testGenerateAspectModelWithEnumerationDisableJsonFormatAnnotation() throws IOException {
final TestAspect aspect = TestAspect.ASPECT_WITH_COMPLEX_ENUM;
final JavaCodeGenerationConfig codeGenerationConfig = JavaCodeGenerationConfigBuilder.builder()
.enableJacksonAnnotations( true )
.executeLibraryMacros( false )
.packageName( aspect.getUrn().getNamespaceMainPart() )
.enableJacksonAnnotationJsonFormatShapeObject( false )
.build();
final GenerationResult result = TestContext.generateAspectCode().apply( getGenerators( aspect, codeGenerationConfig ) );
assertThat( result.getGeneratedSource( new QualifiedName( "EvaluationResults", "org.eclipse.esmf.test" ) ) )
.doesNotContain( "@JsonFormat" );
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,12 @@ class GenerationResult {
private final long numFailedCompilationUnits;
private final Collection<Problem> parseProblems;
private final Map<QualifiedName, Class<?>> generatedClasses;

private final Map<QualifiedName, String> sources;
final Map<String, CompilationUnit> compilationUnits;

GenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses ) throws IOException {
GenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses,
final Map<QualifiedName, String> sources ) throws IOException {
this.sources = sources;
combinedTypeSolver.add( new ReflectionTypeSolver() );
combinedTypeSolver.add( new JavaParserTypeSolver( outputDirectory ) );
combinedTypeSolver.add( new ClassLoaderTypeSolver( getClass().getClassLoader() ) );
Expand Down Expand Up @@ -374,4 +376,8 @@ void assertCopyright( final String className, final String expectedCopyright ) {
Class<?> getGeneratedClass( final QualifiedName qualifiedName ) {
return generatedClasses.get( qualifiedName );
}

String getGeneratedSource( final QualifiedName qualifiedName ) {
return sources.get( qualifiedName );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@

public class StaticClassGenerationResult extends GenerationResult {

public StaticClassGenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses )
throws IOException {
super( outputDirectory, generatedClasses );
public StaticClassGenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses,
final Map<QualifiedName, String> sources ) throws IOException {
super( outputDirectory, generatedClasses, sources );
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,25 @@ public class TestContext {
public static ThrowingFunction<Collection<JavaGenerator>, GenerationResult, IOException> generateAspectCode() {
return generators -> {
final File tempDirectory = Files.createTempDirectory( "junit" ).toFile();
final Map<QualifiedName, Class<?>> generatedClasses = generateJavaCode( tempDirectory, generators );
return new GenerationResult( tempDirectory, generatedClasses );
final GeneratedCodeAndClasses generatedCodeAndClasses = generateJavaCode( tempDirectory, generators );
return new GenerationResult( tempDirectory, generatedCodeAndClasses.classes(), generatedCodeAndClasses.sources() );
};
}

public static ThrowingFunction<Collection<JavaGenerator>, StaticClassGenerationResult, IOException> generateStaticAspectCode() {
return generators -> {
final File tempDirectory = Files.createTempDirectory( "junit" ).toFile();
final Map<QualifiedName, Class<?>> generatedClasses = generateJavaCode( tempDirectory, generators );
return new StaticClassGenerationResult( tempDirectory, generatedClasses );
final GeneratedCodeAndClasses generatedCodeAndClasses = generateJavaCode( tempDirectory, generators );
return new StaticClassGenerationResult( tempDirectory, generatedCodeAndClasses.classes(), generatedCodeAndClasses.sources() );
};
}

private static Map<QualifiedName, Class<?>> generateJavaCode( final File tempDirectory, final Collection<JavaGenerator> generators )
private record GeneratedCodeAndClasses(
Map<QualifiedName, Class<?>> classes,
Map<QualifiedName, String> sources
) {}

private static GeneratedCodeAndClasses generateJavaCode( final File tempDirectory, final Collection<JavaGenerator> generators )
throws IOException {
final File subFolder = new File(
tempDirectory.getAbsolutePath() + File.separator + generators.iterator().next().getConfig().packageName()
Expand Down Expand Up @@ -79,7 +84,7 @@ private static Map<QualifiedName, Class<?>> generateJavaCode( final File tempDir
generator.getConfig().importTracker().getUsedStaticImports().stream() ) )
.collect( Collectors.toList() );

return JavaCompiler.compile( loadOrder, sources, referencedClasses ).compilationUnits();
return new GeneratedCodeAndClasses( JavaCompiler.compile( loadOrder, sources, referencedClasses ).compilationUnits(), sources );
}

private static void writeFile( final String className, final byte[] content, final File targetDirectory ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ are replaced using `packageName` | `String` | none | {nok}
| `templateFile` | The path and name of the velocity template file containing the macro library. See xref:java-aspect-tooling.adoc#providing-custom-macros-for-code-generation[Providing Custom Macros for Code Generation]. | `String` | none | {nok}
| `executeLibraryMacros` | Execute the macros provided in the velocity macro library. | `Boolean` | `false` | {nok}
| `disableJacksonAnnotations` | Leads to generated Java code that does not contain https://github.com/FasterXML/jackson[Jackson] annotations. | `Boolean` | `false` | {nok}
| `disableJacksonAnnotationJsonFormatShapeObject` | Leads to generated Java code that does not contain https://github.com/FasterXML/jackson-annotations/blob/2.19/src/main/java/com/fasterxml/jackson/annotation/JsonFormat.java[JsonFormat.Shape] annotation. | `Boolean` | `false` | {nok}
| `jsonTypeInfo` | If Jackson annotations are enabled, determines the value of `JsonTypeInfo.Id`, e.g., `NAME`. | `String` | `DEDUCTION` | {nok}
| `skip` | Skip execution of plugin and generation | `Boolean` | `false` | {nok}
| `namePrefix` | Name prefix for generated Aspect, Entity Java classes | `String` | none | {nok}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,14 @@ of model resolution] for more information.
| _--language, -l_ : the language from the model for which the diagram should be
generated (default: en) |
| _--custom-resolver_ : use an external resolver for the resolution of the model elements | `samm aspect AspectModel.ttl to svg --custom-resolver "java -jar resolver.jar"`
.11+| [[aspect-to-java]] aspect <model> to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java`
.12+| [[aspect-to-java]] aspect <model> to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java`
| _--output-directory, -d_ : output directory to write files to (default:
current directory) |
| _--package-name, -pn_ : package to use for generated Java classes | `samm aspect AspectModel.ttl to java -pn org.company.product`
| _--no-jackson, -nj_ : disable https://github.com/FasterXML/jackson[Jackson] annotation
generation in generated Java classes |
| _--no-jackson-jsonformat-shape, -njjs_ : disable https://github.com/FasterXML/jackson-annotations/blob/2.19/src/main/java/com/fasterxml/jackson/annotation/JsonFormat.java[JsonFormat.Shape] annotation
generation in generated Java classes |
| _--json-type-info_, _-jti_ : If Jackson annotations are enabled, determines the value
of JsonTypeInfo.Id. Default: DEDUCTION |
| _--template-library-file, -tlf_ : the path and name of the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public class GenerateJavaClasses extends CodeGenerationMojo {
@Parameter( defaultValue = "false" )
private boolean disableJacksonAnnotations;

@Parameter( defaultValue = "false" )
private boolean disableJacksonAnnotationJsonFormatShapeObject;

@Parameter( defaultValue = "deduction" )
protected String jsonTypeInfo;

Expand All @@ -49,6 +52,7 @@ public GenerateJavaClasses() {

public GenerateJavaClasses(
final boolean disableJacksonAnnotations,
boolean disableJacksonAnnotationJsonFormatShapeObject,
final String jsonTypeInfo,
final String packageName,
final String templateFile,
Expand All @@ -58,6 +62,7 @@ public GenerateJavaClasses(
final String namePostfix
) {
this.disableJacksonAnnotations = disableJacksonAnnotations;
this.disableJacksonAnnotationJsonFormatShapeObject = disableJacksonAnnotationJsonFormatShapeObject;
this.jsonTypeInfo = jsonTypeInfo;
this.packageName = packageName;
this.templateFile = templateFile;
Expand All @@ -76,6 +81,7 @@ public void executeGeneration() throws MojoExecutionException {
try {
final JavaCodeGenerationConfig config = JavaCodeGenerationConfigBuilder.builder()
.enableJacksonAnnotations( !disableJacksonAnnotations )
.enableJacksonAnnotationJsonFormatShapeObject( !disableJacksonAnnotationJsonFormatShapeObject )
.jsonTypeInfo( JavaCodeGenerationConfig.JsonTypeInfoType.valueOf(
Optional.ofNullable( jsonTypeInfo ).map( String::toUpperCase ).orElse( "DEDUCTION" ) ) )
.packageName( determinePackageName( aspect ) )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ public class AspectToJavaCommand extends AbstractCommand {
description = "Disable Jackson annotation generation in generated Java classes." )
private boolean disableJacksonAnnotations = false;

@CommandLine.Option(
names = { "--no-jackson-jsonformat-shape", "-njjs" },
description = "Disable Jackson annotation JsonFormat.Shape object generation in generated Java classes." )
private boolean disableJacksonAnnotationJsonFormatShapeObject = false;

@CommandLine.Option(
names = { "--json-type-info", "-jti" },
description = "If Jackson annotations are enabled, determines the value of JsonTypeInfo.Id. Default: DEDUCTION",
Expand Down Expand Up @@ -141,6 +146,7 @@ private JavaCodeGenerationConfig buildConfig( final Aspect aspect ) {
.jsonTypeInfo( jsonTypeInfo )
.templateLibFile( templateLibFile )
.enableJacksonAnnotations( !disableJacksonAnnotations )
.enableJacksonAnnotationJsonFormatShapeObject( !disableJacksonAnnotationJsonFormatShapeObject )
.packageName( pkgName )
.namePrefix( namePrefix )
.namePostfix( namePostfix )
Expand Down
Loading