Skip to content

Commit 5deb6e6

Browse files
committed
Improve error message for recursive Properties in AASGenerator
1 parent 13852d9 commit 5deb6e6

File tree

1 file changed

+33
-48
lines changed

1 file changed

+33
-48
lines changed

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

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,25 @@
7171
import io.adminshell.aas.v3.model.impl.DefaultSubmodelElementCollection;
7272
import io.adminshell.aas.v3.model.impl.DefaultValueList;
7373
import io.adminshell.aas.v3.model.impl.DefaultValueReferencePair;
74-
import io.openmanufacturing.sds.metamodel.Aspect;
75-
import io.openmanufacturing.sds.metamodel.ModelElement;
76-
import io.openmanufacturing.sds.metamodel.Characteristic;
74+
import io.openmanufacturing.sds.aspectmodel.urn.AspectModelUrn;
7775
import io.openmanufacturing.sds.characteristic.Code;
7876
import io.openmanufacturing.sds.characteristic.Collection;
7977
import io.openmanufacturing.sds.characteristic.Duration;
8078
import io.openmanufacturing.sds.characteristic.Either;
81-
import io.openmanufacturing.sds.metamodel.Entity;
8279
import io.openmanufacturing.sds.characteristic.Enumeration;
83-
import io.openmanufacturing.sds.metamodel.NamedElement;
8480
import io.openmanufacturing.sds.characteristic.Measurement;
85-
import io.openmanufacturing.sds.metamodel.Property;
8681
import io.openmanufacturing.sds.characteristic.Quantifiable;
8782
import io.openmanufacturing.sds.characteristic.SingleEntity;
8883
import io.openmanufacturing.sds.characteristic.SortedSet;
8984
import io.openmanufacturing.sds.characteristic.State;
9085
import io.openmanufacturing.sds.characteristic.StructuredValue;
9186
import io.openmanufacturing.sds.characteristic.Trait;
87+
import io.openmanufacturing.sds.metamodel.Aspect;
88+
import io.openmanufacturing.sds.metamodel.Characteristic;
89+
import io.openmanufacturing.sds.metamodel.Entity;
90+
import io.openmanufacturing.sds.metamodel.ModelElement;
91+
import io.openmanufacturing.sds.metamodel.NamedElement;
92+
import io.openmanufacturing.sds.metamodel.Property;
9293
import io.openmanufacturing.sds.metamodel.Type;
9394
import io.openmanufacturing.sds.metamodel.visitor.AspectVisitor;
9495

@@ -175,13 +176,11 @@ public AssetAdministrationShellEnvironment visitAspect( final Aspect aspect, Con
175176
return context.getEnvironment();
176177
}
177178

