Skip to content

Commit e4d9126

Browse files
committed
GH-3001: Fuseki modules initialization fix
1 parent 5c33e9f commit e4d9126

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiAutoModules.java

+23-16
Original file line numberDiff line numberDiff line change
@@ -43,41 +43,48 @@ public class FusekiAutoModules {
4343
// ServiceLoader
4444
private static ServiceLoader<FusekiAutoModule> serviceLoader = null;
4545

46+
/**
47+
* Return the current (last loaded) Fuseki auto-modules.
48+
*/
49+
static FusekiModules get() {
50+
if ( currentLoadedModules != null )
51+
return currentLoadedModules;
52+
synchronized(lock) {
53+
if ( currentLoadedModules == null )
54+
load();
55+
return currentLoadedModules;
56+
}
57+
}
4658

4759
/**
4860
* Load FusekiAutoModules. This call reloads the modules every call.
4961
*/
50-
static FusekiModules load() {
51-
if ( serviceLoader == null )
52-
serviceLoader = createServiceLoader();
53-
currentLoadedModules = loadAutoModules(serviceLoader);
54-
return get();
62+
private static FusekiModules load() {
63+
synchronized (lock) {
64+
if ( serviceLoader == null )
65+
serviceLoader = createServiceLoader();
66+
currentLoadedModules = loadAutoModules(serviceLoader);
67+
}
68+
return currentLoadedModules;
5569
}
5670

5771
/**
58-
* Return the current (last loaded) Fuseki auto-modules.
72+
* For testing only.
5973
*/
60-
static FusekiModules get() {
61-
if ( currentLoadedModules == null )
62-
load();
63-
return currentLoadedModules;
74+
static void reset() {
75+
currentLoadedModules = null;
6476
}
6577

6678
// -- ServiceLoader machinery.
6779

68-
// // testing
69-
// /*package*/ static void reset() {
70-
// load();
71-
// }
72-
7380
/**
7481
* Discover FusekiModules via {@link java.util.ServiceLoader}.
7582
* This step does not create the module objects.
7683
*/
7784
private static ServiceLoader<FusekiAutoModule> createServiceLoader() {
7885
Class<FusekiAutoModule> moduleClass = FusekiAutoModule.class;
7986
ServiceLoader<FusekiAutoModule> newServiceLoader = null;
80-
synchronized (lock) {
87+
synchronized (lock) { // Not necessary if createServiceLoader() only called from load(). But harmless.
8188
try {
8289
newServiceLoader = ServiceLoader.load(moduleClass, FusekiAutoModules.class.getClassLoader());
8390
} catch (ServiceConfigurationError ex) {

jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,29 @@
2626
* A collection of {@linkplain FusekiModule Fuseki modules}.
2727
* <p>
2828
* There is one specific collection of modules - a system wide set of modules.
29-
* This collection defaults to the automatically discovered modules {@link FusekiAutoModules#load()}.
29+
* This collection defaults to the automatically discovered modules {@link FusekiAutoModules#get()}.
3030
*
3131
* @see FusekiAutoModules
3232
*/
3333
public class FusekiModules {
3434

35-
// Never null, maybe empty
36-
private static FusekiModules systemFusekiModules = FusekiModules.create();
35+
// Null means "not initialized".
36+
// Null should never leave this class!
37+
private static FusekiModules systemFusekiModules = null;
3738

3839
/**
3940
* There is a system wide set of modules used when no other modules are indicated.
4041
* These default to the automatically discovered modules.
42+
*
43+
* Use {@link #resetSystemDefault} to cause a reload of Fuseki auto modules.
4144
*/
4245
public static void setSystemDefault(FusekiModules fusekiModules) {
4346
systemFusekiModules = ( fusekiModules == null ) ? FusekiModules.create() : fusekiModules;
4447
}
4548

4649
/** Restore the original setting of the system default collection. */
4750
public static void restoreSystemDefault() {
48-
systemFusekiModules = FusekiModules.create();
51+
systemFusekiModules = null;
4952
}
5053

5154
public static FusekiModules getSystemModules() {
@@ -65,6 +68,7 @@ public static FusekiModules getSystemModules() {
6568
// Testing.
6669
/*package*/ static void resetSystemDefault() {
6770
// Reload, reset. Fresh objects.
71+
FusekiAutoModules.reset();
6872
systemFusekiModules = FusekiAutoModules.get();
6973
}
7074

jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/sys/TestFusekiModules.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ private void lifecycle(FusekiServer.Builder builder, ModuleForTest module) {
100100
FusekiModules systemModules = FusekiModules.getSystemModules();
101101
ModuleByServiceLoader.reset();
102102
try {
103-
FusekiModules loadedModules = FusekiAutoModules.load();
103+
FusekiModules.resetSystemDefault();
104+
FusekiModules loadedModules = FusekiAutoModules.get();
104105
FusekiModules.setSystemDefault(loadedModules);
105106

106107
// Reloaded by FusekiModules.resetSystemDefault

0 commit comments

Comments
 (0)