Skip to content

Commit f83bb42

Browse files
authored
Merge pull request #272 from bci-oss/bugfix/OMP-SDK-177-code-generation-for-abstract-entities
Fix problem with JsonSubTypes on generated Java classes.
2 parents 800332c + 04ded33 commit f83bb42

File tree

5 files changed

+48
-11
lines changed

5 files changed

+48
-11
lines changed

core/sds-aspect-model-java-generator/src/main/java/io/openmanufacturing/sds/aspectmodel/java/AspectModelJavaUtil.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.function.Supplier;
2525
import java.util.stream.Collectors;
2626
import java.util.stream.IntStream;
27+
import java.util.stream.Stream;
2728

2829
import org.apache.commons.lang3.StringUtils;
2930
import org.apache.commons.text.StringEscapeUtils;
@@ -40,19 +41,19 @@
4041
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
4142
import io.openmanufacturing.sds.aspectmodel.java.exception.CodeGenerationException;
4243
import io.openmanufacturing.sds.aspectmodel.resolver.services.DataType;
44+
import io.openmanufacturing.sds.characteristic.Collection;
45+
import io.openmanufacturing.sds.characteristic.Either;
46+
import io.openmanufacturing.sds.characteristic.Enumeration;
47+
import io.openmanufacturing.sds.characteristic.Quantifiable;
48+
import io.openmanufacturing.sds.characteristic.Trait;
4349
import io.openmanufacturing.sds.metamodel.AbstractEntity;
4450
import io.openmanufacturing.sds.metamodel.Characteristic;
45-
import io.openmanufacturing.sds.characteristic.Collection;
4651
import io.openmanufacturing.sds.metamodel.ComplexType;
47-
import io.openmanufacturing.sds.characteristic.Either;
4852
import io.openmanufacturing.sds.metamodel.Entity;
49-
import io.openmanufacturing.sds.characteristic.Enumeration;
5053
import io.openmanufacturing.sds.metamodel.HasProperties;
5154
import io.openmanufacturing.sds.metamodel.Property;
52-
import io.openmanufacturing.sds.characteristic.Quantifiable;
5355
import io.openmanufacturing.sds.metamodel.Scalar;
5456
import io.openmanufacturing.sds.metamodel.StructureElement;
55-
import io.openmanufacturing.sds.characteristic.Trait;
5657
import io.openmanufacturing.sds.metamodel.Type;
5758
import io.openmanufacturing.sds.metamodel.Value;
5859
import io.openmanufacturing.sds.metamodel.datatypes.LangString;
@@ -207,7 +208,8 @@ public static String determineComplexTypeClassDefinition( final ComplexType elem
207208
return classDefinitionBuilder.toString();
208209
}
209210

