Skip to content

Commit 66e5e0f

Browse files
committed
Update esmf-parent
1 parent ec24c50 commit 66e5e0f

File tree

9 files changed

+159
-59
lines changed

9 files changed

+159
-59
lines changed

core/esmf-aspect-meta-model-interface/src/main/java/org/eclipse/esmf/metamodel/datatype/SammXsdType.java

+132-33
Original file line numberDiff line numberDiff line change
@@ -20,53 +20,46 @@
2020
import java.util.Optional;
2121
import java.util.function.Function;
2222
import java.util.function.Predicate;
23+
2324
import javax.xml.datatype.DatatypeConfigurationException;
2425
import javax.xml.datatype.DatatypeFactory;
2526
import javax.xml.datatype.Duration;
2627
import javax.xml.datatype.XMLGregorianCalendar;
2728

2829
import jakarta.xml.bind.DatatypeConverter;
30+
import org.apache.commons.lang3.NotImplementedException;
31+
import org.apache.jena.datatypes.DatatypeFormatException;
2932
import org.apache.jena.datatypes.RDFDatatype;
3033
import org.apache.jena.datatypes.TypeMapper;
3134
import org.apache.jena.datatypes.xsd.XSDDatatype;
3235
import org.apache.jena.datatypes.xsd.impl.RDFLangString;
33-
import org.apache.jena.ext.xerces.impl.dv.XSSimpleType;
34-
import org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl;
36+
import org.apache.jena.graph.impl.LiteralLabel;
3537
import org.apache.jena.rdf.model.Resource;
3638
import org.slf4j.Logger;
3739
import org.slf4j.LoggerFactory;
3840

