Skip to content

Commit 869a9dd

Browse files
authored
Merge pull request #349 from bci-oss/bugfix/302-code-generation-optional-with-constraint
Code generation Optional with constraint
2 parents dcfc4e2 + 131e1c6 commit 869a9dd

File tree

7 files changed

+117
-70
lines changed

7 files changed

+117
-70
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,6 @@
3232
import org.apache.jena.rdf.model.ResourceFactory;
3333
import org.apache.jena.vocabulary.RDF;
3434
import org.apache.jena.vocabulary.XSD;
35-
36-
import com.fasterxml.jackson.annotation.JsonSubTypes;
37-
import com.fasterxml.jackson.annotation.JsonTypeInfo;
38-
import com.google.common.base.CaseFormat;
39-
import com.google.common.base.Converter;
40-
41-
import org.eclipse.esmf.samm.KnownVersion;
4235
import org.eclipse.esmf.aspectmodel.java.exception.CodeGenerationException;
4336
import org.eclipse.esmf.aspectmodel.resolver.services.DataType;
4437
import org.eclipse.esmf.characteristic.Collection;
@@ -59,6 +52,12 @@
5952
import org.eclipse.esmf.metamodel.Value;
6053
import org.eclipse.esmf.metamodel.datatypes.LangString;
6154
import org.eclipse.esmf.metamodel.visitor.AspectStreamTraversalVisitor;
55+
import org.eclipse.esmf.samm.KnownVersion;
56+
57+
import com.fasterxml.jackson.annotation.JsonSubTypes;
58+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
59+
import com.google.common.base.CaseFormat;
60+
import com.google.common.base.Converter;
6261