210-
public static String generateAbstractEntityClassAnnotations( final ComplexType element, final JavaCodeGenerationConfig codeGenerationConfig ) {
211+
public static String generateAbstractEntityClassAnnotations( final ComplexType element, final JavaCodeGenerationConfig codeGenerationConfig,
212+
final Set<ComplexType> extendingEntities ) {
211213
final StringBuilder classAnnotationBuilder = new StringBuilder();
212214
if ( element.isAbstractEntity() ) {
213215
codeGenerationConfig.getImportTracker().importExplicit( JsonTypeInfo.class );
@@ -216,7 +218,7 @@ public static String generateAbstractEntityClassAnnotations( final ComplexType e
216218
final AbstractEntity abstractEntity = (AbstractEntity) element;
217219
classAnnotationBuilder.append( "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)" );
218220
classAnnotationBuilder.append( "@JsonSubTypes({" );
219-
final Iterator<ComplexType> extendingComplexTypeIterator = abstractEntity.getExtendingElements().iterator();
221+
final Iterator<ComplexType> extendingComplexTypeIterator = getExtendingClosure( abstractEntity, extendingEntities ).iterator();
220222
while ( extendingComplexTypeIterator.hasNext() ) {
221223
final ComplexType extendingComplexType = extendingComplexTypeIterator.next();
222224
classAnnotationBuilder.append( "@JsonSubTypes.Type(value = " );
@@ -233,6 +235,13 @@ public static String generateAbstractEntityClassAnnotations( final ComplexType e
233235
return classAnnotationBuilder.toString();
234236
}
235237

238+
private static Stream<ComplexType> getExtendingClosure( final ComplexType element, final Set<ComplexType> extendingEntities ) {
239+
return Stream.concat( extendingEntities.stream().filter( entity -> element.equals( entity.getExtends().get() ) ),
240+
extendingEntities.stream()
241+
.filter( entity -> element.equals( entity.getExtends().get() ) )
242+
.flatMap( extendingElement -> getExtendingClosure( extendingElement, extendingEntities ) ) );
243+
}
244+
236245
private static String determineCollectionType( final Collection collection, final boolean inclValidation,
237246
final JavaCodeGenerationConfig codeGenerationConfig ) {
238247
final Optional<Type> dataType = collection.getDataType();

core/sds-aspect-model-java-generator/src/main/java/io/openmanufacturing/sds/aspectmodel/java/pojo/AspectModelJavaGenerator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.io.File;
1616
import java.util.function.Function;
17+
import java.util.stream.Collectors;
1718
import java.util.stream.Stream;
1819

1920
import io.openmanufacturing.sds.aspectmodel.generator.Artifact;
@@ -23,9 +24,9 @@
2324
import io.openmanufacturing.sds.aspectmodel.java.exception.CodeGenerationException;
2425
import io.openmanufacturing.sds.aspectmodel.resolver.services.VersionedModel;
2526
import io.openmanufacturing.sds.aspectmodel.urn.AspectModelUrn;
27+
import io.openmanufacturing.sds.characteristic.Enumeration;
2628
import io.openmanufacturing.sds.metamodel.Aspect;
2729
import io.openmanufacturing.sds.metamodel.ComplexType;
28-
import io.openmanufacturing.sds.characteristic.Enumeration;
2930
import io.openmanufacturing.sds.metamodel.loader.AspectModelLoader;
3031

3132
/**
@@ -58,7 +59,8 @@ public AspectModelJavaGenerator( final VersionedModel versionedModel, final Stri
5859
@Override
5960
protected Stream<Artifact<QualifiedName, String>> generateArtifacts() {
6061
return Stream.of( applyTemplate( Aspect.class, new StructureElementJavaArtifactGenerator<>(), config ),
61-
applyTemplate( ComplexType.class, new StructureElementJavaArtifactGenerator<>(), config ),
62+
applyTemplate( ComplexType.class, new StructureElementJavaArtifactGenerator<>(
63+
elements( ComplexType.class ).filter( element -> element.getExtends().isPresent() ).collect( Collectors.toSet() ) ), config ),
6264
applyTemplate( Enumeration.class, new EnumerationJavaArtifactGenerator<>(), config ) )
6365
.flatMap( Function.identity() );
6466
}

core/sds-aspect-model-java-generator/src/main/java/io/openmanufacturing/sds/aspectmodel/java/pojo/StructureElementJavaArtifactGenerator.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Locale;
1919
import java.util.Map;
2020
import java.util.Properties;
21+
import java.util.Set;
2122
import java.util.regex.Matcher;
2223
import java.util.regex.Pattern;
2324

@@ -48,11 +49,11 @@
4849
import io.openmanufacturing.sds.aspectmodel.java.ValueInitializer;
4950
import io.openmanufacturing.sds.aspectmodel.java.exception.CodeGenerationException;
5051
import io.openmanufacturing.sds.aspectmodel.resolver.services.DataType;
52+
import io.openmanufacturing.sds.characteristic.Trait;
5153
import io.openmanufacturing.sds.metamodel.ComplexType;
5254
import io.openmanufacturing.sds.metamodel.Constraint;
5355
import io.openmanufacturing.sds.metamodel.Scalar;
5456
import io.openmanufacturing.sds.metamodel.StructureElement;
55-
import io.openmanufacturing.sds.characteristic.Trait;
5657
import io.openmanufacturing.sds.metamodel.impl.DefaultScalar;
5758
import io.openmanufacturing.sds.metamodel.impl.DefaultScalarValue;
5859

@@ -64,6 +65,16 @@
6465
*/
6566
public class StructureElementJavaArtifactGenerator<E extends StructureElement> implements JavaArtifactGenerator<E> {
6667

68+
private final Set<ComplexType> extendingEntities;
69+
70+
public StructureElementJavaArtifactGenerator() {
71+
extendingEntities = Set.of();
72+
}
73+
74+
public StructureElementJavaArtifactGenerator( final Set<ComplexType> extendingEntitiesInModel ) {
75+
extendingEntities = extendingEntitiesInModel;
76+
}
77+
6778
// Needs to instantiate XSD in order to use Velocity's FieldMethodizer
6879
@SuppressWarnings( { "squid:S2440", "InstantiationOfUtilityClass" } )
6980
@Override
@@ -110,6 +121,7 @@ public JavaArtifact apply( final E element, final JavaCodeGenerationConfig confi
110121
.put( "util", AspectModelJavaUtil.class )
111122
.put( "valueInitializer", new ValueInitializer() )
112123
.put( "XSD", new FieldMethodizer( new XSD() ) )
124+
.put( "extendingEntities", extendingEntities )
113125
.build();
114126

115127
final Properties engineConfiguration = new Properties();

core/sds-aspect-model-java-generator/src/main/resources/java-pojo-class-body-lib.vm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
${util.determineCollectionAspectClassDefinition( $element, $codeGenerationConfig )} {
2626
#elseif ( $element.is( $ComplexType ) )
2727
#set( $complexElement = $ComplexType.cast( $element ) )
28-
${util.generateAbstractEntityClassAnnotations( $complexElement, $codeGenerationConfig )}
28+
${util.generateAbstractEntityClassAnnotations( $complexElement, $codeGenerationConfig, $extendingEntities )}
2929
${util.determineComplexTypeClassDefinition( $complexElement, $codeGenerationConfig )}
3030
#else
3131
public class $element.getName()${util.genericClassSignature( $element )} {

core/sds-aspect-model-java-generator/src/test/java/io/openmanufacturing/sds/aspectmodel/java/AspectModelJavaGeneratorTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,4 +1065,18 @@ public void testGenerateAspectWithFileHeader( final KnownVersion metaModelVersio
10651065
result.assertCopyright( "EvaluationResults", expectedCopyright );
10661066
result.assertCopyright( "EvaluationResult", expectedCopyright );
10671067
}
1068+
1069+
@ParameterizedTest
1070+
@MethodSource( value = "versionsStartingWith2_0_0" )
1071+
public void testGenerateAspectWithMultipleInheritance( final KnownVersion metaModelVersion ) throws IOException {
1072+
final TestAspect aspect = TestAspect.ASPECT_WITH_EXTENDED_ENTITY;
1073+
final GenerationResult result = TestContext.generateAspectCode().apply( getGenerators( aspect, metaModelVersion ) );
1074+
result.assertNumberOfFiles( 4 );
1075+
result.assertClassDeclaration( "ParentOfParentEntity", Collections.singletonList( Modifier.abstractModifier() ),
1076+
Collections.emptyList(), Collections.emptyList(), List.of( "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)",
1077+
"@JsonSubTypes({ @JsonSubTypes.Type(value = ParentTestEntity.class, name = \"ParentTestEntity\"), @JsonSubTypes.Type(value = TestEntity.class, name = \"TestEntity\") })" ) );
1078+
result.assertClassDeclaration( "ParentTestEntity", Collections.singletonList( Modifier.abstractModifier() ),
1079+
Collections.singletonList( "ParentOfParentEntity" ), Collections.emptyList(), List.of( "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)",
1080+
"@JsonSubTypes({ @JsonSubTypes.Type(value = TestEntity.class, name = \"TestEntity\") })" ) );
1081+
}
10681082
}

0 commit comments

Comments
 (0)