41+
/**
42+
* The custom RDF type implementations that have deterministic and typed parsers and unparsers (i.e., serializers).
43+
*
44+
* @param <T> the Java class that represents values for the type
45+
*/
3946
// the order of the variables is required because of the way they reference each other
4047
public class SammXsdType<T> extends XSDDatatype implements SammType<T> {
4148
private static final Logger LOG = LoggerFactory.getLogger( SammXsdType.class );
4249
public static DatatypeFactory datatypeFactory;
4350

44-
private final Class<T> correspondingJavaClass;
4551
private final Function<String, T> parser;
4652
private final Function<T, String> unparser;
4753
private final Predicate<String> lexicalValidator;
4854
private static boolean checking = true;
49-
private static final ExtendedSchemaDVFactoryImpl EXTENDED_SCHEMA_DV_FACTORY = new ExtendedSchemaDVFactoryImpl();
50-
51-
public SammXsdType( final Resource dataTypeResource, final Class<T> correspondingJavaClass,
52-
final Function<String, T> parser,
53-
final Function<T, String> unparser,
54-
final Predicate<String> lexicalValidator ) {
55-
super( dataTypeResource.getLocalName() );
56-
this.correspondingJavaClass = correspondingJavaClass;
57-
this.parser = parser;
58-
this.unparser = unparser;
59-
this.lexicalValidator = lexicalValidator;
60-
}
6155

62-
private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
56+
protected SammXsdType( final Resource dataTypeResource,
6357
final Class<T> correspondingJavaClass,
6458
final Function<String, T> parser,
6559
final Function<T, String> unparser,
6660
final Predicate<String> lexicalValidator ) {
67-
//In the namespace the hash symbol should be removed, because jena defines the namespace differently.
68-
super( xstype, dataTypeResource.getNameSpace().replace( "#", "" ) );
69-
this.correspondingJavaClass = correspondingJavaClass;
61+
super( dataTypeResource.getLocalName() );
62+
javaClass = correspondingJavaClass;
7063
this.parser = parser;
7164
this.unparser = unparser;
7265
this.lexicalValidator = lexicalValidator;
@@ -139,10 +132,9 @@ private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
139132
value -> datatypeFactory.newXMLGregorianCalendar( value ), XMLGregorianCalendar::toXMLFormat,
140133
XSDDatatype.XSDdateTime::isValid );
141134

142-
public static final SammXsdType<XMLGregorianCalendar> DATE_TIME_STAMP = new SammXsdType<>(
135+
public static final SammExtendedXsdType<XMLGregorianCalendar> DATE_TIME_STAMP = new SammExtendedXsdType<>(
143136
org.apache.jena.vocabulary.XSD.dateTimeStamp,
144-
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.dateTimeStamp.getLocalName() ),
145-
XMLGregorianCalendar.class, value -> datatypeFactory.newXMLGregorianCalendar( value ),
137+
XMLGregorianCalendar.class, value -> SammXsdType.datatypeFactory.newXMLGregorianCalendar( value ),
146138
XMLGregorianCalendar::toXMLFormat, XSDDatatype.XSDdateTimeStamp::isValid );
147139

148140
public static final SammXsdType<XMLGregorianCalendar> G_YEAR = new SammXsdType<>(
@@ -174,16 +166,14 @@ private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
174166
org.apache.jena.vocabulary.XSD.duration, Duration.class, value -> datatypeFactory.newDuration( value ),
175167
Duration::toString, XSDDatatype.XSDduration::isValid );
176168

177-
public static final SammXsdType<Duration> YEAR_MONTH_DURATION = new SammXsdType<>(
169+
public static final SammExtendedXsdType<Duration> YEAR_MONTH_DURATION = new SammExtendedXsdType<>(
178170
org.apache.jena.vocabulary.XSD.yearMonthDuration,
179-
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.yearMonthDuration.getLocalName() ),
180-
Duration.class, value -> datatypeFactory.newDurationYearMonth( value ), Duration::toString,
171+
Duration.class, value -> SammXsdType.datatypeFactory.newDurationYearMonth( value ), Duration::toString,
181172
XSDDatatype.XSDyearMonthDuration::isValid );
182173

183-
public static final SammXsdType<Duration> DAY_TIME_DURATION = new SammXsdType<>(
174+
public static final SammExtendedXsdType<Duration> DAY_TIME_DURATION = new SammExtendedXsdType<>(
184175
org.apache.jena.vocabulary.XSD.dayTimeDuration,
185-
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.dayTimeDuration.getLocalName() ),
186-
Duration.class, value -> datatypeFactory.newDurationDayTime( value ), Duration::toString,
176+
Duration.class, value -> SammXsdType.datatypeFactory.newDurationDayTime( value ), Duration::toString,
187177
XSDDatatype.XSDdayTimeDuration::isValid );
188178

189179
public static final SammXsdType<Byte> BYTE = new SammXsdType<>( org.apache.jena.vocabulary.XSD.xbyte,
@@ -245,10 +235,6 @@ private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
245235
value -> URI.create( (String) XSDDatatype.XSDanyURI.parse( value ) ),
246236
URI::toString, XSDDatatype.XSDanyURI::isValid );
247237

248-
@SuppressWarnings( "checkstyle:LambdaParameterName" )
249-
public static final SammXsdType<String> STRING = new SammXsdType<>(
250-
org.apache.jena.vocabulary.XSD.xstring, String.class, Function.identity(), Function.identity(), __ -> true );
251-
252238
public static final List<RDFDatatype> ALL_TYPES = List
253239
.of( XSDDatatype.XSDstring, BOOLEAN, DECIMAL, INTEGER, DOUBLE, FLOAT, DATE, TIME, DATE_TIME, DATE_TIME_STAMP,
254240
G_YEAR, G_MONTH, G_YEAR_MONTH, G_DAY, G_MONTH_DAY, DURATION, YEAR_MONTH_DURATION, DAY_TIME_DURATION,
@@ -311,9 +297,10 @@ public boolean isValid( final String lexicalForm ) {
311297
return lexicalValidator.test( lexicalForm );
312298
}
313299

300+
@SuppressWarnings( "unchecked" )
314301
@Override
315302
public Class<T> getJavaClass() {
316-
return correspondingJavaClass;
303+
return (Class<T>) javaClass;
317304
}
318305

319306
private static boolean setupPerformed = false;
@@ -349,4 +336,116 @@ public static Class<?> getJavaTypeForMetaModelType( final Resource type ) {
349336
.findAny()
350337
.orElseThrow( () -> new IllegalStateException( "Invalid data type " + type + " found in model." ) );
351338
}
339+
340+
/**
341+
* Separate implementation for the "extended" RDF types that can not be based on {@link XSDDatatype}.
342+
*
343+
* @param <T> the Java class that represents values for the type
344+
*/
345+
public static class SammExtendedXsdType<T> implements SammType<T> {
346+
private final String uri;
347+
private final Class<T> javaClass;
348+
private final Function<String, T> parser;
349+
private final Function<T, String> unparser;
350+
private final Predicate<String> lexicalValidator;
351+
352+
public SammExtendedXsdType(
353+
final Resource dataTypeResource,
354+
final Class<T> javaClass,
355+
final Function<String, T> parser,
356+
final Function<T, String> unparser,
357+
final Predicate<String> lexicalValidator
358+
) {
359+
uri = dataTypeResource.getURI();
360+
this.javaClass = javaClass;
361+
this.parser = parser;
362+
this.unparser = unparser;
363+
this.lexicalValidator = lexicalValidator;
364+
}
365+
366+
@Override
367+
public Optional<T> parseTyped( final String lexicalForm ) {
368+
try {
369+
return Optional.of( parser.apply( lexicalForm ) );
370+
} catch ( final RuntimeException exception ) {
371+
if ( checking ) {
372+
throw exception;
373+
}
374+
}
375+
return Optional.empty();
376+
}
377+
378+
@Override
379+
public String unparseTyped( final T value ) {
380+
return unparser.apply( value );
381+
}
382+
383+
@Override
384+
public String getURI() {
385+
return uri;
386+
}
387+
388+
@Override
389+
@SuppressWarnings( "unchecked" )
390+
public String unparse( final Object value ) {
391+
return unparseTyped( (T) value );
392+
}
393+
394+
@Override
395+
public Object parse( final String lexicalForm ) throws DatatypeFormatException {
396+
try {
397+
return parser.apply( lexicalForm );
398+
} catch ( final Exception exception ) {
399+
if ( checking ) {
400+
throw exception;
401+
}
402+
}
403+
return lexicalForm;
404+
}
405+
406+
@Override
407+
public boolean isValid( final String lexicalForm ) {
408+
return lexicalValidator.test( lexicalForm );
409+
}
410+
411+
@Override
412+
public boolean isValidValue( final Object valueForm ) {
413+
return isValid( unparse( valueForm ) );
414+
}
415+
416+
@Override
417+
public boolean isValidLiteral( final LiteralLabel lit ) {
418+
return isValid( lit.getLexicalForm() );
419+
}
420+
421+
@Override
422+
public boolean isEqual( final LiteralLabel value1, final LiteralLabel value2 ) {
423+
return value1.getLexicalForm().equals( value2.getLexicalForm() );
424+
}
425+
426+
@Override
427+
public int getHashCode( final LiteralLabel lit ) {
428+
return lit.getValueHashCode();
429+
}
430+
431+
@Override
432+
public Class<T> getJavaClass() {
433+
return javaClass;
434+
}
435+
436+
@Override
437+
public Object cannonicalise( final Object value ) {
438+
return value;
439+
}
440+
441+
@Override
442+
public Object extendedTypeDefinition() {
443+
throw new NotImplementedException();
444+
}
445+
446+
@Override
447+
public RDFDatatype normalizeSubType( final Object value, final RDFDatatype dt ) {
448+
return this;
449+
}
450+
}
352451
}

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/aspectmodel/resolver/parser/TurtleParserProfile.java

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.apache.jena.graph.Graph;
1818
import org.apache.jena.graph.Node;
1919
import org.apache.jena.graph.Triple;
20+
import org.apache.jena.irix.IRIx;
2021
import org.apache.jena.riot.system.ErrorHandler;
2122
import org.apache.jena.riot.system.FactoryRDF;
2223
import org.apache.jena.riot.system.ParserProfile;
@@ -142,4 +143,9 @@ public Node createGraphNode( final Graph graph, final long line, final long col
142143
public Node createNodeFromToken( final Node scope, final Token token, final long line, final long col ) {
143144
return parserProfile.createNodeFromToken( scope, token, line, col );
144145
}
146+
147+
@Override
148+
public Node createURI( final IRIx iriX, final long line, final long col ) {
149+
return parserProfile.createURI( iriX, line, col );
150+
}
145151
}

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/metamodel/DataTypes.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ public static class xsd {
108108
}
109109

110110
public static class samm {
111-
public static final Scalar curie = new DefaultScalar( CurieType.INSTANCE.getURI() );
111+
public static final Scalar curie = TYPES.get( CurieType.INSTANCE.getURI() );
112112
}
113113

114114
public static class rdf {
115-
public static final Scalar langString = new DefaultScalar( RDF.langString.getURI() );
115+
public static final Scalar langString = TYPES.get( RDF.langString.getURI() );
116116
}
117117
}

