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 {

Reply via email to