Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update esmf-parent #704

Merged
merged 2 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,53 +20,46 @@
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;

import jakarta.xml.bind.DatatypeConverter;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.jena.datatypes.DatatypeFormatException;
import org.apache.jena.datatypes.RDFDatatype;
import org.apache.jena.datatypes.TypeMapper;
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.datatypes.xsd.impl.RDFLangString;
import org.apache.jena.ext.xerces.impl.dv.XSSimpleType;
import org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl;
import org.apache.jena.graph.impl.LiteralLabel;
import org.apache.jena.rdf.model.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

private final Class<T> correspondingJavaClass;
private final Function<String, T> parser;
private final Function<T, String> unparser;
private final Predicate<String> lexicalValidator;
private static boolean checking = true;
private static final ExtendedSchemaDVFactoryImpl EXTENDED_SCHEMA_DV_FACTORY = new ExtendedSchemaDVFactoryImpl();

public SammXsdType( final Resource dataTypeResource, final Class<T> correspondingJavaClass,
final Function<String, T> parser,
final Function<T, String> unparser,
final Predicate<String> lexicalValidator ) {
super( dataTypeResource.getLocalName() );
this.correspondingJavaClass = correspondingJavaClass;
this.parser = parser;
this.unparser = unparser;
this.lexicalValidator = lexicalValidator;
}

