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