Skip to content

Commit 39cd813

Browse files
Plugin system to choose StorageManager implementation
#281
1 parent fe40801 commit 39cd813

5 files changed

Lines changed: 45 additions & 18 deletions

File tree

src/main/java/fr/inria/corese/core/next/storagemanager/api/plugin/StoragePlugin.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ default String getDescription() {
2424
return "StorageManager plugin: " + getName();
2525
}
2626

27-
27+
/**
28+
* Checks if this plugin supports the given configuration.
29+
*
30+
*
31+
* @param config the storage configuration to check (never null)
32+
* @return {@code true} if this plugin can create a StorageManager for this config
33+
* @throws IllegalArgumentException if config is null
34+
*/
35+
boolean supports(StorageConfig config);
2836

2937
/**
3038
* Creates a StorageManager instance from the given configuration.
@@ -44,5 +52,4 @@ default String getDescription() {
4452
default int getPriority() {
4553
return 0;
4654
}
47-
48-
}
55+
}

src/main/java/fr/inria/corese/core/next/storagemanager/api/plugin/StoragePluginManager.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import fr.inria.corese.core.next.storagemanager.api.StorageManager;
44
import fr.inria.corese.core.next.storagemanager.api.support.config.StorageConfig;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57

68
import java.util.*;
79
import java.util.concurrent.ConcurrentHashMap;
@@ -12,6 +14,8 @@
1214
*/
1315
public class StoragePluginManager {
1416

17+
private static final Logger logger = LoggerFactory.getLogger(StoragePluginManager.class);
18+
1519
/**
1620
* ServiceLoader for discovering plugins
1721
*/
@@ -55,6 +59,7 @@ public static StorageManager create(StorageConfig config) throws PluginException
5559

5660
// Find plugins that support this configuration
5761
List<StoragePlugin> supportingPlugins = allPlugins.stream()
62+
.filter(plugin -> plugin.supports(config))
5863
.sorted(Comparator.comparingInt(StoragePlugin::getPriority).reversed())
5964
.toList();
6065

@@ -65,26 +70,26 @@ public static StorageManager create(StorageConfig config) throws PluginException
6570

6671
throw new PluginNotFoundException(
6772
String.format("No plugin found for storage type '%s'. Available types: [%s]",
68-
config.getType(), availableTypes)
73+
config.getType().orElse("not specified"), availableTypes)
6974
);
7075
}
7176

7277
// Select plugin with highest priority
7378
StoragePlugin selectedPlugin = supportingPlugins.getFirst();
7479

75-
// Log warning if multiple plugins match
7680
if (supportingPlugins.size() > 1) {
7781
String otherPlugins = supportingPlugins.stream()
7882
.skip(1)
7983
.map(p -> p.getName() + " (priority=" + p.getPriority() + ")")
8084
.collect(Collectors.joining(", "));
8185

82-
System.out.println("WARNING: Multiple plugins support this configuration. " +
83-
"Selected '" + selectedPlugin.getName() + "' (priority=" +
84-
selectedPlugin.getPriority() + "). Ignored: " + otherPlugins);
86+
logger.warn("Multiple plugins support this configuration. " +
87+
"Selected '{}' (priority={}). Ignored: {}",
88+
selectedPlugin.getName(),
89+
selectedPlugin.getPriority(),
90+
otherPlugins);
8591
}
8692

87-
// Create StorageManager
8893
try {
8994
return selectedPlugin.create(config);
9095
} catch (PluginException e) {
@@ -146,7 +151,6 @@ public static Optional<StoragePlugin> findPlugin(String name) {
146151
return Optional.ofNullable(pluginsByName.get(name));
147152
}
148153

149-
150154
/**
151155
* Returns the names of all available plugins.
152156
*
@@ -170,6 +174,4 @@ public static void reload() {
170174
pluginsByName.clear();
171175
}
172176
}
173-
174-
175-
}
177+
}

src/main/java/fr/inria/corese/core/next/storagemanager/impl/graph/plugin/GraphStoragePlugin.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@ public String getDescription() {
2323
return "Legacy Corese Graph backend (production-ready, indexed, thread-safe)";
2424
}
2525

26+
@Override
27+
public boolean supports(StorageConfig config) {
28+
if (config == null) {
29+
return false;
30+
}
31+
return config.getType()
32+
.map("graph"::equalsIgnoreCase)
33+
.orElse(false);
34+
}
2635

2736
@Override
2837
public StorageManager create(StorageConfig config) throws PluginException {
2938
try {
3039
Graph graph = config.getProperty("graph", Graph.class)
31-
.orElseThrow(() -> new PluginException("Graph instance required"));
40+
.orElseThrow(() -> new PluginException("Graph instance required in config properties"));
3241

3342
ValueFactory factory = config.getProperty("valueFactory", ValueFactory.class)
34-
.orElseThrow(() -> new PluginException("ValueFactory required"));
43+
.orElseThrow(() -> new PluginException("ValueFactory required in config properties"));
3544

3645
GraphStorageManager storage = GraphStorageManager.builder()
3746
.graph(graph)
@@ -52,4 +61,4 @@ public StorageManager create(StorageConfig config) throws PluginException {
5261
public int getPriority() {
5362
return 100;
5463
}
55-
}
64+
}

src/main/java/fr/inria/corese/core/next/storagemanager/impl/memory/plugin/MemoryStoragePlugin.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ public String getDescription() {
2121
return "In-memory HashMap backend (testing only, no persistence)";
2222
}
2323

24+
@Override
25+
public boolean supports(StorageConfig config) {
26+
if (config == null) {
27+
return false;
28+
}
29+
return config.getType()
30+
.map("memory"::equalsIgnoreCase)
31+
.orElse(false);
32+
}
2433

2534
@Override
2635
public StorageManager create(StorageConfig config) throws PluginException {
@@ -30,7 +39,6 @@ public StorageManager create(StorageConfig config) throws PluginException {
3039

3140

3241
try {
33-
// Build MemoryStorageManager (no dependencies required)
3442
MemoryStorageManager storage = MemoryStorageManager.builder().build();
3543

3644
// Initialize lifecycle

src/test/java/fr/inria/corese/core/next/data/impl/io/serialization/turtle/TurtleSerializerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,8 @@ void testBlankNodeSerializarionWithoutId() {
344344

345345
turtleSerializer.write(writer);
346346
String actual = writer.toString().replace("\r\n", "\n");
347-
System.out.println(actual);
347+
logger.debug("Serialized Turtle output:\n{}", actual);
348+
348349
}
349350

350351
/**

0 commit comments

Comments
 (0)