private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
protected SammXsdType( final Resource dataTypeResource,
final Class<T> correspondingJavaClass,
final Function<String, T> parser,
final Function<T, String> unparser,
final Predicate<String> lexicalValidator ) {
//In the namespace the hash symbol should be removed, because jena defines the namespace differently.
super( xstype, dataTypeResource.getNameSpace().replace( "#", "" ) );
this.correspondingJavaClass = correspondingJavaClass;
super( dataTypeResource.getLocalName() );
javaClass = correspondingJavaClass;
this.parser = parser;
this.unparser = unparser;
this.lexicalValidator = lexicalValidator;
Expand Down Expand Up @@ -139,10 +132,9 @@ private SammXsdType( final Resource dataTypeResource, final XSSimpleType xstype,
value -> datatypeFactory.newXMLGregorianCalendar( value ), XMLGregorianCalendar::toXMLFormat,
XSDDatatype.XSDdateTime::isValid );

public static final SammXsdType<XMLGregorianCalendar> DATE_TIME_STAMP = new SammXsdType<>(
public static final SammExtendedXsdType<XMLGregorianCalendar> DATE_TIME_STAMP = new SammExtendedXsdType<>(
org.apache.jena.vocabulary.XSD.dateTimeStamp,
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.dateTimeStamp.getLocalName() ),
XMLGregorianCalendar.class, value -> datatypeFactory.newXMLGregorianCalendar( value ),
XMLGregorianCalendar.class, value -> SammXsdType.datatypeFactory.newXMLGregorianCalendar( value ),
XMLGregorianCalendar::toXMLFormat, XSDDatatype.XSDdateTimeStamp::isValid );

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

public static final SammXsdType<Duration> YEAR_MONTH_DURATION = new SammXsdType<>(
public static final SammExtendedXsdType<Duration> YEAR_MONTH_DURATION = new SammExtendedXsdType<>(
org.apache.jena.vocabulary.XSD.yearMonthDuration,
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.yearMonthDuration.getLocalName() ),
Duration.class, value -> datatypeFactory.newDurationYearMonth( value ), Duration::toString,
Duration.class, value -> SammXsdType.datatypeFactory.newDurationYearMonth( value ), Duration::toString,
XSDDatatype.XSDyearMonthDuration::isValid );

public static final SammXsdType<Duration> DAY_TIME_DURATION = new SammXsdType<>(
public static final SammExtendedXsdType<Duration> DAY_TIME_DURATION = new SammExtendedXsdType<>(
org.apache.jena.vocabulary.XSD.dayTimeDuration,
EXTENDED_SCHEMA_DV_FACTORY.getBuiltInType( org.apache.jena.vocabulary.XSD.dayTimeDuration.getLocalName() ),
Duration.class, value -> datatypeFactory.newDurationDayTime( value ), Duration::toString,
Duration.class, value -> SammXsdType.datatypeFactory.newDurationDayTime( value ), Duration::toString,
XSDDatatype.XSDdayTimeDuration::isValid );

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

@SuppressWarnings( "checkstyle:LambdaParameterName" )
public static final SammXsdType<String> STRING = new SammXsdType<>(
org.apache.jena.vocabulary.XSD.xstring, String.class, Function.identity(), Function.identity(), __ -> true );

public static final List<RDFDatatype> ALL_TYPES = List
.of( XSDDatatype.XSDstring, BOOLEAN, DECIMAL, INTEGER, DOUBLE, FLOAT, DATE, TIME, DATE_TIME, DATE_TIME_STAMP,
G_YEAR, G_MONTH, G_YEAR_MONTH, G_DAY, G_MONTH_DAY, DURATION, YEAR_MONTH_DURATION, DAY_TIME_DURATION,
Expand Down Expand Up @@ -311,9 +297,10 @@ public boolean isValid( final String lexicalForm ) {
return lexicalValidator.test( lexicalForm );
}

@SuppressWarnings( "unchecked" )
@Override
public Class<T> getJavaClass() {
return correspondingJavaClass;
return (Class<T>) javaClass;
}

private static boolean setupPerformed = false;
Expand Down Expand Up @@ -349,4 +336,116 @@ public static Class<?> getJavaTypeForMetaModelType( final Resource type ) {
.findAny()
.orElseThrow( () -> new IllegalStateException( "Invalid data type " + type + " found in model." ) );
}

/**
* Separate implementation for the "extended" RDF types that can not be based on {@link XSDDatatype}.
*
* @param <T> the Java class that represents values for the type
*/
public static class SammExtendedXsdType<T> implements SammType<T> {
private final String uri;
private final Class<T> javaClass;
private final Function<String, T> parser;
private final Function<T, String> unparser;
private final Predicate<String> lexicalValidator;

public SammExtendedXsdType(
final Resource dataTypeResource,
final Class<T> javaClass,
final Function<String, T> parser,
final Function<T, String> unparser,
final Predicate<String> lexicalValidator
) {
uri = dataTypeResource.getURI();
this.javaClass = javaClass;
this.parser = parser;
this.unparser = unparser;
this.lexicalValidator = lexicalValidator;
}

@Override
public Optional<T> parseTyped( final String lexicalForm ) {
try {
return Optional.of( parser.apply( lexicalForm ) );
} catch ( final RuntimeException exception ) {
if ( checking ) {
throw exception;
}
}
return Optional.empty();
}

@Override
public String unparseTyped( final T value ) {
return unparser.apply( value );
}

@Override
public String getURI() {
return uri;
}

@Override
@SuppressWarnings( "unchecked" )
public String unparse( final Object value ) {
return unparseTyped( (T) value );
}

@Override
public Object parse( final String lexicalForm ) throws DatatypeFormatException {
try {
return parser.apply( lexicalForm );
} catch ( final Exception exception ) {
if ( checking ) {
throw exception;
}
}
return lexicalForm;
}

@Override
public boolean isValid( final String lexicalForm ) {
return lexicalValidator.test( lexicalForm );
}

@Override
public boolean isValidValue( final Object valueForm ) {
return isValid( unparse( valueForm ) );
}

@Override
public boolean isValidLiteral( final LiteralLabel lit ) {
return isValid( lit.getLexicalForm() );
}

@Override
public boolean isEqual( final LiteralLabel value1, final LiteralLabel value2 ) {
return value1.getLexicalForm().equals( value2.getLexicalForm() );
}

@Override
public int getHashCode( final LiteralLabel lit ) {
return lit.getValueHashCode();
}

@Override
public Class<T> getJavaClass() {
return javaClass;
}

@Override
public Object cannonicalise( final Object value ) {
return value;
}

@Override
public Object extendedTypeDefinition() {
throw new NotImplementedException();
}

@Override
public RDFDatatype normalizeSubType( final Object value, final RDFDatatype dt ) {
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
import org.apache.jena.irix.IRIx;
import org.apache.jena.riot.system.ErrorHandler;
import org.apache.jena.riot.system.FactoryRDF;
import org.apache.jena.riot.system.ParserProfile;
Expand Down Expand Up @@ -142,4 +143,9 @@ public Node createGraphNode( final Graph graph, final long line, final long col
public Node createNodeFromToken( final Node scope, final Token token, final long line, final long col ) {
return parserProfile.createNodeFromToken( scope, token, line, col );
}

@Override
public Node createURI( final IRIx iriX, final long line, final long col ) {
return parserProfile.createURI( iriX, line, col );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,10 @@ public static class xsd {
}

public static class samm {
public static final Scalar curie = new DefaultScalar( CurieType.INSTANCE.getURI() );
public static final Scalar curie = TYPES.get( CurieType.INSTANCE.getURI() );
}

public static class rdf {
public static final Scalar langString = new DefaultScalar( RDF.langString.getURI() );
public static final Scalar langString = TYPES.get( RDF.langString.getURI() );
}
}
1 change: 0 additions & 1 deletion core/esmf-aspect-model-serializer/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.2.0</version>
<executions>
<execution>
<phase>generate-resources</phase>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,32 +71,21 @@ public void beforeAnalysis( final Feature.BeforeAnalysisAccess access ) {
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.BaseSchemaDVFactory.class )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl.class )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.QNameDV.class )
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.BaseDVFactory.class )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.SchemaDVFactoryImpl.class )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class )
.initializeAtBuildTime();
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$CharToken" )
.initializeAtBuildTime();
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ClosureToken" )
.initializeAtBuildTime();
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ParenToken" )
.initializeAtBuildTime();
Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$UnionToken" )
.initializeAtBuildTime();
Native.forClass( org.apache.jena.ext.xerces.util.XercesXMLChar.class )
.initializeAtBuildTime();
Native.forClass( "com.github.benmanes.caffeine.cache.SSMS" )
.registerEverythingForReflection();
Native.forClass( "com.github.benmanes.caffeine.cache.PSMS" )
.registerEverythingForReflection();

Native.addResource( "META-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle" );
Native.addResource( "org/apache/jena/arq/arq-properties.xml" );
Native.addResource( "org/apache/jena/jena-properties.xml" );

Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.xpath.regex.message" );
Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.msg.XMLSchemaMessages" );
}
}
2 changes: 1 addition & 1 deletion core/esmf-test-aspect-models/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
</dependency>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
<artifactId>jena-arq</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@

package org.eclipse.esmf.test;

import java.io.StringWriter;

import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.riot.RDFLanguages;
import org.apache.jena.riot.RDFWriter;

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

static String modelToString( final Model model ) {
final StringWriter stringWriter = new StringWriter();
model.write( stringWriter, "TURTLE" );
return stringWriter.toString();
// org.apache.jena.riot.RDFWriter x;
final String string = RDFWriter.create().format( RDFFormat.TURTLE ).lang( RDFLanguages.TURTLE ).source( model ).asString();

// final StringWriter stringWriter = new StringWriter();
// model.write( stringWriter, "TURTLE" );
// return stringWriter.toString();
return string;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
public interface TestSharedModel extends TestModel {
String TEST_NAMESPACE = "urn:samm:org.eclipse.esmf.test.shared:1.0.0#";

@Override
String getName();

@Override
default AspectModelUrn getUrn() {
return AspectModelUrn.fromUrn( TEST_NAMESPACE + getName() );
}
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<parent>
<groupId>org.eclipse.esmf</groupId>
<artifactId>esmf-parent</artifactId>
<version>16</version>
<version>DEV-SNAPSHOT</version>
</parent>

<artifactId>esmf-sdk-parent</artifactId>
Expand Down
Loading