Skip to content

Commit 1aa608e

Browse files
committed
Merge branch 'main' into 2.1.x
2 parents 68f5909 + cc11d2d commit 1aa608e

File tree

19 files changed

+671
-86
lines changed

19 files changed

+671
-86
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright (c) 2023 Robert Bosch Manufacturing Solutions GmbH
3+
*
4+
* See the AUTHORS file(s) distributed with this work for additional
5+
* information regarding authorship.
6+
*
7+
* This Source Code Form is subject to the terms of the Mozilla Public
8+
* License, v. 2.0. If a copy of the MPL was not distributed with this
9+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
10+
*
11+
* SPDX-License-Identifier: MPL-2.0
12+
*/
13+
14+
package io.openmanufacturing.sds.metamodel.loader;
15+
16+
import java.util.Optional;
17+
18+
import org.apache.jena.datatypes.DatatypeFormatException;
19+
import org.apache.jena.datatypes.RDFDatatype;
20+
import org.apache.jena.graph.impl.LiteralLabel;
21+
22+
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
23+
import io.openmanufacturing.sds.aspectmodel.resolver.services.TypedRdfDatatype;
24+
import io.openmanufacturing.sds.aspectmodel.vocabulary.BAMM;
25+
import io.openmanufacturing.sds.metamodel.datatypes.Curie;
26+
27+
public class CurieRdfType implements TypedRdfDatatype<Curie> {
28+
@Override
29+
public Optional<Curie> parseTyped( final String lexicalForm ) {
30+
if ( isValid( lexicalForm ) ) {
31+
return Optional.of( new Curie( lexicalForm ) );
32+
}
33+
return Optional.empty();
34+
}
35+
36+
@Override
37+
public String unparseTyped( final Curie value ) {
38+
return value.getValue();
39+
}
40+
41+
@Override
42+
public String getURI() {
43+
return new BAMM( KnownVersion.getLatest() ).curie().getURI();
44+
}
45+
46+
@Override
47+
public String unparse( final Object value ) {
48+
if ( value instanceof Curie curie ) {
49+
return unparseTyped( curie );
50+
}
51+
throw new AspectLoadingException( "Value is no valid curie: " + value );
52+
}
53+
54+
@Override
55+
public Object parse( final String lexicalForm ) throws DatatypeFormatException {
56+
return parseTyped( lexicalForm ).orElseThrow( () -> new DatatypeFormatException() );
57+
}
58+
59+
@Override
60+
public boolean isValid( final String lexicalForm ) {
61+
return lexicalForm.matches( "[^:]*:.*" );
62+
}
63+
64+
@Override
65+
public boolean isValidValue( final Object valueForm ) {
66+
return isValid( valueForm.toString() );
67+
}
68+
69+
@Override
70+
public boolean isValidLiteral( final LiteralLabel lit ) {
71+
return isValid( lit.getLexicalForm() );
72+
}
73+
74+
@Override
75+
public boolean isEqual( final LiteralLabel value1, final LiteralLabel value2 ) {
76+
return value1.getLexicalForm().equals( value2.getLexicalForm() );
77+
}
78+
79+
@Override
80+
public int getHashCode( final LiteralLabel lit ) {
81+
return lit.getDefaultHashcode();
82+
}
83+
84+
@Override
85+
public Class<Curie> getJavaClass() {
86+
return (Class<Curie>) Curie.class;
87+
}
88+
89+
@Override
90+
public Object cannonicalise( final Object value ) {
91+
return value;
92+
}
93+
94+
@Override
95+
public Object extendedTypeDefinition() {
96+
return null;
97+
}
98+
99+
@Override
100+
public RDFDatatype normalizeSubType( final Object value, final RDFDatatype datatype ) {
101+
return datatype;
102+
}
103+
}

core/sds-aspect-meta-model-java/src/main/java/io/openmanufacturing/sds/metamodel/loader/Instantiator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import java.util.Map;
2323
import java.util.Optional;
2424
import java.util.function.Function;
25+
import java.util.function.Predicate;
2526
import java.util.stream.Collectors;
2627
import java.util.stream.Stream;
2728

29+
import org.apache.jena.datatypes.RDFDatatype;
2830
import org.apache.jena.rdf.model.Literal;
2931
import org.apache.jena.rdf.model.Model;
3032
import org.apache.jena.rdf.model.RDFList;
@@ -51,6 +53,7 @@
5153
import io.openmanufacturing.sds.metamodel.ScalarValue;
5254
import io.openmanufacturing.sds.metamodel.Type;
5355
import io.openmanufacturing.sds.metamodel.Value;
56+
import io.openmanufacturing.sds.metamodel.datatypes.Curie;
5457
import io.openmanufacturing.sds.metamodel.datatypes.LangString;
5558
import io.openmanufacturing.sds.metamodel.impl.DefaultCollectionValue;
5659
import io.openmanufacturing.sds.metamodel.impl.DefaultEntityInstance;
@@ -64,6 +67,7 @@ public abstract class Instantiator<T extends ModelElement> extends AttributeValu
6467
protected UNIT unit;
6568
protected Model model;
6669
protected KnownVersion metaModelVersion;
70+
protected final RDFDatatype curieDataType = new CurieRdfType();
6771

6872
public Instantiator( final ModelElementFactory modelElementFactory, final Class<T> targetClass ) {
6973
super( modelElementFactory.getBamm() );
@@ -226,7 +230,7 @@ private ScalarValue buildScalarValue( final Literal literal ) {
226230
return new DefaultScalarValue( langString, type );
227231
}
228232

229-
return ExtendedXsdDataType.supportedXsdTypes.stream()
233+
return Stream.concat( ExtendedXsdDataType.supportedXsdTypes.stream(), Stream.of( curieDataType ) )
230234
.filter( type -> type.getURI().equals( literal.getDatatypeURI() ) )
231235
.map( type -> type.parse( literal.getLexicalForm() ) )
232236
.map( value -> new DefaultScalarValue( value, new DefaultScalar( literal.getDatatypeURI(), metaModelVersion ) ) )

core/sds-aspect-meta-model-resolver/src/main/java/io/openmanufacturing/sds/aspectmodel/resolver/services/ExtendedXsdDataType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class ExtendedXsdDataType<T> extends XSDDatatype implements TypedRdfDatat
4545
private static boolean checking = true;
4646
private static final ExtendedSchemaDVFactoryImpl extendedSchemaDVFactory = new ExtendedSchemaDVFactoryImpl();
4747

48-
private ExtendedXsdDataType( final Resource dataTypeResource, final Class<T> correspondingJavaClass,
48+
public ExtendedXsdDataType( final Resource dataTypeResource, final Class<T> correspondingJavaClass,
4949
final Function<String, T> parser,
5050
final Function<T, String> unparser,
5151
final Predicate<String> lexicalValidator ) {

core/sds-aspect-meta-model-types/src/main/java/io/openmanufacturing/sds/metamodel/datatypes/Curie.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,9 @@ public boolean equals( final Object o ) {
4545
public int hashCode() {
4646
return value != null ? value.hashCode() : 0;
4747
}
48+
49+
@Override
50+
public String toString() {
51+
return value;
52+
}
4853
}

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)