48
48
import org .eclipse .esmf .metamodel .characteristic .StructuredValue ;
49
49
import org .eclipse .esmf .metamodel .characteristic .Trait ;
50
50
51
- import com .fasterxml .jackson .databind .JsonNode ;
52
51
import com .fasterxml .jackson .databind .node .ArrayNode ;
53
52
import com .google .common .collect .ImmutableMap ;
54
53
import org .apache .commons .collections4 .CollectionUtils ;
@@ -135,7 +134,7 @@ ImmutableMap.<Resource, DataTypeIec61360> builder()
135
134
.put ( RDF .langString , DataTypeIec61360 .STRING )
136
135
.build ();
137
136
138
- private interface SubmodelElementBuilder {
137
+ interface SubmodelElementBuilder {
139
138
SubmodelElement build ( Property property );
140
139
}
141
140
@@ -153,14 +152,18 @@ public AspectModelAasVisitor withPropertyMapper( final PropertyMapper<?> propert
153
152
154
153
@ SuppressWarnings ( "unchecked" )
155
154
protected <T extends SubmodelElement > PropertyMapper <T > findPropertyMapper ( final Property property ) {
156
- return (PropertyMapper <T >) getCustomPropertyMappers ().stream ()
155
+ return this .<T > tryFindPropertyMapper ( property ).orElse ( (PropertyMapper <T >) DEFAULT_MAPPER );
156
+ }
157
+
158
+ protected <T extends SubmodelElement > Optional <PropertyMapper <T >> tryFindPropertyMapper ( final Property property ) {
159
+ return getCustomPropertyMappers ().stream ()
157
160
.filter ( mapper -> mapper .canHandle ( property ) )
158
- .findAny ( )
159
- .orElse ( DEFAULT_MAPPER );
161
+ .map ( mapper -> ( PropertyMapper < T >) mapper )
162
+ .findFirst ( );
160
163
}
161
164
162
165
protected List <PropertyMapper <?>> getCustomPropertyMappers () {
163
- return customPropertyMappers ;
166
+ return customPropertyMappers . stream (). sorted (). toList () ;
164
167
}
165
168
166
169
@ Override
@@ -546,10 +549,9 @@ public Environment visitSortedSet( final SortedSet sortedSet, final Context cont
546
549
}
547
550
548
551
private <T extends Collection > Environment visitCollectionProperty ( final T collection , final Context context ) {
549
- final SubmodelElementBuilder builder = property -> {
552
+ final SubmodelElementBuilder defaultBuilder = property -> {
550
553
final DefaultSubmodelElementList .Builder submodelBuilder = new DefaultSubmodelElementList .Builder ()
551
554
.idShort ( property .getName () )
552
- .typeValueListElement ( AasSubmodelElements .DATA_ELEMENT )
553
555
.displayName ( LangStringMapper .NAME .map ( property .getPreferredNames () ) )
554
556
.description ( LangStringMapper .TEXT .map ( property .getDescriptions () ) )
555
557
.value ( List .of ( decideOnMapping ( property , context ) ) )
@@ -563,28 +565,30 @@ private <T extends Collection> Environment visitCollectionProperty( final T coll
563
565
return submodelBuilder .build ();
564
566
};
565
567
566
- final Optional <JsonNode > rawValue = context .getRawPropertyValue ();
567
- return rawValue .map ( node -> {
568
- if ( node instanceof final ArrayNode arrayNode ) {
569
- final SubmodelElementBuilder listBuilder = property -> {
570
- final List <SubmodelElement > values = getValues ( collection , property , context , arrayNode );
571
- return new DefaultSubmodelElementList .Builder ()
572
- .idShort ( property .getName () )
573
- .displayName ( LangStringMapper .NAME .map ( property .getPreferredNames () ) )
574
- .description ( LangStringMapper .TEXT .map ( property .getDescriptions () ) )
575
- .value ( values )
576
- .typeValueListElement ( AasSubmodelElements .SUBMODEL_ELEMENT )
577
- .build ();
578
- };
579
- createSubmodelElement ( listBuilder , context );
580
- return context .getEnvironment ();
581
- }
582
- createSubmodelElement ( builder , context );
583
- return context .getEnvironment ();
584
- } ).orElseGet ( () -> {
585
- createSubmodelElement ( builder , context );
586
- return context .getEnvironment ();
587
- } );
568
+ final SubmodelElementBuilder listBuilder =
569
+ tryFindPropertyMapper ( context .getProperty () )
570
+ .flatMap ( mapper ->
571
+ collection .getDataType ().map ( type ->
572
+ (SubmodelElementBuilder ) ( Property property ) -> mapper .mapToAasProperty ( type , property , context ) ) )
573
+ .or ( () ->
574
+ context .getRawPropertyValue ()
575
+ .filter ( ArrayNode .class ::isInstance )
576
+ .map ( ArrayNode .class ::cast )
577
+ .map ( arrayNode -> ( Property property ) -> {
578
+ final List <SubmodelElement > values = getValues ( collection , property , context , arrayNode );
579
+ return new DefaultSubmodelElementList .Builder ()
580
+ .idShort ( property .getName () )
581
+ .displayName ( LangStringMapper .NAME .map ( property .getPreferredNames () ) )
582
+ .description ( LangStringMapper .TEXT .map ( property .getDescriptions () ) )
583
+ .value ( values )
584
+ .typeValueListElement ( AasSubmodelElements .SUBMODEL_ELEMENT )
585
+ .build ();
586
+ } ) )
587
+ .orElse ( defaultBuilder );
588
+
589
+ createSubmodelElement ( listBuilder , context );
590
+
591
+ return context .getEnvironment ();
588
592
}
589
593
590
594
private <T extends Collection > List <SubmodelElement > getValues ( final T collection , final Property property , final Context context ,
@@ -593,9 +597,10 @@ private <T extends Collection> List<SubmodelElement> getValues( final T collecti
593
597
.map ( dataType -> {
594
598
if ( Scalar .class .isAssignableFrom ( dataType .getClass () ) ) {
595
599
return List .of ( (SubmodelElement ) new DefaultBlob .Builder ().value ( StreamSupport .stream ( arrayNode .spliterator (), false )
596
- .map ( JsonNode ::asText )
597
- .collect ( Collectors .joining ( "," ) )
598
- .getBytes ( StandardCharsets .UTF_8 ) ).build () );
600
+ .map ( node -> node .isValueNode () ? node .asText () : node .toString () )
601
+ .collect ( Collectors .joining ( "," ) )
602
+ .getBytes ( StandardCharsets .UTF_8 ) )
603
+ .contentType ( "text/plain" ).build () );
599
604
} else {
600
605
final List <SubmodelElement > values = StreamSupport .stream ( arrayNode .spliterator (), false )
601
606
.map ( node -> {
0 commit comments