178-
private List<SubmodelElement> visitOperations(
179-
final List<io.openmanufacturing.sds.metamodel.Operation> elements, final Context context ) {
179+
private List<SubmodelElement> visitOperations( final List<io.openmanufacturing.sds.metamodel.Operation> elements, final Context context ) {
180180
return elements.stream().map( i -> map( i, context ) ).collect( Collectors.toList() );
181181
}
182182

183-
private List<SubmodelElement> visitProperties(
184-
final List<Property> elements, final Context context ) {
183+
private List<SubmodelElement> visitProperties( final List<Property> elements, final Context context ) {
185184
return elements.stream().map( i -> map( i, context ) ).collect( Collectors.toList() );
186185
}
187186

@@ -195,10 +194,12 @@ private SubmodelElement map( final Property property, final Context context ) {
195194
// property will be excluded from generation.
196195
recursiveProperty.remove( property );
197196
if ( property.isOptional() ) {
198-
LOG.warn( String.format( "Having a recursive Property %s which is optional. Will be excluded from AAS mapping.", property ) );
197+
LOG.warn( String.format( "Having a recursive Property %s which is optional. Will be excluded from AAS mapping.",
198+
property.getAspectModelUrn().map( AspectModelUrn::toString ).orElse( "(unknown)" ) ) );
199199
return defaultResultForProperty.get();
200200
} else {
201-
throw new IllegalArgumentException( String.format( "Having a recursive Property: %s which is not optional is not valid.", property ) );
201+
throw new IllegalArgumentException( String.format( "Having a recursive Property %s which is not optional is not valid.",
202+
property.getAspectModelUrn().map( AspectModelUrn::toString ).orElse( "(unknown)" ) ) );
202203
}
203204
}
204205
recursiveProperty.add( property );
@@ -228,17 +229,15 @@ private SubmodelElement decideOnMapping( final Property property, final Context
228229
return decideOnMapping( type, property, context );
229230
}
230231

231-
private SubmodelElement decideOnMapping(
232-
final Type type, final Property property, final Context context ) {
232+
private SubmodelElement decideOnMapping( final Type type, final Property property, final Context context ) {
233233
if ( type instanceof Entity ) {
234234
return mapToAasSubModelElementCollection( (Entity) type, context );
235235
} else {
236236
return mapToAasProperty( property );
237237
}
238238
}
239239

240-
private SubmodelElementCollection mapToAasSubModelElementCollection(
241-
final Entity entity, final Context context ) {
240+
private SubmodelElementCollection mapToAasSubModelElementCollection( final Entity entity, final Context context ) {
242241
final List<SubmodelElement> submodelElements =
243242
visitProperties( entity.getAllProperties(), context );
244243
return new DefaultSubmodelElementCollection.Builder()
@@ -273,8 +272,7 @@ private String mapType( final Type type ) {
273272
return type.getUrn();
274273
}
275274

276-
private Operation map(
277-
final io.openmanufacturing.sds.metamodel.Operation operation, final Context context ) {
275+
private Operation map( final io.openmanufacturing.sds.metamodel.Operation operation, final Context context ) {
278276
return new DefaultOperation.Builder()
279277
.displayNames( map( operation.getPreferredNames() ) )
280278
.descriptions( map( operation.getDescriptions() ) )
@@ -441,15 +439,13 @@ private DataTypeIEC61360 mapIEC61360DataType( final String urn ) {
441439
}
442440

443441
@Override
444-
public AssetAdministrationShellEnvironment visitCharacteristic(
445-
final Characteristic characteristic, final Context context ) {
442+
public AssetAdministrationShellEnvironment visitCharacteristic( final Characteristic characteristic, final Context context ) {
446443
createSubmodelElement( ( property ) -> decideOnMapping( property, context ), context );
447444
return context.environment;
448445
}
449446

450447
@Override
451-
public AssetAdministrationShellEnvironment visitCollection(
452-
final Collection collection, final Context context ) {
448+
public AssetAdministrationShellEnvironment visitCollection( final Collection collection, final Context context ) {
453449
final SubmodelElementBuilder builder =
454450
( property ) ->
455451
new DefaultSubmodelElementCollection.Builder()
@@ -464,8 +460,7 @@ public AssetAdministrationShellEnvironment visitCollection(
464460
}
465461

466462
@Override
467-
public AssetAdministrationShellEnvironment visitList(
468-
final io.openmanufacturing.sds.characteristic.List list, final Context context ) {
463+
public AssetAdministrationShellEnvironment visitList( final io.openmanufacturing.sds.characteristic.List list, final Context context ) {
469464
final SubmodelElementBuilder builder =
470465
( property ) ->
471466
new DefaultSubmodelElementCollection.Builder()
@@ -480,8 +475,7 @@ public AssetAdministrationShellEnvironment visitList(
480475
}
481476

482477
@Override
483-
public AssetAdministrationShellEnvironment visitSet(
484-
final io.openmanufacturing.sds.characteristic.Set set, final Context context ) {
478+
public AssetAdministrationShellEnvironment visitSet( final io.openmanufacturing.sds.characteristic.Set set, final Context context ) {
485479
final SubmodelElementBuilder builder =
486480
( property ) ->
487481
new DefaultSubmodelElementCollection.Builder()
@@ -497,8 +491,7 @@ public AssetAdministrationShellEnvironment visitSet(
497491
}
498492

499493
@Override
500-
public AssetAdministrationShellEnvironment visitSortedSet(
501-
final SortedSet sortedSet, final Context context ) {
494+
public AssetAdministrationShellEnvironment visitSortedSet( final SortedSet sortedSet, final Context context ) {
502495
final SubmodelElementBuilder builder =
503496
( property ) ->
504497
new DefaultSubmodelElementCollection.Builder()
@@ -517,8 +510,7 @@ public AssetAdministrationShellEnvironment visitSortedSet(
517510
// No possibilities to mark the SubmodelElements as optional. So both are either options are
518511
// in the result and have to be manually selected.
519512
@Override
520-
public AssetAdministrationShellEnvironment visitEither(
521-
final Either either, final Context context ) {
513+
public AssetAdministrationShellEnvironment visitEither( final Either either, final Context context ) {
522514
final List<SubmodelElement> submodelElements = new ArrayList<>();
523515
if ( either.getLeft().getDataType().isPresent() ) {
524516
submodelElements.add(
@@ -540,8 +532,7 @@ public AssetAdministrationShellEnvironment visitEither(
540532
}
541533

542534
@Override
543-
public AssetAdministrationShellEnvironment visitQuantifiable(
544-
final Quantifiable quantifiable, final Context context ) {
535+
public AssetAdministrationShellEnvironment visitQuantifiable( final Quantifiable quantifiable, final Context context ) {
545536
createSubmodelElement( ( property ) -> decideOnMapping( property, context ), context );
546537

547538
if ( quantifiable.getUnit().isPresent() ) {
@@ -560,22 +551,19 @@ public AssetAdministrationShellEnvironment visitQuantifiable(
560551
}
561552

562553
@Override
563-
public AssetAdministrationShellEnvironment visitMeasurement(
564-
final Measurement measurement, final Context context ) {
554+
public AssetAdministrationShellEnvironment visitMeasurement( final Measurement measurement, final Context context ) {
565555
// No special handling required can use Quantifiable mapping implementation
566556
return visitQuantifiable( measurement, context );
567557
}
568558

569559
@Override
570-
public AssetAdministrationShellEnvironment visitDuration(
571-
final Duration duration, final Context context ) {
560+
public AssetAdministrationShellEnvironment visitDuration( final Duration duration, final Context context ) {
572561
// No special handling required can use Quantifiable mapping implementation
573562
return visitQuantifiable( duration, context );
574563
}
575564

576565
@Override
577-
public AssetAdministrationShellEnvironment visitEnumeration(
578-
final Enumeration enumeration, final Context context ) {
566+
public AssetAdministrationShellEnvironment visitEnumeration( final Enumeration enumeration, final Context context ) {
579567
createSubmodelElement( ( property ) -> decideOnMapping( property, context ), context );
580568

581569
final ConceptDescription conceptDescription =
@@ -589,12 +577,11 @@ public AssetAdministrationShellEnvironment visitEnumeration(
589577
dataSpecificationContent.setDataType( mapIEC61360DataType( enumeration ) );
590578
final List<ValueReferencePair> valueReferencePairs =
591579
enumeration.getValues().stream()
592-
.map(
593-
x ->
594-
new DefaultValueReferencePair.Builder()
595-
.value( x.toString() )
596-
.valueId( buildReferenceToEnumValue( enumeration, x ) )
597-
.build() )
580+
.map( x ->
581+
new DefaultValueReferencePair.Builder()
582+
.value( x.toString() )
583+
.valueId( buildReferenceToEnumValue( enumeration, x ) )
584+
.build() )
598585
.collect( Collectors.toList() );
599586

600587
final ValueList valueList =
@@ -613,15 +600,13 @@ public AssetAdministrationShellEnvironment visitState( final State state, final
613600
}
614601

615602
@Override
616-
public AssetAdministrationShellEnvironment visitSingleEntity(
617-
final SingleEntity singleEntity, final Context context ) {
603+
public AssetAdministrationShellEnvironment visitSingleEntity( final SingleEntity singleEntity, final Context context ) {
618604
// Same handling as characteristics
619605
return visitCharacteristic( singleEntity, context );
620606
}
621607

622608
@Override
623-
public AssetAdministrationShellEnvironment visitStructuredValue(
624-
final StructuredValue structuredValue, final Context context ) {
609+
public AssetAdministrationShellEnvironment visitStructuredValue( final StructuredValue structuredValue, final Context context ) {
625610
// https://openmanufacturingplatform.github.io/sds-documentation/bamm-specification/v1.0.0/modeling-guidelines.html#declaring-structured-value
626611
// AAS cannot handle structuredValues, so we can handle them as ordinary Characteristics
627612
return visitCharacteristic( structuredValue, context );

0 commit comments

Comments
 (0)