Skip to content

Commit f4b9154

Browse files
committed
Merge branch 'main' into feature/OMP-SDK-265-generate-comment-for-see-attributes
2 parents 8137d96 + 0cffff8 commit f4b9154

File tree

83 files changed

+1276
-941
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+1276
-941
lines changed

core/sds-aspect-meta-model-interface/src/main/java/io/openmanufacturing/sds/aspectmodel/resolver/AspectMetaModelResourceResolver.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,6 @@ public interface AspectMetaModelResourceResolver {
4343
*/
4444
Try<VersionedModel> mergeMetaModelIntoRawModel( final Model rawModel, final VersionNumber version );
4545

46-
/**
47-
* Parses an Aspect (meta) model URN into an {@link AspectModelUrn}
48-
*
49-
* @param uri The Aspect (meta) model URN
50-
* @return The {@link AspectModelUrn} if parsing succeeds, an {@link UrnSyntaxException} otherwise
51-
*/
52-
default Try<AspectModelUrn> getAspectModelUrn( final String uri ) {
53-
try {
54-
return Try.success( AspectModelUrn.fromUrn( uri ) );
55-
} catch ( final UrnSyntaxException exception ) {
56-
return Try.failure( exception );
57-
}
58-
}
59-
6046
/**
6147
* Retrieves the meta model version an Aspect model uses
6248
*
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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;
15+
16+
import io.openmanufacturing.sds.aspectmodel.resolver.services.VersionedModel;
17+
18+
/**
19+
* The AspectContext wraps a loaded/resolved Aspect Model and a single Aspect that was instantiated from this model, i.e.,
20+
* which must be defined in the RDF model.
21+
* @param rdfModel the RDF model
22+
* @param aspect the Aspect
23+
*/
24+
public record AspectContext(VersionedModel rdfModel, Aspect aspect) {
25+
}

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

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313

1414
package io.openmanufacturing.sds.metamodel.loader;
1515

16+
import java.io.File;
1617
import java.util.ArrayList;
1718
import java.util.List;
1819
import java.util.Map;
1920
import java.util.Optional;
2021
import java.util.Set;
22+
import java.util.function.Predicate;
2123
import java.util.stream.Collectors;
2224

2325
import org.apache.jena.rdf.model.Model;
@@ -41,6 +43,7 @@
4143
import io.openmanufacturing.sds.aspectmodel.versionupdate.MigratorService;
4244
import io.openmanufacturing.sds.aspectmodel.vocabulary.BAMM;
4345
import io.openmanufacturing.sds.metamodel.Aspect;
46+
import io.openmanufacturing.sds.metamodel.AspectContext;
4447
import io.openmanufacturing.sds.metamodel.ModelElement;
4548
import io.openmanufacturing.sds.metamodel.ModelNamespace;
4649
import io.openmanufacturing.sds.metamodel.NamedElement;
@@ -79,7 +82,7 @@ private AspectModelLoader() {
7982
*
8083
* @see AspectModelResolver
8184
*/
82-
@Deprecated
85+
@Deprecated( forRemoval = true )
8386
public static Try<Aspect> fromVersionedModel( final VersionedModel versionedModel ) {
8487
return getSingleAspect( versionedModel );
8588
}
@@ -103,12 +106,12 @@ private static void validateNamespaceOfCustomUnits( final BAMM bamm, final Model
103106
* Creates an {@link Aspect} instance from a Turtle input model.
104107
*
105108
* @param versionedModel The RDF model representation of the Aspect model
106-
* @return The Aspect *
109+
* @return The Aspect
107110
* @deprecated use {@link #getSingleAspectUnchecked(VersionedModel)} instead to retain the same semantics, but better use
108111
* {@link #getElementsUnchecked(VersionedModel)} instead to also properly handle models that contain not exactly one Aspect
109112
* @see #fromVersionedModel(VersionedModel)
110113
*/
111-
@Deprecated
114+
@Deprecated( forRemoval = true )
112115
public static Aspect fromVersionedModelUnchecked( final VersionedModel versionedModel ) {
113116
return fromVersionedModel( versionedModel ).getOrElseThrow( cause -> {
114117
LOG.error( "Could not load Aspect", cause );
@@ -228,12 +231,7 @@ public static List<Aspect> getAspectsUnchecked( final VersionedModel versionedMo
228231
* @return the single Aspect contained in the model
229232
*/
230233
public static Try<Aspect> getSingleAspect( final VersionedModel versionedModel ) {
231-
return getAspects( versionedModel ).flatMap( aspects -> {
232-
if ( aspects.size() != 1 ) {
233-
return Try.failure( new InvalidRootElementCountException( "Aspect model does not contain exactly one Aspect" ) );
234-
}
235-
return Try.success( aspects.get( 0 ) );
236-
} );
234+
return getSingleAspect( versionedModel, aspect -> true );
237235
}
238236

239237
/**
@@ -252,4 +250,40 @@ public static Aspect getSingleAspectUnchecked( final VersionedModel versionedMod
252250
throw new AspectLoadingException( cause );
253251
} );
254252
}
253+
254+
/**
255+
* Similar to {@link #getSingleAspect(VersionedModel)}, except that a predicate can be provided to select which of potentially
256+
* multiple aspects should be selected
257+
* @param versionedModel the RDF model reprensentation of the Aspect model
258+
* @param selector the predicate to select an Aspect
259+
* @return the selected Aspect, or a failure if 0 or more than 1 matching Aspects were found
260+
*/
261+
public static Try<Aspect> getSingleAspect( final VersionedModel versionedModel, final Predicate<Aspect> selector ) {
262+
return getAspects( versionedModel ).flatMap( allAspects -> {
263+
final List<Aspect> aspects = allAspects.stream().filter( selector::test ).toList();
264+
return switch ( aspects.size() ) {
265+
case 1 -> Try.success( aspects.iterator().next() );
266+
case 0 -> Try.failure( new InvalidRootElementCountException( "No Aspects were found in the model" ) );
267+
default -> Try.failure( new AspectLoadingException( "Multiple Aspects were found in the resolved model" ) );
268+
};
269+
} );
270+
}
271+
272+
/**
273+
* Convenience method to create an {@link AspectContext} directly from a model file. This method makes the following assumptions:
274+
* <ul>
275+
* <li>The model file is located in a directory structure as required by the {@link io.openmanufacturing.sds.aspectmodel.resolver.FileSystemStrategy}</li>
276+
* <li>The closure of the loaded model contains exactly one Aspect</li>
277+
* <li>The Aspect has the same name as the file's basename</li>
278+
* </ul>
279+
* The method is intended for use in tests and comparable use cases, not as a general replacement for loading Aspect Models, since it does not
280+
* handle model files with less or more than one Aspect.
281+
* @param input the model file
282+
* @return the loaded Aspect Context
283+
*/
284+
public static Try<AspectContext> getAspectContext( final File input ) {
285+
return AspectModelResolver.loadAndResolveModel( input ).flatMap( versionedModel ->
286+
getSingleAspect( versionedModel, aspect -> aspect.getName().equals( input.getName() ) )
287+
.map( aspect -> new AspectContext( versionedModel, aspect ) ) );
288+
}
255289
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,15 +203,15 @@ private static String getSyntheticName( final Resource modelElement, final Model
203203
throw new AspectLoadingException( "At least one anonymous node in the model does not have a parent with a regular name." );
204204
}
205205
final String parentModelElementUri = namedParent.getURI();
206-
final String parentModelElementName = metaModelResourceResolver.getAspectModelUrn( parentModelElementUri )
206+
final String parentModelElementName = AspectModelUrn.from( parentModelElementUri )
207207
.toJavaOptional()
208208
.map( AspectModelUrn::getName )
209209
.map( StringUtils::capitalize )
210210
.orElse( "" );
211211

212212
final Resource modelElementType = getModelElementType( modelElement, bamm );
213213
final String modelElementTypeUri = modelElementType.getURI();
214-
final String modelElementTypeName = metaModelResourceResolver.getAspectModelUrn( modelElementTypeUri )
214+
final String modelElementTypeName = AspectModelUrn.from( modelElementTypeUri )
215215
.toJavaOptional()
216216
.map( AspectModelUrn::getName )
217217
.orElse( "" );

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public Set<URL> apply( final KnownVersion metaModelVersion ) {
3535
MetaModelUrls.url( "characteristic", metaModelVersion, "characteristic-definitions.ttl" ),
3636
MetaModelUrls.url( "characteristic", metaModelVersion, "characteristic-instances.ttl" ),
3737
MetaModelUrls.url( "entity", metaModelVersion, "TimeSeriesEntity.ttl" ),
38+
MetaModelUrls.url( "entity", metaModelVersion, "FileResource.ttl" ),
39+
MetaModelUrls.url( "entity", metaModelVersion, "Point3d.ttl" ),
3840
MetaModelUrls.url( "unit", metaModelVersion, "units.ttl" ),
3941
Optional.<URL> empty()
4042
).filter( Optional::isPresent ).map( Optional::get ).collect( Collectors.toSet() );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public Set<VersionNumber> getUsedMetaModelVersions( final Model model ) {
220220
.map( RDFNode::asResource )
221221
.map( Resource::getURI )
222222
.filter( uri -> uri.startsWith( bammUrnStart ) )
223-
.flatMap( uri -> getAspectModelUrn( uri ).toJavaStream() )
223+
.flatMap( uri -> AspectModelUrn.from( uri ).toJavaStream() )
224224
.filter( urn -> (urn.getElementType().equals( ElementType.META_MODEL ) || urn.getElementType().equals( ElementType.CHARACTERISTIC )) )
225225
.map( AspectModelUrn::getVersion )
226226
.map( VersionNumber::parse )

core/sds-aspect-meta-model-resolver/src/test/java/io/openmanufacturing/sds/aspectmodel/resolver/services/ClassPathMetaModelUrnResolverTest.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright (c) 2021 Robert Bosch Manufacturing Solutions GmbH
33
*
44
* See the AUTHORS file(s) distributed with this work for additional
5-
* information regarding authorship.
5+
* information regarding authorship.
66
*
77
* This Source Code Form is subject to the terms of the Mozilla Public
88
* License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -18,16 +18,27 @@
1818
import java.net.URL;
1919
import java.util.Optional;
2020

21-
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
22-
2321
import org.junit.jupiter.api.Test;
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.MethodSource;
24+
25+
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
26+
import io.openmanufacturing.sds.test.MetaModelVersions;
2427

25-
public class ClassPathMetaModelUrnResolverTest {
28+
public class ClassPathMetaModelUrnResolverTest extends MetaModelVersions {
2629
@Test
2730
public void testUrlConstruction() {
2831
for ( final KnownVersion version : KnownVersion.getVersions() ) {
2932
final Optional<URL> url = MetaModelUrls.url( "meta-model", version, "aspect-meta-model-definitions.ttl" );
3033
assertThat( url ).isNotEmpty();
3134
}
3235
}
36+
37+
@ParameterizedTest
38+
@MethodSource( value = "allVersions" )
39+
public void testContainsEntityDefinitions( final KnownVersion metaModelVersion ) {
40+
assertThat( MetaModelUrls.url( "entity", metaModelVersion, "Point3d.ttl" ) ).isNotEmpty();
41+
assertThat( MetaModelUrls.url( "entity", metaModelVersion, "FileResource.ttl" ) ).isNotEmpty();
42+
assertThat( MetaModelUrls.url( "entity", metaModelVersion, "TimeSeriesEntity.ttl" ) ).isNotEmpty();
43+
}
3344
}

core/sds-aspect-meta-model-resolver/src/test/java/io/openmanufacturing/sds/aspectmodel/resolver/services/SdsAspectMetaModelResourceResolverTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import org.junit.jupiter.params.provider.MethodSource;
2828

2929
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
30-
import io.openmanufacturing.sds.aspectmodel.VersionNumber;
3130
import io.openmanufacturing.sds.aspectmodel.MissingMetaModelVersionException;
31+
import io.openmanufacturing.sds.aspectmodel.VersionNumber;
3232
import io.openmanufacturing.sds.aspectmodel.urn.AspectModelUrn;
3333
import io.openmanufacturing.sds.test.MetaModelVersions;
3434
import io.vavr.control.Try;
@@ -82,20 +82,18 @@ public void testGetBammVersionInvalidMetaModelUrnElementExpectFailure( final Kno
8282
@ParameterizedTest
8383
@MethodSource( "allVersions" )
8484
public void testGetAspectModelUrnExpectSuccess( final KnownVersion metaModelVersion ) {
85-
final Try<AspectModelUrn> aspectModelUrn = aspectMetaModelResourceResolver.getAspectModelUrn(
85+
final Try<AspectModelUrn> aspectModelUrn = AspectModelUrn.from(
8686
"urn:bamm:io.openmanufacturing:meta-model:" + metaModelVersion.toVersionString() + "#Aspect" );
8787
assertThat( aspectModelUrn ).isSuccess();
8888
org.assertj.core.api.Assertions.assertThat( aspectModelUrn.get().getUrn().toString() )
89-
.isEqualTo( "urn:bamm:io.openmanufacturing:meta-model:" + metaModelVersion
90-
.toVersionString() + "#Aspect" );
89+
.isEqualTo( "urn:bamm:io.openmanufacturing:meta-model:" + metaModelVersion
90+
.toVersionString() + "#Aspect" );
9191
}
9292

9393
@ParameterizedTest
9494
@MethodSource( "allVersions" )
9595
public void testGetAspectModelUrnInvalidUrnExpectFailure( final KnownVersion metaModelVersion ) {
96-
final Try<AspectModelUrn> aspectModelUrn = aspectMetaModelResourceResolver
97-
.getAspectModelUrn(
98-
"urn:foo:io.openmanufacturing:meta-model:" + metaModelVersion.toVersionString() );
96+
final Try<AspectModelUrn> aspectModelUrn = AspectModelUrn.from( "urn:foo:io.openmanufacturing:meta-model:" + metaModelVersion.toVersionString() );
9997
assertThat( aspectModelUrn ).isFailure();
10098
}
10199

@@ -120,7 +118,7 @@ public void testLoadMetaModelExpectSuccess( final KnownVersion metaModelVersion
120118
final Model model = aspectMetaModelResourceResolver.loadMetaModel( metaModelVersion ).get();
121119

122120
org.assertj.core.api.Assertions.assertThat( model.contains( ResourceFactory.createResource(
123-
"urn:bamm:io.openmanufacturing:meta-model:" + metaModelVersion.toVersionString() + "#value" ),
121+
"urn:bamm:io.openmanufacturing:meta-model:" + metaModelVersion.toVersionString() + "#value" ),
124122
RDF.type, (RDFNode) null ) ).isTrue();
125123
}
126124
}

core/sds-aspect-model-aas-generator/src/test/java/io/openmanufacturing/sds/aspectmodel/aas/AspectModelAASGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private AssetAdministrationShellEnvironment getAssetAdministrationShellFromAspec
264264

265265
private Aspect loadAspect( final TestAspect testAspect ) {
266266
final VersionedModel model = TestResources.getModel( testAspect, KnownVersion.getLatest() ).get();
267-
return AspectModelLoader.fromVersionedModelUnchecked( model );
267+
return AspectModelLoader.getSingleAspectUnchecked( model );
268268
}
269269

270270
private AssetAdministrationShellEnvironment loadAASX( final ByteArrayOutputStream byteStream ) throws DeserializationException {

core/sds-aspect-model-document-generators/src/main/java/io/openmanufacturing/sds/aspectmodel/generator/AspectModelHelper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Set;
2222
import java.util.stream.Collectors;
2323

24-
import io.openmanufacturing.sds.aspectmodel.resolver.services.VersionedModel;
24+
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
2525
import io.openmanufacturing.sds.metamodel.Aspect;
2626
import io.openmanufacturing.sds.metamodel.ModelElement;
2727
import io.openmanufacturing.sds.metamodel.ComplexType;
@@ -35,14 +35,14 @@
3535
import io.openmanufacturing.sds.metamodel.visitor.AspectStreamTraversalVisitor;
3636

3737
public class AspectModelHelper {
38-
private final VersionedModel modelVersion;
38+
private final KnownVersion metaModelVersion;
3939

40-
public AspectModelHelper( final VersionedModel modelVersion ) {
41-
this.modelVersion = modelVersion;
40+
public AspectModelHelper( final KnownVersion metaModelVersion ) {
41+
this.metaModelVersion = metaModelVersion;
4242
}
4343

44-
public VersionedModel getModelVersion() {
45-
return modelVersion;
44+
public KnownVersion getMetaModelVersion() {
45+
return metaModelVersion;
4646
}
4747

4848
public static List<Property> sortPropertiesByPreferredName( final List<Property> properties, final Locale locale ) {

0 commit comments

Comments
 (0)