From 431182e4d0533d56a9ccd1937a94d16f54321e0d Mon Sep 17 00:00:00 2001 From: Yauhenikapl Date: Tue, 28 May 2024 12:47:20 +0300 Subject: [PATCH 1/5] Add semanticId to all list elements fixes #522 --- .../aspectmodel/aas/AspectModelAasVisitor.java | 14 +++++++++++++- .../aas/AspectModelAasGeneratorTest.java | 8 +++++++- 2 files changed, 20 insertions(+), 2 deletions(-) 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..e7291c518 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 @@ -238,7 +238,7 @@ public Environment visitAspect( final Aspect aspect, final Context context ) { private List visitOperations( final List elements, final Context context ) { - return elements.stream().map( i -> mapText( i, context ) ).collect( Collectors.toList() ); + return elements.stream().map( i -> mapText( i, context ) ).collect( Collectors.toList()); } private List visitProperties( final List elements, final Context context ) { @@ -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.SUBMODEL_ELEMENT_COLLECTION ) + .value( submodelId ) + .build(); + return new DefaultReference.Builder() + .type( ReferenceTypes.MODEL_REFERENCE ) + .keys( key ) + .build(); + } + private void createConceptDescription( final Property property, final Context context ) { if ( property.getCharacteristic().isEmpty() ) { return; @@ -545,6 +556,7 @@ private Environment visitCollectionProperty( final T coll final SubmodelElementBuilder builder = property -> new DefaultSubmodelElementList.Builder() .idShort( property.getName() ) + .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isEmpty() ? collection.getName() : collection.getAspectModelUrn().get().getUrn().toString() ) ) .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) 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..fbb82f27a 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.SUBMODEL_ELEMENT_COLLECTION ); + 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.SUBMODEL_ELEMENT_COLLECTION ); + 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.SUBMODEL_ELEMENT_COLLECTION ); 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.SUBMODEL_ELEMENT_COLLECTION ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } From 9bb52295ba8a7fd4c2a106ac29a466c602a7ef93 Mon Sep 17 00:00:00 2001 From: Yauhenikapl Date: Tue, 28 May 2024 12:54:33 +0300 Subject: [PATCH 2/5] Fix styles --- .../eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 e7291c518..2001021c6 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 @@ -238,7 +238,7 @@ public Environment visitAspect( final Aspect aspect, final Context context ) { private List visitOperations( final List elements, final Context context ) { - return elements.stream().map( i -> mapText( i, context ) ).collect( Collectors.toList()); + return elements.stream().map( i -> mapText( i, context ) ).collect( Collectors.toList() ); } private List visitProperties( final List elements, final Context context ) { @@ -556,7 +556,9 @@ private Environment visitCollectionProperty( final T coll final SubmodelElementBuilder builder = property -> new DefaultSubmodelElementList.Builder() .idShort( property.getName() ) - .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isEmpty() ? collection.getName() : collection.getAspectModelUrn().get().getUrn().toString() ) ) + .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isEmpty() ? + collection.getName() : + collection.getAspectModelUrn().get().getUrn().toString() ) ) .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) From d35629fd2f0f73ebd5f65b7f07d941719f5267ab Mon Sep 17 00:00:00 2001 From: Yauhenikapl Date: Tue, 28 May 2024 12:59:01 +0300 Subject: [PATCH 3/5] Fix check style --- .../eclipse/esmf/aspectmodel/aas/AspectModelAasVisitor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 2001021c6..60baf3c20 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 @@ -556,9 +556,8 @@ private Environment visitCollectionProperty( final T coll final SubmodelElementBuilder builder = property -> new DefaultSubmodelElementList.Builder() .idShort( property.getName() ) - .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isEmpty() ? - collection.getName() : - collection.getAspectModelUrn().get().getUrn().toString() ) ) + .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isPresent() + ? collection.getAspectModelUrn().get().getUrn().toString() : collection.getName() ) ) .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) From b143848ba8e43a0d2f269a6a46b77cb6d41d289c Mon Sep 17 00:00:00 2001 From: Yauhenikapl Date: Tue, 28 May 2024 15:12:12 +0300 Subject: [PATCH 4/5] Update generation of semantic id for Collection --- .../esmf/aspectmodel/aas/AspectModelAasVisitor.java | 6 +++--- .../esmf/aspectmodel/aas/AspectModelAasGeneratorTest.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) 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 60baf3c20..88e08db3f 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 @@ -387,11 +387,11 @@ private Reference buildReferenceForSubmodel( final String submodelId ) { private Reference buildReferenceForCollection( final String submodelId ) { final Key key = new DefaultKey.Builder() - .type( KeyTypes.SUBMODEL_ELEMENT_COLLECTION ) + .type( KeyTypes.GLOBAL_REFERENCE ) .value( submodelId ) .build(); return new DefaultReference.Builder() - .type( ReferenceTypes.MODEL_REFERENCE ) + .type( ReferenceTypes.EXTERNAL_REFERENCE ) .keys( key ) .build(); } @@ -557,7 +557,7 @@ private Environment visitCollectionProperty( final T coll new DefaultSubmodelElementList.Builder() .idShort( property.getName() ) .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isPresent() - ? collection.getAspectModelUrn().get().getUrn().toString() : collection.getName() ) ) + ? collection.getAspectModelUrn().get().getUrn().toString() : property.getName() + "Characteristic" ) ) .typeValueListElement( AasSubmodelElements.DATA_ELEMENT ) .displayName( LangStringMapper.NAME.map( property.getPreferredNames() ) ) .description( LangStringMapper.TEXT.map( property.getDescriptions() ) ) 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 fbb82f27a..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 @@ -168,7 +168,7 @@ void testGenerateAasxFromAspectModelWithCollection() throws DeserializationExcep assertThat( submodelElementList.getTypeValueListElement() ).isEqualTo( AasSubmodelElements.SUBMODEL_ELEMENT ); } ); - assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.SUBMODEL_ELEMENT_COLLECTION ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -185,7 +185,7 @@ void testGenerateAasxFromAspectModelWithList() throws DeserializationException { assertThat( submodelElementList.getTypeValueListElement() ).isEqualTo( AasSubmodelElements.SUBMODEL_ELEMENT ); } ); - assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.SUBMODEL_ELEMENT_COLLECTION ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -201,7 +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.SUBMODEL_ELEMENT_COLLECTION ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } @@ -214,7 +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.SUBMODEL_ELEMENT_COLLECTION ); + assertThat( submodelElement.getSemanticId().getKeys().get( 0 ).getType() ).isEqualTo( KeyTypes.GLOBAL_REFERENCE ); getDataSpecificationIec61360( "urn:samm:org.eclipse.esmf.test:1.0.0#testProperty", env ); } From 5d13c540d0dc09d9ac850af82086b439e63b2807 Mon Sep 17 00:00:00 2001 From: Yauhenikapl Date: Wed, 29 May 2024 15:56:56 +0300 Subject: [PATCH 5/5] Update generation of semantic id for Collection --- .../aas/AspectModelAasVisitor.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) 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 88e08db3f..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 @@ -553,18 +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() ) - .semanticId( buildReferenceForCollection( collection.getAspectModelUrn().isPresent() - ? collection.getAspectModelUrn().get().getUrn().toString() : property.getName() + "Characteristic" ) ) - .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 ) {