core/esmf-aspect-model-serializer/pom.xml

-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@
8787
<plugin>
8888
<groupId>org.codehaus.mojo</groupId>
8989
<artifactId>properties-maven-plugin</artifactId>
90-
<version>1.2.0</version>
9190
<executions>
9291
<execution>
9392
<phase>generate-resources</phase>

core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java

+5-16
Original file line numberDiff line numberDiff line change
@@ -71,32 +71,21 @@ public void beforeAnalysis( final Feature.BeforeAnalysisAccess access ) {
7171
.initializeAtBuildTime();
7272
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.BaseSchemaDVFactory.class )
7373
.initializeAtBuildTime();
74-
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl.class )
75-
.initializeAtBuildTime();
76-
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.QNameDV.class )
74+
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.BaseDVFactory.class )
7775
.initializeAtBuildTime();
7876
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.SchemaDVFactoryImpl.class )
7977
.initializeAtBuildTime();
8078
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class )
8179
.initializeAtBuildTime();
82-
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class )
83-
.initializeAtBuildTime();
84-
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$CharToken" )
85-
.initializeAtBuildTime();
86-
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ClosureToken" )
87-
.initializeAtBuildTime();
88-
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ParenToken" )
89-
.initializeAtBuildTime();
90-
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$UnionToken" )
91-
.initializeAtBuildTime();
9280
Native.forClass( org.apache.jena.ext.xerces.util.XercesXMLChar.class )
9381
.initializeAtBuildTime();
82+
Native.forClass( "com.github.benmanes.caffeine.cache.SSMS" )
83+
.registerEverythingForReflection();
84+
Native.forClass( "com.github.benmanes.caffeine.cache.PSMS" )
85+
.registerEverythingForReflection();
9486

