Skip to content

Commit 8ce592a

Browse files
authored
Merge pull request #710 from bci-oss/691-make-json-format-annotation-configurable
Make `@JsonFormat` annotation configurable
2 parents 8beea4c + 2e4418e commit 8ce592a

File tree

10 files changed

+71
-19
lines changed

10 files changed

+71
-19
lines changed

core/esmf-aspect-model-java-generator/src/main/java/org/eclipse/esmf/aspectmodel/java/JavaCodeGenerationConfig.java

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
@RecordBuilder
3636
public record JavaCodeGenerationConfig(
3737
boolean enableJacksonAnnotations,
38+
Boolean enableJacksonAnnotationJsonFormatShapeObject,
3839
JsonTypeInfoType jsonTypeInfo,
3940
String packageName,
4041
ImportTracker importTracker,
@@ -49,6 +50,9 @@ public enum JsonTypeInfoType {
4950
}
5051

5152
public JavaCodeGenerationConfig {
53+
if ( enableJacksonAnnotationJsonFormatShapeObject == null ) {
54+
enableJacksonAnnotationJsonFormatShapeObject = true;
55+
}
5256
if ( jsonTypeInfo == null ) {
5357
jsonTypeInfo = JsonTypeInfoType.DEDUCTION;
5458
}

core/esmf-aspect-model-java-generator/src/main/resources/java-enumeration-class-body-lib.vm

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ $codeGenerationConfig.importTracker().importExplicit( $Arrays )
2222
/**
2323
* Generated class {@link ${enumeration.name}}.
2424
*/
25-
#if( $codeGenerationConfig.enableJacksonAnnotations() )@JsonFormat(shape = JsonFormat.Shape.OBJECT) #end
25+
#if( $codeGenerationConfig.enableJacksonAnnotationJsonFormatShapeObject() && $codeGenerationConfig.enableJacksonAnnotations() )@JsonFormat(shape = JsonFormat.Shape.OBJECT) #end
2626
public enum ${enumeration.name} {
2727
#foreach( $value in $enumeration.values )
2828
$util.generateEnumKey($value)($util.generateEnumValue($value, $codeGenerationConfig))

core/esmf-aspect-model-java-generator/src/test/java/org/eclipse/esmf/aspectmodel/java/AspectModelJavaGeneratorTest.java

+28-6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.List;
2929
import java.util.Optional;
3030
import java.util.Set;
31+
3132
import javax.xml.datatype.Duration;
3233
import javax.xml.datatype.XMLGregorianCalendar;
3334

@@ -63,16 +64,20 @@
6364
import org.junit.jupiter.params.provider.EnumSource;
6465

6566
public class AspectModelJavaGeneratorTest {
66-
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final String customJavaPackageName ) {
67+
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final JavaCodeGenerationConfig config ) {
6768
final Aspect aspect = TestResources.load( testAspect ).aspect();
68-
final JavaCodeGenerationConfig config = JavaCodeGenerationConfigBuilder.builder()
69-
.packageName( customJavaPackageName )
70-
.enableJacksonAnnotations( true )
71-
.executeLibraryMacros( false )
72-
.build();
7369
return List.of( new AspectModelJavaGenerator( aspect, config ) );
7470
}
7571

72+
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final String customJavaPackageName ) {
73+
return getGenerators( testAspect,
74+
JavaCodeGenerationConfigBuilder.builder()
75+
.packageName( customJavaPackageName )
76+
.enableJacksonAnnotations( true )
77+
.executeLibraryMacros( false )
78+
.build() );
79+
}
80+
7681
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final boolean enableJacksonAnnotations,
7782
final boolean executeLibraryMacros, final File templateLibPath ) {
7883
final Aspect aspect = TestResources.load( testAspect ).aspect();
@@ -524,6 +529,23 @@ ImmutableMap.<String, String> builder()
524529

525530
result.assertFields( "YesNo", ImmutableMap.<String, Object> builder().put( "value", String.class ).build(), new HashMap<>() );
526531
result.assertEnumConstants( "YesNo", ImmutableSet.of( "YES", "NO" ), Collections.emptyMap() );
532+
533+
assertThat( result.getGeneratedSource( new QualifiedName( "EvaluationResults", "org.eclipse.esmf.test" ) ) )
534+
.contains( "@JsonFormat" );
535+
}
536+
537+
@Test
538+
void testGenerateAspectModelWithEnumerationDisableJsonFormatAnnotation() throws IOException {
539+
final TestAspect aspect = TestAspect.ASPECT_WITH_COMPLEX_ENUM;
540+
final JavaCodeGenerationConfig codeGenerationConfig = JavaCodeGenerationConfigBuilder.builder()
541+
.enableJacksonAnnotations( true )
542+
.executeLibraryMacros( false )
543+
.packageName( aspect.getUrn().getNamespaceMainPart() )
544+
.enableJacksonAnnotationJsonFormatShapeObject( false )
545+
.build();
546+
final GenerationResult result = TestContext.generateAspectCode().apply( getGenerators( aspect, codeGenerationConfig ) );
547+
assertThat( result.getGeneratedSource( new QualifiedName( "EvaluationResults", "org.eclipse.esmf.test" ) ) )
548+
.doesNotContain( "@JsonFormat" );
527549
}
528550

529551
@Test

core/esmf-aspect-model-java-generator/src/test/java/org/eclipse/esmf/aspectmodel/java/GenerationResult.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,12 @@ class GenerationResult {
6565
private final long numFailedCompilationUnits;
6666
private final Collection<Problem> parseProblems;
6767
private final Map<QualifiedName, Class<?>> generatedClasses;
68-
68+
private final Map<QualifiedName, String> sources;
6969
final Map<String, CompilationUnit> compilationUnits;
7070

71-
GenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses ) throws IOException {
71+
GenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses,
72+
final Map<QualifiedName, String> sources ) throws IOException {
73+
this.sources = sources;
7274
combinedTypeSolver.add( new ReflectionTypeSolver() );
7375
combinedTypeSolver.add( new JavaParserTypeSolver( outputDirectory ) );
7476
combinedTypeSolver.add( new ClassLoaderTypeSolver( getClass().getClassLoader() ) );
@@ -374,4 +376,8 @@ void assertCopyright( final String className, final String expectedCopyright ) {
374376
Class<?> getGeneratedClass( final QualifiedName qualifiedName ) {
375377
return generatedClasses.get( qualifiedName );
376378
}
379+
380+
String getGeneratedSource( final QualifiedName qualifiedName ) {
381+
return sources.get( qualifiedName );
382+
}
377383
}

core/esmf-aspect-model-java-generator/src/test/java/org/eclipse/esmf/aspectmodel/java/StaticClassGenerationResult.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636

3737
public class StaticClassGenerationResult extends GenerationResult {
3838

39-
public StaticClassGenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses )
40-
throws IOException {
41-
super( outputDirectory, generatedClasses );
39+
public StaticClassGenerationResult( final File outputDirectory, final Map<QualifiedName, Class<?>> generatedClasses,
40+
final Map<QualifiedName, String> sources ) throws IOException {
41+
super( outputDirectory, generatedClasses, sources );
4242
}
4343

4444
/**

core/esmf-aspect-model-java-generator/src/test/java/org/eclipse/esmf/aspectmodel/java/TestContext.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,25 @@ public class TestContext {
3737
public static ThrowingFunction<Collection<JavaGenerator>, GenerationResult, IOException> generateAspectCode() {
3838
return generators -> {
3939
final File tempDirectory = Files.createTempDirectory( "junit" ).toFile();
40-
final Map<QualifiedName, Class<?>> generatedClasses = generateJavaCode( tempDirectory, generators );
41-
return new GenerationResult( tempDirectory, generatedClasses );
40+
final GeneratedCodeAndClasses generatedCodeAndClasses = generateJavaCode( tempDirectory, generators );
41+
return new GenerationResult( tempDirectory, generatedCodeAndClasses.classes(), generatedCodeAndClasses.sources() );
4242
};
4343
}
4444

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

53-
private static Map<QualifiedName, Class<?>> generateJavaCode( final File tempDirectory, final Collection<JavaGenerator> generators )
53+
private record GeneratedCodeAndClasses(
54+
Map<QualifiedName, Class<?>> classes,
55+
Map<QualifiedName, String> sources
56+
) {}
57+
58+
private static GeneratedCodeAndClasses generateJavaCode( final File tempDirectory, final Collection<JavaGenerator> generators )
5459
throws IOException {
5560
final File subFolder = new File(
5661
tempDirectory.getAbsolutePath() + File.separator + generators.iterator().next().getConfig().packageName()
@@ -79,7 +84,7 @@ private static Map<QualifiedName, Class<?>> generateJavaCode( final File tempDir
7984
generator.getConfig().importTracker().getUsedStaticImports().stream() ) )
8085
.collect( Collectors.toList() );
8186

82-
return JavaCompiler.compile( loadOrder, sources, referencedClasses ).compilationUnits();
87+
return new GeneratedCodeAndClasses( JavaCompiler.compile( loadOrder, sources, referencedClasses ).compilationUnits(), sources );
8388
}
8489

8590
private static void writeFile( final String className, final byte[] content, final File targetDirectory ) {

documentation/developer-guide/modules/tooling-guide/pages/maven-plugin.adoc

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ are replaced using `packageName` | `String` | none | {nok}
156156
| `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}
157157
| `executeLibraryMacros` | Execute the macros provided in the velocity macro library. | `Boolean` | `false` | {nok}
158158
| `disableJacksonAnnotations` | Leads to generated Java code that does not contain https://github.com/FasterXML/jackson[Jackson] annotations. | `Boolean` | `false` | {nok}
159+
| `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}
159160
| `jsonTypeInfo` | If Jackson annotations are enabled, determines the value of `JsonTypeInfo.Id`, e.g., `NAME`. | `String` | `DEDUCTION` | {nok}
160161
| `skip` | Skip execution of plugin and generation | `Boolean` | `false` | {nok}
161162
| `namePrefix` | Name prefix for generated Aspect, Entity Java classes | `String` | none | {nok}

documentation/developer-guide/modules/tooling-guide/pages/samm-cli.adoc

+3-1
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,14 @@ of model resolution] for more information.
105105
| _--language, -l_ : the language from the model for which the diagram should be
106106
generated (default: en) |
107107
| _--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"`
108-
.11+| [[aspect-to-java]] aspect <model> to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java`
108+
.12+| [[aspect-to-java]] aspect <model> to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java`
109109
| _--output-directory, -d_ : output directory to write files to (default:
110110
current directory) |
111111
| _--package-name, -pn_ : package to use for generated Java classes | `samm aspect AspectModel.ttl to java -pn org.company.product`
112112
| _--no-jackson, -nj_ : disable https://github.com/FasterXML/jackson[Jackson] annotation
113113
generation in generated Java classes |
114+
| _--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
115+
generation in generated Java classes |
114116
| _--json-type-info_, _-jti_ : If Jackson annotations are enabled, determines the value
115117
of JsonTypeInfo.Id. Default: DEDUCTION |
116118
| _--template-library-file, -tlf_ : the path and name of the

tools/esmf-aspect-model-maven-plugin/src/main/java/org/eclipse/esmf/aspectmodel/GenerateJavaClasses.java

+6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ public class GenerateJavaClasses extends CodeGenerationMojo {
3838
@Parameter( defaultValue = "false" )
3939
private boolean disableJacksonAnnotations;
4040

41+
@Parameter( defaultValue = "false" )
42+
private boolean disableJacksonAnnotationJsonFormatShapeObject;
43+
4144
@Parameter( defaultValue = "deduction" )
4245
protected String jsonTypeInfo;
4346

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

5053
public GenerateJavaClasses(
5154
final boolean disableJacksonAnnotations,
55+
boolean disableJacksonAnnotationJsonFormatShapeObject,
5256
final String jsonTypeInfo,
5357
final String packageName,
5458
final String templateFile,
@@ -58,6 +62,7 @@ public GenerateJavaClasses(
5862
final String namePostfix
5963
) {
6064
this.disableJacksonAnnotations = disableJacksonAnnotations;
65+
this.disableJacksonAnnotationJsonFormatShapeObject = disableJacksonAnnotationJsonFormatShapeObject;
6166
this.jsonTypeInfo = jsonTypeInfo;
6267
this.packageName = packageName;
6368
this.templateFile = templateFile;
@@ -76,6 +81,7 @@ public void executeGeneration() throws MojoExecutionException {
7681
try {
7782
final JavaCodeGenerationConfig config = JavaCodeGenerationConfigBuilder.builder()
7883
.enableJacksonAnnotations( !disableJacksonAnnotations )
84+
.enableJacksonAnnotationJsonFormatShapeObject( !disableJacksonAnnotationJsonFormatShapeObject )
7985
.jsonTypeInfo( JavaCodeGenerationConfig.JsonTypeInfoType.valueOf(
8086
Optional.ofNullable( jsonTypeInfo ).map( String::toUpperCase ).orElse( "DEDUCTION" ) ) )
8187
.packageName( determinePackageName( aspect ) )

tools/samm-cli/src/main/java/org/eclipse/esmf/aspect/to/AspectToJavaCommand.java

+6
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public class AspectToJavaCommand extends AbstractCommand {
4545
description = "Disable Jackson annotation generation in generated Java classes." )
4646
private boolean disableJacksonAnnotations = false;
4747

48+
@CommandLine.Option(
49+
names = { "--no-jackson-jsonformat-shape", "-njjs" },
50+
description = "Disable Jackson annotation JsonFormat.Shape object generation in generated Java classes." )
51+
private boolean disableJacksonAnnotationJsonFormatShapeObject = false;
52+
4853
@CommandLine.Option(
4954
names = { "--json-type-info", "-jti" },
5055
description = "If Jackson annotations are enabled, determines the value of JsonTypeInfo.Id. Default: DEDUCTION",
@@ -141,6 +146,7 @@ private JavaCodeGenerationConfig buildConfig( final Aspect aspect ) {
141146
.jsonTypeInfo( jsonTypeInfo )
142147
.templateLibFile( templateLibFile )
143148
.enableJacksonAnnotations( !disableJacksonAnnotations )
149+
.enableJacksonAnnotationJsonFormatShapeObject( !disableJacksonAnnotationJsonFormatShapeObject )
144150
.packageName( pkgName )
145151
.namePrefix( namePrefix )
146152
.namePostfix( namePostfix )

0 commit comments

Comments
 (0)