Skip to content

Commit 1f2f692

Browse files
ysrboatextor
authored andcommitted
Fixed issue with generating java code for entities extend non-abstract entities.
#258
1 parent 245b39e commit 1f2f692

File tree

11 files changed

+242
-175
lines changed

11 files changed

+242
-175
lines changed

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,13 @@
1313

1414
package org.eclipse.esmf.metamodel;
1515

16-
import java.util.Collections;
17-
import java.util.List;
18-
1916
/**
2017
* Represents a generic domain specific concept which may have multiple specific variants.
2118
*
2219
* @since SAMM 2.0.0
2320
*/
2421
public interface AbstractEntity extends ComplexType {
2522

26-
/**
27-
* @return a {@link java.util.List} of {@link ComplexType}s which extend this Abstract Entity
28-
*/
29-
default List<ComplexType> getExtendingElements() {
30-
return Collections.emptyList();
31-
}
32-
3323
@Override
3424
default boolean isAbstractEntity() {
3525
return true;

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

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

1616
import java.util.Collection;
17+
import java.util.Collections;
1718
import java.util.List;
1819
import java.util.Optional;
1920
import java.util.stream.Collectors;
@@ -24,6 +25,13 @@
2425
*/
2526
public interface ComplexType extends Type, StructureElement {
2627

28+
/**
29+
* @return a {@link java.util.List} of {@link ComplexType}s which extend this Entity
30+
*/
31+
default List<ComplexType> getExtendingElements() {
32+
return Collections.emptyList();
33+
}
34+
2735
default boolean isAbstractEntity() {
2836
return false;
2937
}

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

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

1616
import java.util.List;
17-
import java.util.Objects;
1817
import java.util.Optional;
19-
import java.util.stream.Collectors;
2018

2119
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
2220
import org.eclipse.esmf.metamodel.AbstractEntity;
@@ -26,34 +24,19 @@
2624
import org.eclipse.esmf.metamodel.visitor.AspectVisitor;
2725

2826
public class DefaultAbstractEntity extends DefaultComplexType implements AbstractEntity {
29-
30-
private final List<AspectModelUrn> extendingElements;
31-
3227
public static DefaultAbstractEntity createDefaultAbstractEntity(
3328
final MetaModelBaseAttributes metaModelBaseAttributes,
3429
final List<? extends Property> properties,
3530
final Optional<ComplexType> _extends,
3631
final List<AspectModelUrn> extendingElements ) {
37-
final DefaultAbstractEntity defaultAbstractEntity = new DefaultAbstractEntity( metaModelBaseAttributes, properties, _extends, extendingElements );
38-
instances.put( metaModelBaseAttributes.getUrn().get(), defaultAbstractEntity );
39-
return defaultAbstractEntity;
32+
return new DefaultAbstractEntity( metaModelBaseAttributes, properties, _extends, extendingElements );
4033
}
4134

42-
private DefaultAbstractEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
35+
public DefaultAbstractEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
4336
final List<? extends Property> properties,
4437
final Optional<ComplexType> _extends,
4538
final List<AspectModelUrn> extendingElements ) {
46-
super( metaModelBaseAttributes, properties, _extends );
47-
this.extendingElements = extendingElements;
48-
}
49-
50-
/**
51-
* @return all {@link ComplexType} instances from the {@link DefaultComplexType#instances} Map which extend this
52-
* Abstract Entity.
53-
*/
54-
@Override
55-
public List<ComplexType> getExtendingElements() {
56-
return extendingElements.stream().map( instances::get ).filter( Objects::nonNull ).collect( Collectors.toList() );
39+
super( metaModelBaseAttributes, properties, _extends, extendingElements );
5740
}
5841

5942
/**

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import java.util.Collections;
1818
import java.util.List;
1919
import java.util.Map;
20+
import java.util.Objects;
2021
import java.util.Optional;
2122
import java.util.WeakHashMap;
23+
import java.util.stream.Collectors;
2224

2325
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
2426
import org.eclipse.esmf.metamodel.Aspect;
@@ -33,23 +35,23 @@ public class DefaultComplexType extends ModelElementImpl implements ComplexType
3335
* Used to keep track of all {@link ComplexType} instances regardles of whether they are directly or indirectly
3436
* referenced in the {@link Aspect}.
3537
*/
36-
protected static WeakHashMap<AspectModelUrn, ComplexType> instances = new WeakHashMap<>();
38+
private static final WeakHashMap<AspectModelUrn, ComplexType> instances = new WeakHashMap<>();
3739

3840
private final List<Property> properties;
3941
private final Optional<ComplexType> _extends;
42+
private final List<AspectModelUrn> extendingElements;
4043

41-
protected static DefaultComplexType createDefaultComplexType( final MetaModelBaseAttributes metaModelBaseAttributes,
42-
final List<? extends Property> properties, final Optional<ComplexType> _extends ) {
43-
final DefaultComplexType defaultComplexType = new DefaultComplexType( metaModelBaseAttributes, properties, _extends );
44-
instances.put( metaModelBaseAttributes.getUrn().get(), defaultComplexType );
45-
return defaultComplexType;
46-
}
47-
48-
protected DefaultComplexType( final MetaModelBaseAttributes metaModelBaseAttributes, final List<? extends Property> properties,
49-
final Optional<ComplexType> _extends ) {
44+
protected DefaultComplexType(
45+
final MetaModelBaseAttributes metaModelBaseAttributes,
46+
final List<? extends Property> properties,
47+
final Optional<ComplexType> _extends,
48+
final List<AspectModelUrn> extendingElements ) {
5049
super( metaModelBaseAttributes );
50+
//noinspection OptionalGetWithoutIsPresent
51+
instances.put( metaModelBaseAttributes.getUrn().get(), this );
5152
this.properties = new ArrayList<>( properties );
5253
this._extends = _extends;
54+
this.extendingElements = extendingElements;
5355
}
5456

5557
/**
@@ -67,6 +69,15 @@ public Optional<ComplexType> getExtends() {
6769
return _extends;
6870
}
6971

72+
/**
73+
* @return all {@link ComplexType} instances from the {@link DefaultComplexType#instances} Map which extend this
74+
* Abstract Entity.
75+
*/
76+
@Override
77+
public List<ComplexType> getExtendingElements() {
78+
return extendingElements.stream().map( instances::get ).filter( Objects::nonNull ).collect( Collectors.toList() );
79+
}
80+
7081
public static Map<AspectModelUrn, ComplexType> getInstances() {
7182
return Collections.unmodifiableMap( instances );
7283
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
*/
1313
package org.eclipse.esmf.metamodel.impl;
1414

15+
import java.util.Collections;
1516
import java.util.List;
1617
import java.util.Optional;
1718

19+
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
1820
import org.eclipse.esmf.metamodel.ComplexType;
1921
import org.eclipse.esmf.metamodel.Entity;
2022
import org.eclipse.esmf.metamodel.Property;
@@ -25,15 +27,21 @@ public class DefaultEntity extends DefaultComplexType implements Entity {
2527

2628
public static DefaultEntity createDefaultEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
2729
final List<? extends Property> properties, final Optional<ComplexType> _extends ) {
28-
final DefaultEntity defaultEntity = new DefaultEntity( metaModelBaseAttributes, properties, _extends );
29-
instances.put( metaModelBaseAttributes.getUrn().get(), defaultEntity );
30-
return defaultEntity;
30+
return new DefaultEntity( metaModelBaseAttributes, properties, _extends, Collections.emptyList() );
3131
}
3232

33-
private DefaultEntity( final MetaModelBaseAttributes metaModelBaseAttributes,
33+
public DefaultEntity(
34+
final MetaModelBaseAttributes metaModelBaseAttributes,
35+
final List<? extends Property> properties ) {
36+
this( metaModelBaseAttributes, properties, Optional.empty(), Collections.emptyList() );
37+
}
38+
39+
public DefaultEntity(
40+
final MetaModelBaseAttributes metaModelBaseAttributes,
3441
final List<? extends Property> properties,
35-
final Optional<ComplexType> _extends ) {
36-
super( metaModelBaseAttributes, properties, _extends );
42+
final Optional<ComplexType> _extends,
43+
final List<AspectModelUrn> extendingElements ) {
44+
super( metaModelBaseAttributes, properties, _extends, extendingElements );
3745
}
3846

3947
/**

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

Lines changed: 12 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -13,86 +13,33 @@
1313

1414
package org.eclipse.esmf.metamodel.loader.instantiator;
1515

16-
import java.util.*;
17-
18-
import org.apache.jena.rdf.model.Resource;
19-
import org.apache.jena.rdf.model.Statement;
20-
import org.apache.jena.vocabulary.RDF;
16+
import java.util.List;
17+
import java.util.Optional;
2118

2219
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
23-
import org.eclipse.esmf.characteristic.Collection;
2420
import org.eclipse.esmf.metamodel.AbstractEntity;
2521
import org.eclipse.esmf.metamodel.ComplexType;
26-
import org.eclipse.esmf.metamodel.Entity;
27-
import org.eclipse.esmf.metamodel.Aspect;
2822
import org.eclipse.esmf.metamodel.Property;
2923
import org.eclipse.esmf.metamodel.impl.DefaultAbstractEntity;
30-
import org.eclipse.esmf.metamodel.impl.DefaultComplexType;
31-
import org.eclipse.esmf.metamodel.loader.Instantiator;
3224
import org.eclipse.esmf.metamodel.loader.MetaModelBaseAttributes;
3325
import org.eclipse.esmf.metamodel.loader.ModelElementFactory;
3426

35-
public class AbstractEntityInstantiator extends Instantiator<AbstractEntity> {
36-
37-
private final Set<Resource> processedExtendingElements = new HashSet<>();
38-
private final Map<Resource, AbstractEntity> creatingElements = new HashMap<>();
27+
public class AbstractEntityInstantiator extends ComplexTypeInstantiator<AbstractEntity> {
3928

4029
public AbstractEntityInstantiator( final ModelElementFactory modelElementFactory ) {
4130
super( modelElementFactory, AbstractEntity.class );
4231
}
4332

44-
/**
45-
* Initializes a {@link DefaultAbstractEntity}.
46-
* Since {@link ComplexType}s have a reference to the element which is extended by a particular {@link ComplexType},
47-
* and the {@link AbstractEntity} has a list of references to all elements which extend the {@link AbstractEntity},
48-
* a circular dependency exists between the {@link ComplexType} and the {@link AbstractEntity}.
49-
*
50-
* The reference between the {@link ComplexType}s represents the `extends` relationship between an {@link Entity} or
51-
* an {@link AbstractEntity} and another {@link Entity} or {@link AbstractEntity}.
52-
* The list of references between an {@link AbstractEntity} and all {@link ComplexType}s extending the
53-
* {@link AbstractEntity} has been implemented to ensure that all extending {@link ComplexType}s are loaded into the
54-
* {@link Aspect} whether they are directly linked to that Aspect or not. This
55-
* scenario may occur for example when the Aspect Model contains a {@link Collection}
56-
* with an {@link AbstractEntity} as its data type with multiple Entities extending the {@link AbstractEntity}.
57-
*
58-
* In order to prevent processing elements in this circular dependency more than once, causing an infinite loop,
59-
* the elements which are processed are tracked in the {@link AbstractEntityInstantiator#processedExtendingElements}
60-
* {@link Set}.
61-
* Using the {@link DefaultComplexType#instances} Map to check whether an
62-
* element has been processed does not work since the instance is only created once the `create` method of the
63-
* corresponding {@link ComplexType} has been called. Creating the child elements however happens before this call.
64-
*/
6533
@Override
66-
public AbstractEntity apply( final Resource abstractEntity ) {
67-
if ( creatingElements.containsKey( abstractEntity ) )
68-
return creatingElements.get( abstractEntity );
69-
final MetaModelBaseAttributes metaModelBaseAttributes = buildBaseAttributes( abstractEntity );
70-
final List<Property> properties = getPropertiesModels( abstractEntity, samm.properties() );
71-
72-
final Optional<ComplexType> extendedEntity = optionalAttributeValue( abstractEntity, samm._extends() ).map( Statement::getResource )
73-
.map( extendedEntityResource -> attributeValue( extendedEntityResource, RDF.type ) ).map( entityStatement -> {
74-
if ( samm.AbstractEntity().equals( entityStatement.getObject().asResource() ) ) {
75-
return modelElementFactory.create( AbstractEntity.class, entityStatement.getSubject() );
76-
}
77-
return modelElementFactory.create( Entity.class, entityStatement.getSubject() );
78-
} );
79-
80-
final List<AspectModelUrn> extendingComplexTypes = new ArrayList<>();
81-
DefaultAbstractEntity entity = DefaultAbstractEntity.createDefaultAbstractEntity( metaModelBaseAttributes, properties, extendedEntity,
34+
protected AbstractEntity createDefaultEntity(
35+
MetaModelBaseAttributes metaModelBaseAttributes,
36+
List<Property> properties,
37+
Optional<ComplexType> extendedEntity,
38+
List<AspectModelUrn> extendingComplexTypes ) {
39+
return new DefaultAbstractEntity(
40+
metaModelBaseAttributes,
41+
properties,
42+
extendedEntity,
8243
extendingComplexTypes );
83-
creatingElements.put( abstractEntity, entity );
84-
extendingComplexTypes.addAll( model.listSubjectsWithProperty( samm._extends(), abstractEntity )
85-
.mapWith( extendingComplexType -> attributeValue( extendingComplexType, RDF.type ) ).mapWith( statement -> {
86-
if ( processedExtendingElements.contains( statement.getSubject() ) ) {
87-
return AspectModelUrn.fromUrn( statement.getSubject().getURI() );
88-
}
89-
processedExtendingElements.add( statement.getSubject() );
90-
if ( samm.AbstractEntity().equals( statement.getObject().asResource() ) ) {
91-
return modelElementFactory.create( AbstractEntity.class, statement.getSubject() ).getAspectModelUrn().get();
92-
}
93-
return modelElementFactory.create( Entity.class, statement.getSubject() ).getAspectModelUrn().get();
94-
} ).toList() );
95-
creatingElements.remove( abstractEntity );
96-
return entity;
9744
}
9845
}

0 commit comments

Comments
 (0)