9587
Native.addResource( "META-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle" );
9688
Native.addResource( "org/apache/jena/arq/arq-properties.xml" );
9789
Native.addResource( "org/apache/jena/jena-properties.xml" );
98-
99-
Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.xpath.regex.message" );
100-
Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.msg.XMLSchemaMessages" );
10190
}
10291
}

core/esmf-test-aspect-models/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
</dependency>
4343
<dependency>
4444
<groupId>org.apache.jena</groupId>
45-
<artifactId>jena-core</artifactId>
45+
<artifactId>jena-arq</artifactId>
4646
</dependency>
4747
</dependencies>
4848
</project>

core/esmf-test-aspect-models/src/main/java/org/eclipse/esmf/test/TestModel.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313

1414
package org.eclipse.esmf.test;
1515

16-
import java.io.StringWriter;
17-
1816
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
1917

2018
import org.apache.jena.rdf.model.Model;
19+
import org.apache.jena.riot.RDFFormat;
20+
import org.apache.jena.riot.RDFLanguages;
21+
import org.apache.jena.riot.RDFWriter;
2122

2223
@SuppressWarnings( "squid:S1214" ) // Can not be avoided because enums can't inherit from an abstract class
2324
public interface TestModel {
@@ -30,8 +31,12 @@ default AspectModelUrn getUrn() {
3031
}
3132

3233
static String modelToString( final Model model ) {
33-
final StringWriter stringWriter = new StringWriter();
34-
model.write( stringWriter, "TURTLE" );
35-
return stringWriter.toString();
34+
// org.apache.jena.riot.RDFWriter x;
35+
final String string = RDFWriter.create().format( RDFFormat.TURTLE ).lang( RDFLanguages.TURTLE ).source( model ).asString();
36+
37+
// final StringWriter stringWriter = new StringWriter();
38+
// model.write( stringWriter, "TURTLE" );
39+
// return stringWriter.toString();
40+
return string;
3641
}
3742
}

core/esmf-test-aspect-models/src/main/java/org/eclipse/esmf/test/TestSharedModel.java

+2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
public interface TestSharedModel extends TestModel {
1919
String TEST_NAMESPACE = "urn:samm:org.eclipse.esmf.test.shared:1.0.0#";
2020

21+
@Override
2122
String getName();
2223

24+
@Override
2325
default AspectModelUrn getUrn() {
2426
return AspectModelUrn.fromUrn( TEST_NAMESPACE + getName() );
2527
}

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<parent>
1919
<groupId>org.eclipse.esmf</groupId>
2020
<artifactId>esmf-parent</artifactId>
21-
<version>16</version>
21+
<version>DEV-SNAPSHOT</version>
2222
</parent>
2323

2424
<artifactId>esmf-sdk-parent</artifactId>

0 commit comments

Comments
 (0)