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


The following commit(s) were added to refs/heads/main by this push:
     new 9da8ff6874 GH-3001: Fuseki modules initialization fix
9da8ff6874 is described below

commit 9da8ff6874d75d563cdb29910b4a6cef16dac114
Author: Andy Seaborne <[email protected]>
AuthorDate: Tue Feb 11 16:41:40 2025 +0000

    GH-3001: Fuseki modules initialization fix
---
 .../jena/fuseki/main/sys/FusekiAutoModules.java    | 39 +++++++++++++---------
 .../apache/jena/fuseki/main/sys/FusekiModules.java | 12 ++++---
 .../jena/fuseki/main/sys/TestFusekiModules.java    |  3 +-
 3 files changed, 33 insertions(+), 21 deletions(-)

diff --git 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiAutoModules.java
 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiAutoModules.java
index 345755782b..7e77f50389 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiAutoModules.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiAutoModules.java
@@ -43,33 +43,40 @@ public class FusekiAutoModules {
     // ServiceLoader
     private static ServiceLoader<FusekiAutoModule> serviceLoader = null;
 
+    /**
+     * Return the current (last loaded) Fuseki auto-modules.
+     */
+    static FusekiModules get() {
+        if ( currentLoadedModules != null )
+            return currentLoadedModules;
+        synchronized(lock) {
+            if ( currentLoadedModules == null )
+                load();
+            return currentLoadedModules;
+        }
+    }
 
     /**
      * Load FusekiAutoModules. This call reloads the modules every call.
      */
-    static FusekiModules load() {
-        if ( serviceLoader == null )
-            serviceLoader = createServiceLoader();
-        currentLoadedModules = loadAutoModules(serviceLoader);
-        return get();
+    private static FusekiModules load() {
+        synchronized (lock) {
+            if ( serviceLoader == null )
+                serviceLoader = createServiceLoader();
+            currentLoadedModules = loadAutoModules(serviceLoader);
+        }
+        return currentLoadedModules;
     }
 
     /**
-     * Return the current (last loaded) Fuseki auto-modules.
+     * For testing only.
      */
-    static FusekiModules get() {
-        if ( currentLoadedModules == null )
-            load();
-        return currentLoadedModules;
+    static void reset() {
+        currentLoadedModules = null;
     }
 
     // -- ServiceLoader machinery.
 
-//    // testing
-//    /*package*/ static void reset() {
-//        load();
-//    }
-
     /**
      * Discover FusekiModules via {@link java.util.ServiceLoader}.
      * This step does not create the module objects.
@@ -77,7 +84,7 @@ public class FusekiAutoModules {
     private static ServiceLoader<FusekiAutoModule> createServiceLoader() {
         Class<FusekiAutoModule> moduleClass = FusekiAutoModule.class;
         ServiceLoader<FusekiAutoModule> newServiceLoader = null;
-        synchronized (lock) {
+        synchronized (lock) { // Not necessary if createServiceLoader() only 
called from load(). But harmless.
             try {
                 newServiceLoader = ServiceLoader.load(moduleClass, 
FusekiAutoModules.class.getClassLoader());
             } catch (ServiceConfigurationError ex) {
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java
 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java
index e3603b4d6d..c173ee1989 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java
@@ -26,18 +26,21 @@ import java.util.function.Consumer;
  * A collection of {@linkplain FusekiModule Fuseki modules}.
  * <p>
  * There is one specific collection of modules - a system wide set of modules.
- * This collection defaults to the automatically discovered modules {@link 
FusekiAutoModules#load()}.
+ * This collection defaults to the automatically discovered modules {@link 
FusekiAutoModules#get()}.
  *
  * @see FusekiAutoModules
  */
 public class FusekiModules {
 
-    // Never null, maybe empty
-    private static FusekiModules systemFusekiModules = FusekiModules.create();
+    // Null means "not initialized".
+    // Null should never leave this class!
+    private static FusekiModules systemFusekiModules = null;
 
     /**
      * There is a system wide set of modules used when no other modules are 
indicated.
      * These default to the automatically discovered modules.
+     *
+     * Use {@link #resetSystemDefault} to cause a reload of Fuseki auto 
modules.
      */
     public static void setSystemDefault(FusekiModules fusekiModules) {
         systemFusekiModules = ( fusekiModules == null ) ? 
FusekiModules.create() : fusekiModules;
@@ -45,7 +48,7 @@ public class FusekiModules {
 
     /** Restore the original setting of the system default collection. */
     public static void restoreSystemDefault() {
-        systemFusekiModules = FusekiModules.create();
+        systemFusekiModules = null;
     }
 
     public static FusekiModules getSystemModules() {
@@ -65,6 +68,7 @@ public class FusekiModules {
     // Testing.
     /*package*/ static void resetSystemDefault() {
         // Reload, reset. Fresh objects.
+        FusekiAutoModules.reset();
         systemFusekiModules = FusekiAutoModules.get();
     }
 
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/sys/TestFusekiModules.java
 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/sys/TestFusekiModules.java
index 28c020e234..ba230a8682 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/sys/TestFusekiModules.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/sys/TestFusekiModules.java
@@ -100,7 +100,8 @@ public class TestFusekiModules {
         FusekiModules systemModules = FusekiModules.getSystemModules();
         ModuleByServiceLoader.reset();
         try  {
-            FusekiModules loadedModules = FusekiAutoModules.load();
+            FusekiModules.resetSystemDefault();
+            FusekiModules loadedModules = FusekiAutoModules.get();
             FusekiModules.setSystemDefault(loadedModules);
 
             // Reloaded by FusekiModules.resetSystemDefault

Reply via email to