diff --git a/core/esmf-aspect-meta-model-version-migrator/src/main/java/org/eclipse/esmf/aspectmodel/versionupdate/migrator/AbstractUriRewriter.java b/core/esmf-aspect-meta-model-version-migrator/src/main/java/org/eclipse/esmf/aspectmodel/versionupdate/migrator/AbstractUriRewriter.java index 771934e14..875888bab 100644 --- a/core/esmf-aspect-meta-model-version-migrator/src/main/java/org/eclipse/esmf/aspectmodel/versionupdate/migrator/AbstractUriRewriter.java +++ b/core/esmf-aspect-meta-model-version-migrator/src/main/java/org/eclipse/esmf/aspectmodel/versionupdate/migrator/AbstractUriRewriter.java @@ -18,6 +18,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import org.apache.jena.datatypes.BaseDatatype; +import org.apache.jena.rdf.model.Literal; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; @@ -57,9 +59,17 @@ protected Property updateProperty( final Property property, final Map oldToNewNamespaces ) { + return rewriteUri( literal.getDatatypeURI(), oldToNewNamespaces ) + .map( uri -> ResourceFactory.createTypedLiteral( literal.getLexicalForm(), new BaseDatatype( uri ) ) ) + .orElse( literal ); + } + protected RDFNode updateRdfNode( final RDFNode rdfNode, final Map oldToNewNamespaces ) { if ( rdfNode.isResource() ) { return updateResource( rdfNode.asResource(), oldToNewNamespaces ); + } else if ( rdfNode.isLiteral() ) { // needed especially for "curie" literals, which are versioned: "unit:day"^^samm:curie + return updateLiteral( rdfNode.asLiteral(), oldToNewNamespaces ); } return rdfNode; } @@ -88,7 +98,8 @@ protected Map buildReplacementPrefixMap( final Model sourceModel * @param oldToNewNamespaces the map of old RDF namespaces to their new counterparts * @return the prefix map */ - protected Map buildPrefixMap( final Model sourceModel, final Map targetPrefixes, final Map oldToNewNamespaces ) { + protected Map buildPrefixMap( final Model sourceModel, final Map targetPrefixes, + final Map oldToNewNamespaces ) { return sourceModel.getNsPrefixMap().keySet().stream() .map( prefix -> Map. entry( prefix, targetPrefixes.getOrDefault( prefix, sourceModel.getNsPrefixURI( prefix ) ) ) ) .collect( Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue ) ); diff --git a/core/esmf-aspect-meta-model-version-migrator/src/test/java/org/eclipse/esmf/aspectmodel/versionupdate/MigratorTest.java b/core/esmf-aspect-meta-model-version-migrator/src/test/java/org/eclipse/esmf/aspectmodel/versionupdate/MigratorTest.java index d0260d459..ebe93445e 100644 --- a/core/esmf-aspect-meta-model-version-migrator/src/test/java/org/eclipse/esmf/aspectmodel/versionupdate/MigratorTest.java +++ b/core/esmf-aspect-meta-model-version-migrator/src/test/java/org/eclipse/esmf/aspectmodel/versionupdate/MigratorTest.java @@ -22,23 +22,23 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.Statement; +import org.apache.jena.vocabulary.RDF; +import org.assertj.core.api.Assertions; import org.eclipse.esmf.aspectmodel.VersionNumber; import org.eclipse.esmf.aspectmodel.resolver.services.VersionedModel; import org.eclipse.esmf.aspectmodel.vocabulary.SAMM; import org.eclipse.esmf.samm.KnownVersion; import org.eclipse.esmf.test.MetaModelVersions; import org.eclipse.esmf.test.TestAspect; - -import com.google.common.collect.Streams; -import org.apache.jena.rdf.model.Model; -import org.apache.jena.rdf.model.RDFNode; -import org.apache.jena.rdf.model.Statement; -import org.apache.jena.vocabulary.RDF; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import com.google.common.collect.Streams; + public class MigratorTest extends MetaModelVersions { private final MigratorService migratorService = new MigratorService(); @@ -118,6 +118,16 @@ public void testRemoveSammName( final KnownVersion metaModelVersion ) { assertThat( sammNameStatements ).isEmpty(); } + @ParameterizedTest + @MethodSource( "allVersions" ) + public void testCurieMigration( final KnownVersion metaModelVersion ) { + final VersionedModel versionedModel = TestResources.getModelWithoutResolution( TestAspect.ASPECT_WITH_CURIE, metaModelVersion ); + final VersionedModel rewrittenModel = migratorService.updateMetaModelVersion( versionedModel ).get(); + final SAMM latestSamm = new SAMM( KnownVersion.getLatest() ); + assertThat( rewrittenModel.getRawModel().listStatements( null, latestSamm.exampleValue(), (RDFNode) null ).nextStatement().getObject().asLiteral() + .getDatatypeURI() ).isEqualTo( latestSamm.curie().getURI() ); + } + private Set getAllUris( final Model model ) { return Streams.stream( model.listStatements() ).flatMap( statement -> { final Stream subjectUri = Stream.of( statement.getSubject().getURI() );