6362
public class AspectModelJavaUtil {
6463

@@ -77,7 +76,10 @@ private AspectModelJavaUtil() {
7776
public static String getPropertyType( final Property property, final boolean inclValidation, final JavaCodeGenerationConfig codeGenerationConfig ) {
7877
final String propertyType = determinePropertyType( property.getCharacteristic(), inclValidation, codeGenerationConfig );
7978
if ( property.isOptional() ) {
80-
return containerType( Optional.class, propertyType, Optional.empty() );
79+
return containerType( Optional.class, propertyType,
80+
inclValidation && property.getCharacteristic().isPresent() && property.getCharacteristic().get() instanceof Trait t ?
81+
Optional.of( buildConstraintsForCharacteristic( t, codeGenerationConfig ) ) :
82+
Optional.empty() );
8183
}
8284
return propertyType;
8385
}

core/esmf-aspect-model-java-generator/src/main/resources/java-pojo-property-lib.vm

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,30 @@
1111
~ SPDX-License-Identifier: MPL-2.0
1212
*#
1313
#macro( javaPojoProperty $property )
14-
#if( !$property.isAbstract() )
15-
#set( $propertyType = $util.getPropertyType( $property, true, $codeGenerationConfig ) )
16-
#if( !$property.isOptional() && !$property.isNotInPayload() )
17-
$codeGenerationConfig.importTracker().importExplicit( $NotNull )
18-
@NotNull
19-
#end
20-
#if( $propertyType == 'byte[]' )
21-
$codeGenerationConfig.importTracker().importExplicit( $JsonSerialize )
22-
$codeGenerationConfig.importTracker().importExplicit( $JsonDeserialize )
23-
#if( $property.dataType.get().urn == $XSD.hexBinary.URI )
24-
$codeGenerationConfig.importTracker().importExplicit( $HexBinarySerializer )
25-
$codeGenerationConfig.importTracker().importExplicit( $HexBinaryDeserializer )
26-
@JsonSerialize( using = HexBinarySerializer.class )
27-
@JsonDeserialize( using = HexBinaryDeserializer.class )
28-
#else
29-
$codeGenerationConfig.importTracker().importExplicit( $Base64BinarySerializer )
30-
$codeGenerationConfig.importTracker().importExplicit( $Base64BinaryDeserializer )
31-
@JsonSerialize( using = Base64BinarySerializer.class )
32-
@JsonDeserialize( using = Base64BinaryDeserializer.class )
14+
#if( !$property.isAbstract() )
15+
#set( $propertyType = $util.getPropertyType( $property, true, $codeGenerationConfig ) )
16+
#if( !$property.isOptional() && !$property.isNotInPayload() )
17+
$codeGenerationConfig.importTracker().importExplicit( $NotNull )
18+
@NotNull
3319
#end
20+
#if( $propertyType == 'byte[]' )
21+
$codeGenerationConfig.importTracker().importExplicit( $JsonSerialize )
22+
$codeGenerationConfig.importTracker().importExplicit( $JsonDeserialize )
23+
#if( $property.dataType.get().urn == $XSD.hexBinary.URI )
24+
$codeGenerationConfig.importTracker().importExplicit( $HexBinarySerializer )
25+
$codeGenerationConfig.importTracker().importExplicit( $HexBinaryDeserializer )
26+
@JsonSerialize( using = HexBinarySerializer.class )
27+
@JsonDeserialize( using = HexBinaryDeserializer.class )
28+
#else
29+
$codeGenerationConfig.importTracker().importExplicit( $Base64BinarySerializer )
30+
$codeGenerationConfig.importTracker().importExplicit( $Base64BinaryDeserializer )
31+
@JsonSerialize( using = Base64BinarySerializer.class )
32+
@JsonDeserialize( using = Base64BinaryDeserializer.class )
33+
#end
34+
#end
35+
#if( !$property.isOptional() && $Trait.isAssignableFrom( $property.getCharacteristic().get().getClass() ) )
36+
$util.buildConstraintsForCharacteristic( $util.castToTrait( $property.getCharacteristic().get() ), $codeGenerationConfig )
37+
#end
38+
private $propertyType $property.getPayloadName();
3439
#end
35-
#if( $Trait.isAssignableFrom( $property.getCharacteristic().get().getClass() ) )
36-
$util.buildConstraintsForCharacteristic( $util.castToTrait( $property.getCharacteristic().get() ), $codeGenerationConfig )
37-
#end
38-
private $propertyType $property.getPayloadName();
39-
#end
4040
#end

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

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
package org.eclipse.esmf.aspectmodel.java;
1515

16-
import static org.assertj.core.api.Assertions.assertThat;
17-
import static org.assertj.core.api.Assertions.assertThatCode;
16+
import static org.assertj.core.api.Assertions.*;
1817

1918
import java.io.File;
2019
import java.io.IOException;
@@ -36,6 +35,13 @@
3635
import org.eclipse.esmf.aspectmodel.resolver.services.DataType;
3736
import org.eclipse.esmf.aspectmodel.resolver.services.VersionedModel;
3837
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
38+
import org.eclipse.esmf.metamodel.Aspect;
39+
import org.eclipse.esmf.metamodel.datatypes.LangString;
40+
import org.eclipse.esmf.metamodel.loader.AspectModelLoader;
41+
import org.eclipse.esmf.samm.KnownVersion;
42+
import org.eclipse.esmf.test.MetaModelVersions;
43+
import org.eclipse.esmf.test.TestAspect;
44+
import org.eclipse.esmf.test.TestResources;
3945
import org.junit.jupiter.api.BeforeAll;
4046
import org.junit.jupiter.params.ParameterizedTest;
4147
import org.junit.jupiter.params.provider.EnumSource;
@@ -53,14 +59,6 @@
5359
import com.google.common.collect.ImmutableSet;
5460
import com.google.common.reflect.TypeToken;
5561

56-
import org.eclipse.esmf.samm.KnownVersion;
57-
import org.eclipse.esmf.metamodel.Aspect;
58-
import org.eclipse.esmf.metamodel.datatypes.LangString;
59-
import org.eclipse.esmf.metamodel.loader.AspectModelLoader;
60-
import org.eclipse.esmf.test.MetaModelVersions;
61-
import org.eclipse.esmf.test.TestAspect;
62-
import org.eclipse.esmf.test.TestResources;
63-
6462
public class AspectModelJavaGeneratorTest extends MetaModelVersions {
6563

6664
private Collection<JavaGenerator> getGenerators( final TestAspect testAspect, final KnownVersion metaModelVersion, final String customJavaPackageName ) {
@@ -340,6 +338,24 @@ ImmutableMap.<String, String> builder()
340338
assertConstructor( result, "AspectWithConstraints", expectedFieldsForAspectClass );
341339
}
342340

341+
@ParameterizedTest
342+
@MethodSource( value = "versionsStartingWith2_0_0" )
343+
public void testGenerateAspectModelWithOptionalAndConstraints( final KnownVersion metaModelVersion ) throws IOException {
344+
final ImmutableMap<String, Object> expectedFieldsForAspectClass = ImmutableMap.<String, Object> builder()
345+
.put( "stringProperty", "Optional<@Size(max = 3) String>" )
346+
.build();
347+
348+
final TestAspect aspect = TestAspect.ASPECT_WITH_OPTIONAL_PROPERTY_AND_CONSTRAINT;
349+
final GenerationResult result = TestContext.generateAspectCode().apply( getGenerators( aspect, metaModelVersion,
350+
true, false, null ) );
351+
result.assertNumberOfFiles( 1 );
352+
result.assertFields( "AspectWithOptionalPropertyAndConstraint", expectedFieldsForAspectClass,
353+
ImmutableMap.<String, String> builder()
354+
.put( "stringProperty", "" )
355+
.build() );
356+
assertConstructor( result, "AspectWithOptionalPropertyAndConstraint", expectedFieldsForAspectClass );
357+
}
358+
343359
@ParameterizedTest
344360
@MethodSource( value = "allVersions" )
345361
public void testGenerateAspectWithConstrainedCollection( final KnownVersion metaModelVersion ) throws IOException {
@@ -396,7 +412,7 @@ ImmutableMap.<String, String> builder()
396412
@MethodSource( value = "allVersions" )
397413
public void testGenerateAspectWithEither( final KnownVersion metaModelVersion ) throws IOException {
398414
final ImmutableMap<String, Object> expectedFieldsForAspectClass = ImmutableMap.<String, Object> builder()
399-
.put( "testProperty", "Either<LeftEntity,RightEntity>" )
415+
.put( "testProperty", "Either<LeftEntity, RightEntity>" )
400416
.build();
401417

402418
final TestAspect aspect = TestAspect.ASPECT_WITH_EITHER_WITH_COMPLEX_TYPES;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void assertFields( final String className, final ImmutableMap<String, Object> fi
124124
field -> {
125125
final Object fieldTypeOrTypeName = fieldTypesOrTypeNames.get( field.resolve().getName() );
126126
if ( fieldTypeOrTypeName instanceof String ) {
127-
assertThat( field.getElementType().asString() ).isEqualTo( fieldTypeOrTypeName );
127+
assertThat( field.getElementType().toString() ).isEqualTo( fieldTypeOrTypeName );
128128
} else if ( fieldTypeOrTypeName instanceof ResolvedType ) {
129129
assertThat( field.resolve().getType() ).isEqualTo( fieldTypeOrTypeName );
130130
} else {
@@ -194,7 +194,7 @@ void assertMethodBody( final String className, final String methodName, final bo
194194

195195
final MethodDeclaration methodDeclaration = possibleMethodDeclaration.get();
196196
assertThat( methodDeclaration.isPublic() ).isTrue();
197-
expectedReturnType.ifPresent(returnType -> assertThat( methodDeclaration.getType() ).isEqualTo( returnType ));
197+
expectedReturnType.ifPresent( returnType -> assertThat( methodDeclaration.getType() ).isEqualTo( returnType ) );
198198
assertThat( methodDeclaration.getParameters() ).hasSize( expectedNumberOfParameters );
199199
assertThat( methodDeclaration.getBody() ).isPresent();
200200
if ( override ) {

0 commit comments

Comments
 (0)