This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 1bcdaa22ee8e93d4ae675dbbcb8c6cb5ed380c02 Author: Andy Seaborne <[email protected]> AuthorDate: Wed Nov 12 12:09:21 2025 +0000 Safe initialization of GeometryDatatype --- .../java/org/apache/jena/datatypes/TypeMapper.java | 1 - .../java/org/apache/jena/sys/InitJenaCore.java | 3 ++ .../jena/fuseki/geosparql/DatasetOperations.java | 2 -- .../org/apache/jena/geosparql/InitGeoSPARQL.java | 5 ++-- .../implementation/datatype/GeometryDatatype.java | 32 ++++++++++++---------- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java b/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java index dc2ce4a79d..3ad1121424 100644 --- a/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java +++ b/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java @@ -63,7 +63,6 @@ public class TypeMapper { /** * Static initializer. Adds builtin datatypes to the mapper. */ - static { reset() ; } public static void reset() { theTypeMap = new TypeMapper(); theTypeMap.registerDatatype(RDF.dtLangString) ; diff --git a/jena-core/src/main/java/org/apache/jena/sys/InitJenaCore.java b/jena-core/src/main/java/org/apache/jena/sys/InitJenaCore.java index 8a8add8130..f3cfe4e3f8 100644 --- a/jena-core/src/main/java/org/apache/jena/sys/InitJenaCore.java +++ b/jena-core/src/main/java/org/apache/jena/sys/InitJenaCore.java @@ -19,6 +19,7 @@ package org.apache.jena.sys; import org.apache.jena.assembler.Assembler; +import org.apache.jena.datatypes.TypeMapper; import org.apache.jena.irix.SystemIRIx; import org.apache.jena.vocabulary.OWL; import org.apache.jena.vocabulary.RDF; @@ -54,6 +55,8 @@ public class InitJenaCore implements JenaSubsystemLifecycle { // Initialization SystemIRIx.init(); + TypeMapper.reset(); + // Touch classes with constants. // This isn't necessary but it makes it more deterministic. // These constants are reused in various places. diff --git a/jena-fuseki2/jena-fuseki-geosparql/src/main/java/org/apache/jena/fuseki/geosparql/DatasetOperations.java b/jena-fuseki2/jena-fuseki-geosparql/src/main/java/org/apache/jena/fuseki/geosparql/DatasetOperations.java index f5c077a9e6..0feeb3a4af 100644 --- a/jena-fuseki2/jena-fuseki-geosparql/src/main/java/org/apache/jena/fuseki/geosparql/DatasetOperations.java +++ b/jena-fuseki2/jena-fuseki-geosparql/src/main/java/org/apache/jena/fuseki/geosparql/DatasetOperations.java @@ -30,7 +30,6 @@ import org.apache.jena.fuseki.geosparql.cli.FileGraphFormat; import org.apache.jena.geosparql.configuration.GeoSPARQLConfig; import org.apache.jena.geosparql.configuration.GeoSPARQLOperations; import org.apache.jena.geosparql.implementation.datatype.GMLDatatype; -import org.apache.jena.geosparql.implementation.datatype.GeometryDatatype; import org.apache.jena.geosparql.implementation.datatype.WKTDatatype; import org.apache.jena.geosparql.spatial.SpatialIndexException; import org.apache.jena.query.Dataset; @@ -126,7 +125,6 @@ public class DatasetOperations { public static final void registerDatatypes() { DatatypeController.addPrefixDatatype("wkt", WKTDatatype.INSTANCE); DatatypeController.addPrefixDatatype("gml", GMLDatatype.INSTANCE); - GeometryDatatype.registerDatatypes(); } public static void loadData(ArgsConfig argsConfig, Dataset dataset) throws DatasetException { diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/InitGeoSPARQL.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/InitGeoSPARQL.java index 72c41907fd..03268dd9c7 100644 --- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/InitGeoSPARQL.java +++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/InitGeoSPARQL.java @@ -18,8 +18,6 @@ package org.apache.jena.geosparql; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.jena.assembler.Assembler; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.atlas.logging.LogCtlJUL; @@ -30,6 +28,8 @@ import org.apache.jena.geosparql.implementation.datatype.GeometryDatatype; import org.apache.jena.sparql.core.assembler.AssemblerUtils; import org.apache.jena.sys.JenaSubsystemLifecycle; import org.apache.jena.sys.JenaSystem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class InitGeoSPARQL implements JenaSubsystemLifecycle { @@ -54,6 +54,7 @@ public class InitGeoSPARQL implements JenaSubsystemLifecycle { // SIS uses JUL for logging. LogCtlJUL.routeJULtoSLF4J(); JenaSystem.logLifecycle("InitGeoSPARQL - start"); + GeometryDatatype.registerDatatypes(); // Logs "SIS_DATA is not set" on "org.apache.sis.system" diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/implementation/datatype/GeometryDatatype.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/implementation/datatype/GeometryDatatype.java index 6eee42bf3c..11ce4bf4d3 100644 --- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/implementation/datatype/GeometryDatatype.java +++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/implementation/datatype/GeometryDatatype.java @@ -24,11 +24,8 @@ import org.apache.jena.datatypes.TypeMapper; import org.apache.jena.geosparql.implementation.GeometryWrapper; import org.apache.jena.geosparql.implementation.index.GeometryLiteralIndex; import org.apache.jena.geosparql.implementation.index.GeometryLiteralIndex.GeometryIndex; +import org.apache.jena.sys.JenaSystem; -/** - * - * - */ public abstract class GeometryDatatype extends BaseDatatype { public GeometryDatatype(String uri) { @@ -60,15 +57,22 @@ public abstract class GeometryDatatype extends BaseDatatype { } } - private static final TypeMapper TYPE_MAPPER = TypeMapper.getInstance(); - private static boolean isDatatypesRegistered = false; + public static void registerDatatypes() { + Types.init(); + } - public static final void registerDatatypes() { - if (!isDatatypesRegistered) { - TYPE_MAPPER.registerDatatype(WKTDatatype.INSTANCE); - TYPE_MAPPER.registerDatatype(GMLDatatype.INSTANCE); - isDatatypesRegistered = true; + // Robust initialization. + // Running the tests has an unpredictable order. + private static class Types { + static { JenaSystem.init(); } + private static final TypeMapper MAPPER = addDatatypes(); + public static TypeMapper addDatatypes() { + TypeMapper mapper = TypeMapper.getInstance(); + mapper.registerDatatype(WKTDatatype.INSTANCE); + mapper.registerDatatype(GMLDatatype.INSTANCE); + return mapper; } + public static void init() {} } public static final GeometryDatatype get(RDFDatatype rdfDatatype) throws DatatypeFormatException { @@ -81,14 +85,12 @@ public abstract class GeometryDatatype extends BaseDatatype { public static final GeometryDatatype get(String datatypeURI) { checkURI(datatypeURI); - RDFDatatype rdfDatatype = TYPE_MAPPER.getTypeByName(datatypeURI); - + RDFDatatype rdfDatatype = Types.MAPPER.getTypeByName(datatypeURI); return GeometryDatatype.get(rdfDatatype); } public static final boolean checkURI(String datatypeURI) throws DatatypeFormatException { - registerDatatypes(); - RDFDatatype rdfDatatype = TYPE_MAPPER.getTypeByName(datatypeURI); + RDFDatatype rdfDatatype = Types.MAPPER.getTypeByName(datatypeURI); if (rdfDatatype != null) { return rdfDatatype instanceof GeometryDatatype; } else {
