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 4ea18646ff5db966066ee498eb7492b22aea4bb3
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Oct 26 17:46:05 2024 +0100

    GH-2800: Controls to select the IRIProvider
---
 .../main/java/org/apache/jena/irix/SystemIRIx.java | 95 ++++++++++++++++------
 1 file changed, 68 insertions(+), 27 deletions(-)

diff --git a/jena-core/src/main/java/org/apache/jena/irix/SystemIRIx.java 
b/jena-core/src/main/java/org/apache/jena/irix/SystemIRIx.java
index 0db7f55c51..19fe0dccd4 100644
--- a/jena-core/src/main/java/org/apache/jena/irix/SystemIRIx.java
+++ b/jena-core/src/main/java/org/apache/jena/irix/SystemIRIx.java
@@ -19,6 +19,7 @@
 package org.apache.jena.irix;
 
 import org.apache.jena.atlas.lib.IRILib;
+import org.apache.jena.atlas.lib.Lib;
 import org.apache.jena.atlas.logging.Log;
 import org.apache.jena.iri3986.provider.IRIProvider3986;
 import org.apache.jena.iri3986.provider.InitIRI3986;
@@ -30,47 +31,68 @@ import org.apache.jena.shared.JenaException;
  */
 public class SystemIRIx {
 
-    // -- Providers
-    private static IRIProvider makeProviderJenaIRI() {
-        IRIProvider newProviderJenaIRI = new IRIProviderJenaIRI();
-        newProviderJenaIRI.strictMode("urn",  false);
-        newProviderJenaIRI.strictMode("http", false);
-        newProviderJenaIRI.strictMode("file", false);
-        return newProviderJenaIRI;
-    }
-
-    private static IRIProvider makeProviderIRI3986() {
-        InitIRI3986.init();
-        IRIProvider3986 providerIRI3986 = new IRIProvider3986();
-        return providerIRI3986;
-    }
-
-    // ** Do not use IRIProviderJDK in production. **
-    private static IRIProvider makeProviderJDK() { return new 
IRIProviderJDK(); }
-
     // -- System provider choice
+    private enum ProviderImpl { IRI0, IRI3986 }
+    // Jena 5.x : default is the legacy jena-iri
+    private static final ProviderImpl providerImpl = ProviderImpl.IRI0;
+    //private static final ProviderImpl providerImpl = ProviderImpl.IRI3986;
+    // --
+
+    // -- System-wide provider.
 
-    private enum ProviderImpl { JENA_IRI, IRI3986 }
+    private static IRIProvider provider = makeFreshSystemProvider();
 
-    //private static final ProviderImpl providerImpl = ProviderImpl.JENA_IRI;
-    private static final ProviderImpl providerImpl = ProviderImpl.IRI3986;
+    private static final String envVariableProvider = "JENA_IRIPROVIDER";
+    private static final String sysPropertyProvider = "jena.iriprovider";
 
     public static IRIProvider makeFreshSystemProvider() {
+        ProviderImpl sysProviderImpl = getProviderImpl();
+
         // ** This is the implementation choice point. **
-        return switch(providerImpl) {
+        return switch(sysProviderImpl) {
             case IRI3986 -> makeProviderIRI3986();
-            case JENA_IRI -> makeProviderJenaIRI();
+            case IRI0    -> makeProviderJenaIRI();
             default ->
                 throw new JenaException("Unknown IRIx Provider");
         };
     }
 
-    // -- System-wide provider.
-
-    private static IRIProvider provider = makeFreshSystemProvider();
+    /**
+     * Determine the system-wide IRIx provider (IRI implementation).
+     * <p>
+     * This can be controlled with environment variable {@code 
JENA_IRIPROVIDER} or
+     * Java system property {@code jena.iriprovider}.
+     * <p>
+     * The value is a string: {@code "IRI3986"} for the new (2024) 
implementation
+     * or {@code "IRI0"} for the legacy implementation.
+     * <p>
+     * Application do not normally need to choose and they use the system 
default.
+     */
+    private static ProviderImpl getProviderImpl() {
+        ProviderImpl sysProviderImpl = providerImpl;
+
+        String p = Lib.getenv(sysPropertyProvider, envVariableProvider);
+        if ( p != null ) {
+            String pNorm = Lib.uppercase(p);
+            ProviderImpl impl = switch(pNorm) {
+                case "IRI3986" -> ProviderImpl.IRI3986;
+                case "IRI0" ->  ProviderImpl.IRI0;
+                default -> null;
+            };
+            if ( impl != null ) {
+                sysProviderImpl = impl;
+                Log.info(SystemIRIx.class, "IRI Provider: "+impl);
+            } else {
+                Log.error(SystemIRIx.class, "IRI Provider not recognized: 
"+pNorm);
+                System.exit(1);
+            }
+        }
+        return sysProviderImpl;
+    }
 
-    // -- Initialization (called from InitjenaCore)
+    // -- System-wide provider.
 
+    // -- Initialization (called from InitJenaCore)
     public static void init() {}
 
     public static void reset() {
@@ -157,4 +179,23 @@ public class SystemIRIx {
     private static void setSystemBase(IRIx iri) {
         systemBase = iri;
     }
+
+    // -- Providers
+
+    private static IRIProvider makeProviderJenaIRI() {
+        IRIProvider newProviderJenaIRI = new IRIProviderJenaIRI();
+        newProviderJenaIRI.strictMode("urn",  false);
+        newProviderJenaIRI.strictMode("http", false);
+        newProviderJenaIRI.strictMode("file", false);
+        return newProviderJenaIRI;
+    }
+
+    private static IRIProvider makeProviderIRI3986() {
+        InitIRI3986.init();
+        IRIProvider3986 providerIRI3986 = new IRIProvider3986();
+        return providerIRI3986;
+    }
+
+    // ** Do not use IRIProviderJDK in production. **
+    private static IRIProvider makeProviderJDK() { return new 
IRIProviderJDK(); }
 }

Reply via email to