diff --git a/core/esmf-aspect-model-aas-generator/src/main/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java b/core/esmf-aspect-model-aas-generator/src/main/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java index e7bf454c0..5c59d5645 100644 --- a/core/esmf-aspect-model-aas-generator/src/main/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java +++ b/core/esmf-aspect-model-aas-generator/src/main/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java @@ -385,6 +385,17 @@ private Reference buildReferenceForSubmodel( final String submodelId ) { .build(); } + private Reference buildReferenceForCollection( final String submodelId ) { + final Key key = new DefaultKey.Builder() + .type( KeyTypes.GLOBAL_REFERENCE ) + .value( submodelId ) + .build(); + return new DefaultReference.Builder() + .type( ReferenceTypes.EXTERNAL_REFERENCE ) + .keys( key ) + .build(); + } + private void createConceptDescription( final Property property, final Context context ) { if ( property.getCharacteristic().isEmpty() ) { return; @@ -542,16 +553,23 @@ public Environment visitSortedSet( final SortedSet sortedSet, final Context cont } private Environment visitCollectionProperty( final T collection, final Context context ) { - final SubmodelElementBuilder builder = property -> - new DefaultSubmodelElementList.Builder() - .idShort( property.getName() ) - .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) - .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) - .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) - .value( List.of( decideOnMapping( property, context ) ) ) - .typeValueListElement( AasSubmodelElements.SUBMODEL_ELEMENT ) - .supplementalSemanticIds( buildGlobalReferenceForSeeReferences( collection ) ) - .build(); + final SubmodelElementBuilder builder = property -> { + DefaultSubmodelElementList.Builder submodelBuilder = new DefaultSubmodelElementList.Builder() + .idShort( property.getName() ) + .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) + .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) + .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) + .value( List.of( decideOnMapping( property, context ) ) ) + .typeValueListElement( AasSubmodelElements.SUBMODEL_ELEMENT ) + .supplementalSemanticIds( buildGlobalReferenceForSeeReferences( collection ) ); + + if ( collection.getAspectModelUrn().isPresent() ) { + submodelBuilder.semanticId( buildReferenceForCollection( collection.getAspectModelUrn().get().getUrn().toString() ) ); + } + + return submodelBuilder.build(); + }; + final Optional rawValue = context.getRawPropertyValue(); return rawValue.map( node -> { if ( node instanceof final ArrayNode arrayNode ) { diff --git a/core/esmf-aspect-model-aas-generator/src/test/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasGeneratorTest.java b/core/esmf-aspect-model-aas-generator/src/test/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasGeneratorTest.java index 85a480a40..c5428bd21 100644 --- a/core/esmf-aspect-model-aas-generator/src/test/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasGeneratorTest.java +++ b/core/esmf-aspect-model-aas-generator/src/test/java/org/eclipse/esmf/aspectmodel/aas/AspectModelAasGeneratorTest.java @@ -81,7 +81,7 @@ void generateAasxWithAspectDataForMultilanguageText() throws DeserializationExce .asList() .hasSize( 2 ) .allSatisfy( langString -> - assertThat( List.of( "en", "de" ) ).contains( ( (AbstractLangString) langString ).getLanguage() ) ) ) ); + assertThat( List.of( "en", "de" ) ).contains( ((AbstractLangString) langString).getLanguage() ) ) ) ); } @Test @@ -168,6 +168,8 @@ void testGenerateAasxFromAspectModelWithCollection() throws DeserializationExcep assertThat( submodelElementList.getTypeValueListElement() ).isEqualTo( AasSubmodelElements.SUBMODEL_ELEMENT ); } ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); + getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -183,6 +185,8 @@ void testGenerateAasxFromAspectModelWithList() throws DeserializationException { assertThat( submodelElementList.getTypeValueListElement() ).isEqualTo( AasSubmodelElements.SUBMODEL_ELEMENT ); } ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); + getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -197,6 +201,7 @@ void testGenerateAasxFromAspectModelWithSet() throws DeserializationException { assertThat( submodelElementList.getIdShort() ).isEqualTo( "testProperty" ); assertThat( submodelElementList.getTypeValueListElement() ).isEqualTo( AasSubmodelElements.SUBMODEL_ELEMENT ); } ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -209,6 +214,7 @@ void testGenerateAasxFromAspectModelWithSortedSet() throws DeserializationExcept final SubmodelElement submodelElement = env.getSubmodels().get( 0 ).getSubmodelElements().get( 0 ); assertThat( submodelElement ).as( "SubmodelElement is not a SubmodelElementList" ).isInstanceOf( SubmodelElementList.class ); assertThat( submodelElement.getIdShort() ).isEqualTo( "testProperty" ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); }