Skip to content

Commit 3491bcf

Browse files
authored
Merge pull request #355 from bci-oss/bugfix/ESMF-316-json-generator-fails-index-out-of-bounds
Fix the problem with the generation of Json payloads.
2 parents ca6712b + 81b3e27 commit 3491bcf

File tree

17 files changed

+112
-121
lines changed

17 files changed

+112
-121
lines changed

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/ComplexType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public interface ComplexType extends Type, StructureElement {
3131
default List<ComplexType> getExtendingElements() {
3232
return Collections.emptyList();
3333
}
34-
34+
3535
default boolean isAbstractEntity() {
3636
return false;
3737
}

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/impl/DefaultAbstractEntity.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.eclipse.esmf.metamodel.ComplexType;
2222
import org.eclipse.esmf.metamodel.Property;
2323
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
24+
import org.eclipse.esmf.metamodel.loader.ModelElementFactory;
2425
import org.eclipse.esmf.metamodel.visitor.AspectVisitor;
2526

2627
public class DefaultAbstractEntity extends DefaultComplexType implements AbstractEntity {
@@ -29,14 +30,15 @@ public static DefaultAbstractEntity createDefaultAbstractEntity(
2930
final List<? extends Property> properties,
3031
final Optional<ComplexType> _extends,
3132
final List<AspectModelUrn> extendingElements ) {
32-
return new DefaultAbstractEntity( metaModelBaseAttributes, properties, _extends, extendingElements );
33+
return new DefaultAbstractEntity( metaModelBaseAttributes, properties, _extends, extendingElements, null );
3334
}
3435

3536
public DefaultAbstractEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
3637
final List<? extends Property> properties,
3738
final Optional<ComplexType> _extends,
38-
final List<AspectModelUrn> extendingElements ) {
39-
super( metaModelBaseAttributes, properties, _extends, extendingElements );
39+
final List<AspectModelUrn> extendingElements,
40+
final ModelElementFactory loadedElements ) {
41+
super( metaModelBaseAttributes, properties, _extends, extendingElements, loadedElements );
4042
}
4143

4244
/**

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/impl/DefaultComplexType.java

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,44 +14,33 @@
1414
package org.eclipse.esmf.metamodel.impl;
1515

1616
import java.util.ArrayList;
17-
import java.util.Collections;
18-
import java.util.HashMap;
1917
import java.util.List;
20-
import java.util.Map;
21-
import java.util.Objects;
2218
import java.util.Optional;
23-
import java.util.stream.Collectors;
2419

2520
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
26-
import org.eclipse.esmf.metamodel.Aspect;
2721
import org.eclipse.esmf.metamodel.ComplexType;
2822
import org.eclipse.esmf.metamodel.Property;
2923
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
24+
import org.eclipse.esmf.metamodel.loader.ModelElementFactory;
3025
import org.eclipse.esmf.metamodel.visitor.AspectVisitor;
3126

3227
public class DefaultComplexType extends ModelElementImpl implements ComplexType {
33-
34-
/**
35-
* Used to keep track of all {@link ComplexType} instances regardles of whether they are directly or indirectly
36-
* referenced in the {@link Aspect}.
37-
*/
38-
private static final HashMap<AspectModelUrn, ComplexType> instances = new HashMap<>();
39-
4028
private final List<Property> properties;
4129
private final Optional<ComplexType> _extends;
4230
private final List<AspectModelUrn> extendingElements;
31+
private final ModelElementFactory loadedElements;
4332

4433
protected DefaultComplexType(
4534
final MetaModelBaseAttributes metaModelBaseAttributes,
4635
final List<? extends Property> properties,
4736
final Optional<ComplexType> _extends,
48-
final List<AspectModelUrn> extendingElements ) {
37+
final List<AspectModelUrn> extendingElements,
38+
final ModelElementFactory loadedElements ) {
4939
super( metaModelBaseAttributes );
50-
//noinspection OptionalGetWithoutIsPresent
51-
instances.put( metaModelBaseAttributes.getUrn().get(), this );
5240
this.properties = new ArrayList<>( properties );
5341
this._extends = _extends;
5442
this.extendingElements = extendingElements;
43+
this.loadedElements = loadedElements;
5544
}
5645

5746
/**
@@ -70,16 +59,14 @@ public Optional<ComplexType> getExtends() {
7059
}
7160

7261
/**
73-
* @return all {@link ComplexType} instances from the {@link DefaultComplexType#instances} Map which extend this
74-
* Abstract Entity.
62+
* @return all {@link ComplexType} instances which extend this Abstract Entity.
7563
*/
7664
@Override
7765
public List<ComplexType> getExtendingElements() {
78-
return extendingElements.stream().map( instances::get ).filter( Objects::nonNull ).collect( Collectors.toList() );
79-
}
80-
81-
public static Map<AspectModelUrn, ComplexType> getInstances() {
82-
return Collections.unmodifiableMap( instances );
66+
if ( loadedElements == null ) {
67+
throw new RuntimeException( "No inheritance information is available." );
68+
}
69+
return loadedElements.getExtendingElements( extendingElements );
8370
}
8471

8572
@Override

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/impl/DefaultEntity.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,29 @@
2121
import org.eclipse.esmf.metamodel.Entity;
2222
import org.eclipse.esmf.metamodel.Property;
2323
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
24+
import org.eclipse.esmf.metamodel.loader.ModelElementFactory;
2425
import org.eclipse.esmf.metamodel.visitor.AspectVisitor;
2526

2627
public class DefaultEntity extends DefaultComplexType implements Entity {
2728

2829
public static DefaultEntity createDefaultEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
2930
final List<? extends Property> properties, final Optional<ComplexType> _extends ) {
30-
return new DefaultEntity( metaModelBaseAttributes, properties, _extends, Collections.emptyList() );
31+
return new DefaultEntity( metaModelBaseAttributes, properties, _extends, Collections.emptyList(), null );
3132
}
3233

3334
public DefaultEntity(
3435
final MetaModelBaseAttributes metaModelBaseAttributes,
3536
final List<? extends Property> properties ) {
36-
this( metaModelBaseAttributes, properties, Optional.empty(), Collections.emptyList() );
37+
this( metaModelBaseAttributes, properties, Optional.empty(), Collections.emptyList(), null );
3738
}
3839

3940
public DefaultEntity(
4041
final MetaModelBaseAttributes metaModelBaseAttributes,
4142
final List<? extends Property> properties,
4243
final Optional<ComplexType> _extends,
43-
final List<AspectModelUrn> extendingElements ) {
44-
super( metaModelBaseAttributes, properties, _extends, extendingElements );
44+
final List<AspectModelUrn> extendingElements,
45+
final ModelElementFactory loadedElements ) {
46+
super( metaModelBaseAttributes, properties, _extends, extendingElements, loadedElements );
4547
}
4648

4749
/**

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/loader/AspectModelLoader.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,27 @@
2727
import org.apache.jena.rdf.model.Resource;
2828
import org.apache.jena.rdf.model.Statement;
2929
import org.apache.jena.vocabulary.RDF;
30+
import org.eclipse.esmf.aspectmodel.UnsupportedVersionException;
31+
import org.eclipse.esmf.aspectmodel.resolver.AspectModelResolver;
3032
import org.eclipse.esmf.aspectmodel.resolver.FileSystemStrategy;
33+
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidModelException;
34+
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidNamespaceException;
35+
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidRootElementCountException;
36+
import org.eclipse.esmf.aspectmodel.resolver.services.VersionedModel;
37+
import org.eclipse.esmf.aspectmodel.versionupdate.MigratorService;
3138
import org.eclipse.esmf.aspectmodel.vocabulary.SAMM;
3239
import org.eclipse.esmf.metamodel.Aspect;
3340
import org.eclipse.esmf.metamodel.AspectContext;
3441
import org.eclipse.esmf.metamodel.ModelElement;
3542
import org.eclipse.esmf.metamodel.ModelNamespace;
3643
import org.eclipse.esmf.metamodel.NamedElement;
3744
import org.eclipse.esmf.metamodel.impl.DefaultModelNamespace;
45+
import org.eclipse.esmf.samm.KnownVersion;
3846
import org.slf4j.Logger;
3947
import org.slf4j.LoggerFactory;
4048

4149
import com.google.common.collect.ImmutableSet;
4250

43-
import org.eclipse.esmf.samm.KnownVersion;
44-
import org.eclipse.esmf.aspectmodel.UnsupportedVersionException;
45-
import org.eclipse.esmf.aspectmodel.resolver.AspectModelResolver;
46-
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidModelException;
47-
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidNamespaceException;
48-
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidRootElementCountException;
49-
import org.eclipse.esmf.aspectmodel.resolver.exceptions.InvalidVersionException;
50-
import org.eclipse.esmf.aspectmodel.resolver.services.VersionedModel;
51-
import org.eclipse.esmf.aspectmodel.versionupdate.MigratorService;
52-
5351
import io.vavr.control.Try;
5452

5553
/**
@@ -218,7 +216,7 @@ public static Aspect getSingleAspectUnchecked( final VersionedModel versionedMod
218216
throw new AspectLoadingException( cause );
219217
} );
220218
}
221-
219+
222220
/**
223221
* Similar to {@link #getSingleAspect(VersionedModel)}, except that a predicate can be provided to select which of potentially
224222
* multiple aspects should be selected
@@ -228,7 +226,7 @@ public static Aspect getSingleAspectUnchecked( final VersionedModel versionedMod
228226
*/
229227
public static Try<Aspect> getSingleAspect( final VersionedModel versionedModel, final Predicate<Aspect> selector ) {
230228
return getAspects( versionedModel ).flatMap( allAspects -> {
231-
final List<Aspect> aspects = allAspects.stream().filter( selector::test ).toList();
229+
final List<Aspect> aspects = allAspects.stream().filter( selector ).toList();
232230
return switch ( aspects.size() ) {
233231
case 1 -> Try.success( aspects.iterator().next() );
234232
case 0 -> Try.failure( new InvalidRootElementCountException( "No Aspects were found in the model" ) );

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/loader/ModelElementFactory.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
package org.eclipse.esmf.metamodel.loader;
1515

1616
import java.util.HashMap;
17+
import java.util.List;
1718
import java.util.Map;
19+
import java.util.Objects;
1820
import java.util.Optional;
1921
import java.util.Set;
2022
import java.util.function.Supplier;
@@ -27,19 +29,18 @@
2729
import org.apache.jena.rdf.model.Statement;
2830
import org.apache.jena.vocabulary.RDF;
2931
import org.apache.jena.vocabulary.RDFS;
30-
31-
import com.google.common.collect.Streams;
32-
33-
import org.eclipse.esmf.samm.KnownVersion;
3432
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
3533
import org.eclipse.esmf.aspectmodel.vocabulary.SAMM;
3634
import org.eclipse.esmf.aspectmodel.vocabulary.SAMMC;
3735
import org.eclipse.esmf.aspectmodel.vocabulary.UNIT;
36+
import org.eclipse.esmf.metamodel.ComplexType;
3837
import org.eclipse.esmf.metamodel.Entity;
3938
import org.eclipse.esmf.metamodel.ModelElement;
4039
import org.eclipse.esmf.metamodel.ModelNamespace;
4140
import org.eclipse.esmf.metamodel.QuantityKind;
41+
import org.eclipse.esmf.metamodel.QuantityKinds;
4242
import org.eclipse.esmf.metamodel.Unit;
43+
import org.eclipse.esmf.metamodel.Units;
4344
import org.eclipse.esmf.metamodel.impl.DefaultUnit;
4445
import org.eclipse.esmf.metamodel.loader.instantiator.AbstractEntityInstantiator;
4546
import org.eclipse.esmf.metamodel.loader.instantiator.AspectInstantiator;
@@ -72,9 +73,9 @@
7273
import org.eclipse.esmf.metamodel.loader.instantiator.StructuredValueInstantiator;
7374
import org.eclipse.esmf.metamodel.loader.instantiator.TimeSeriesInstantiator;
7475
import org.eclipse.esmf.metamodel.loader.instantiator.TraitInstantiator;
76+
import org.eclipse.esmf.samm.KnownVersion;
7577

76-
import org.eclipse.esmf.metamodel.QuantityKinds;
77-
import org.eclipse.esmf.metamodel.Units;
78+
import com.google.common.collect.Streams;
7879

7980
public class ModelElementFactory extends AttributeValueRetriever {
8081
private final KnownVersion metaModelVersion;
@@ -224,4 +225,12 @@ protected SAMMC getSammc() {
224225
public UNIT getUnit() {
225226
return unit;
226227
}
228+
229+
public List<ComplexType> getExtendingElements( final List<AspectModelUrn> extendingElements ) {
230+
return extendingElements.stream().map( urn -> getModel().createResource( urn.toString() ) )
231+
.map( loadedElements::get )
232+
.filter( Objects::nonNull )
233+
.map( modelElement -> (ComplexType) modelElement )
234+
.collect( Collectors.toList() );
235+
}
227236
}

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/loader/instantiator/AbstractEntityInstantiator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ public AbstractEntityInstantiator( final ModelElementFactory modelElementFactory
3232

3333
@Override
3434
protected AbstractEntity createDefaultEntity(
35-
MetaModelBaseAttributes metaModelBaseAttributes,
36-
List<Property> properties,
37-
Optional<ComplexType> extendedEntity,
38-
List<AspectModelUrn> extendingComplexTypes ) {
35+
final MetaModelBaseAttributes metaModelBaseAttributes,
36+
final List<Property> properties,
37+
final Optional<ComplexType> extendedEntity,
38+
final List<AspectModelUrn> extendingComplexTypes ) {
3939
return new DefaultAbstractEntity(
4040
metaModelBaseAttributes,
4141
properties,
4242
extendedEntity,
43-
extendingComplexTypes );
43+
extendingComplexTypes,
44+
modelElementFactory );
4445
}
4546
}

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/loader/instantiator/ComplexTypeInstantiator.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.eclipse.esmf.metamodel.Entity;
3333
import org.eclipse.esmf.metamodel.Property;
3434
import org.eclipse.esmf.metamodel.impl.DefaultAbstractEntity;
35-
import org.eclipse.esmf.metamodel.impl.DefaultComplexType;
3635
import org.eclipse.esmf.metamodel.loader.Instantiator;
3736
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
3837
import org.eclipse.esmf.metamodel.loader.ModelElementFactory;
@@ -59,18 +58,12 @@ public ComplexTypeInstantiator( final ModelElementFactory modelElementFactory, f
5958
* {@link Aspect} whether they are directly linked to that Aspect or not. This
6059
* scenario may occur for example when the Aspect Model contains a {@link Collection}
6160
* with an {@link AbstractEntity} as its data type with multiple Entities extending the {@link AbstractEntity}.
62-
*
63-
* In order to prevent processing elements in this circular dependency more than once, causing an infinite loop,
64-
* the elements which are processed are tracked in the {@link AbstractEntityInstantiator#processedExtendingElements}
65-
* {@link Set}.
66-
* Using the {@link DefaultComplexType#instances} Map to check whether an
67-
* element has been processed does not work since the instance is only created once the `create` method of the
68-
* corresponding {@link ComplexType} has been called. Creating the child elements however happens before this call.
6961
*/
7062
@Override
7163
public T apply( final Resource resource ) {
72-
if ( creatingElements.containsKey( resource ) )
64+
if ( creatingElements.containsKey( resource ) ) {
7365
return creatingElements.get( resource );
66+
}
7467

7568
final MetaModelBaseAttributes metaModelBaseAttributes = buildBaseAttributes( resource );
7669
final List<Property> properties = getPropertiesModels( resource, samm.properties() );
@@ -79,7 +72,7 @@ public T apply( final Resource resource ) {
7972

8073
final List<AspectModelUrn> extending = new ArrayList<>();
8174

82-
T entity = createDefaultEntity( metaModelBaseAttributes, properties, extendedEntity, extending );
75+
final T entity = createDefaultEntity( metaModelBaseAttributes, properties, extendedEntity, extending );
8376

8477
creatingElements.put( resource, entity );
8578

@@ -88,7 +81,7 @@ public T apply( final Resource resource ) {
8881
return entity;
8982
}
9083

91-
private List<AspectModelUrn> getExtending( Resource resource ) {
84+
private List<AspectModelUrn> getExtending( final Resource resource ) {
9285
return model.listSubjectsWithProperty( samm._extends(), resource )
9386
.mapWith( extendingComplexType -> attributeValue( extendingComplexType, RDF.type ) ).mapWith( statement -> {
9487
if ( processedExtendingElements.contains( statement.getSubject() ) ) {
@@ -102,7 +95,7 @@ private List<AspectModelUrn> getExtending( Resource resource ) {
10295
} ).toList();
10396
}
10497

105-
protected Optional<ComplexType> getExtendedEntity( Resource resource ) {
98+
protected Optional<ComplexType> getExtendedEntity( final Resource resource ) {
10699
return optionalAttributeValue( resource, samm._extends() )
107100
.map( Statement::getResource )
108101
.map( extendedEntityResource -> attributeValue( extendedEntityResource, RDF.type ) )

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/loader/instantiator/EntityInstantiator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,15 @@ public EntityInstantiator( final ModelElementFactory modelElementFactory ) {
3131

3232
@Override
3333
protected Entity createDefaultEntity(
34-
MetaModelBaseAttributes metaModelBaseAttributes,
35-
List<Property> properties,
36-
Optional<ComplexType> extendedEntity,
37-
List<AspectModelUrn> extendingComplexTypes ) {
34+
final MetaModelBaseAttributes metaModelBaseAttributes,
35+
final List<Property> properties,
36+
final Optional<ComplexType> extendedEntity,
37+
final List<AspectModelUrn> extendingComplexTypes ) {
3838
return new DefaultEntity(
3939
metaModelBaseAttributes,
4040
properties,
4141
extendedEntity,
42-
extendingComplexTypes );
42+
extendingComplexTypes,
43+
modelElementFactory );
4344
}
4445
}

0 commit comments

Comments
 (0)