Skip to content

Commit da2974a

Browse files
committed
Make plugins response uniform in structure.
1 parent a34093b commit da2974a

10 files changed

Lines changed: 1284 additions & 393 deletions

File tree

engine/src/main/java/nl/inl/blacklab/plugins/PluginManager.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import nl.inl.blacklab.indexers.config.process.ProcessingInstructionStrip;
4444
import nl.inl.blacklab.indexers.config.process.ProcessingInstructionUnique;
4545
import nl.inl.blacklab.search.BlackLab;
46+
import nl.inl.blacklab.search.extensions.QueryExtensions;
4647
import nl.inl.blacklab.search.extensions.QueryFunctionAbs;
4748
import nl.inl.blacklab.search.extensions.QueryFunctionEnd;
4849
import nl.inl.blacklab.search.extensions.QueryFunctionFixedSpan;
@@ -109,6 +110,12 @@ public class PluginManager {
109110

110111
private static final Set<Class<? extends Plugin>> safePluginClasses = new HashSet<>();
111112

113+
/** Groovy plugin script we've found but not loaded yet. We don't yet know its plugin type. */
114+
record UnloadedGroovyPlugin(File scriptFile, BLConfigPlugins pluginConfig) {}
115+
116+
/** Groovy plugin scripts we've found but not loaded yet. We don't yet know their plugin type. */
117+
private static final Map<String, UnloadedGroovyPlugin> unloadedGroovyScripts = new LinkedHashMap<>();
118+
112119
static {
113120
addWebSafePlugins(List.of(
114121
// FileConverter
@@ -162,6 +169,7 @@ public class PluginManager {
162169
QueryFunctionSymbol.class,
163170
QueryFunctionUnion.class
164171
));
172+
QueryExtensions.registerAll(); // register e.g. rspan(), debug functions, etc.
165173
}
166174

167175
public static synchronized void addWebSafePlugins(List<Class<? extends Plugin>> pluginClasses) {
@@ -173,17 +181,6 @@ public static synchronized <T extends Plugin> boolean isAllowed(Plugin plugin) {
173181
return safePluginClasses.contains(plugin.getClass());
174182
}
175183

176-
private static synchronized void ensureInitialized() {
177-
if (!isInitialized)
178-
initialize(BlackLab.config().getPlugins(), BlackLab.configDir());
179-
}
180-
181-
/** Groovy plugin script we've found but not loaded yet. We don't yet know its plugin type. */
182-
record UnloadedGroovyPlugin(File scriptFile, BLConfigPlugins pluginConfig) {}
183-
184-
/** Groovy plugin scripts we've found but not loaded yet. We don't yet know their plugin type. */
185-
private static final Map<String, UnloadedGroovyPlugin> unloadedGroovyScripts = new LinkedHashMap<>();
186-
187184
// Nothing to do; initialization happens when the blacklab config is loaded.
188185
// The blacklab Config is automatically loaded when the first BlackLabIndex is
189186
// opened, or earlier by a user library.
@@ -198,23 +195,23 @@ public static File getPluginsDir() {
198195
}
199196

200197
public static synchronized void addPluginType(Class<? extends Plugin> pluginType) {
201-
if (isInitialized)
202-
throw new IllegalStateException("Cannot add plugin type after initialization");
203198
pluginTypes.add(pluginType);
199+
URLClassLoader cl = getPluginsDirClassLoader(PluginManager.class.getClassLoader());
200+
pluginsByType.put(pluginType, new PluginsOfType<>(pluginType, BlackLab.config().getPlugins(), cl));
204201
}
205202

206203
/**
207204
* Attempts to load and initialize all plugin classes and scripts in the plugin
208205
* directory (and classes on the classpath), passing the values in the config
209206
* to the matching plugin.
210-
*
211-
* @param pluginConfig configurations per plugin id
212-
* @param configDir directory where plugins and their configs can be found
213207
*/
214-
public static synchronized void initialize(BLConfigPlugins pluginConfig, File configDir) {
208+
public static synchronized void ensureInitialized() {
215209
if (isInitialized)
216-
throw new IllegalStateException("PluginManager already initialized");
210+
return; // only do this once
217211
isInitialized = true;
212+
213+
BLConfigPlugins pluginConfig = BlackLab.config().getPlugins();
214+
File configDir = BlackLab.configDir();
218215
PluginManager.pluginsDir = new File(configDir, PLUGINS_DIR_NAME);
219216

220217
logger.debug("Initializing plugin system...");
@@ -325,7 +322,7 @@ static synchronized <T extends Plugin> void getUnloaded(String scriptName) {
325322
}
326323
}
327324

328-
private static void register(Plugin plugin, BLConfigPlugins pluginConfig, String scriptFileName, boolean registerClassName) {
325+
private static synchronized void register(Plugin plugin, BLConfigPlugins pluginConfig, String scriptFileName, boolean registerClassName) {
329326
ensureInitialized();
330327
for (Class<? extends Plugin> pluginClass: pluginTypes) {
331328
if (pluginClass.isInstance(plugin)) {
@@ -345,7 +342,7 @@ public static <T extends Plugin> PluginsOfType<T> type(Class<T> pluginType) {
345342
}
346343

347344
/** Get all registered plugin types. */
348-
public static List<Class<? extends Plugin>> getPluginTypes() {
345+
public static synchronized List<Class<? extends Plugin>> getPluginTypes() {
349346
ensureInitialized();
350347
return List.copyOf(pluginTypes);
351348
}

engine/src/main/java/nl/inl/blacklab/plugins/QueryFunction.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public String getName() {
7373
return name;
7474
}
7575

76+
public List<PluginParam> getParameters() {
77+
return argTypes;
78+
}
79+
7680
public List<Object> preprocessArgs(QueryExecutionContext context, List<TextPattern> args) {
7781
// Make sure argument are interpreted as the correct type
7882
// (the parser interprets all values as queries, so we sometimes need to convert them back...)

engine/src/main/java/nl/inl/blacklab/search/BlackLab.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
public final class BlackLab {
5252
private static final Logger logger = LogManager.getLogger(BlackLab.class);
5353

54+
public static final String MSG_DEFAULT_CONFIG_ALREADY_APPLIED = "Cannot set default configuration - " +
55+
" configuration has already been applied.";
56+
5457
/**
5558
* If client doesn't explicitly create a BlackLab instance, one will be instantiated
5659
* automatically.
@@ -369,14 +372,11 @@ public static synchronized File configDir() {
369372
* because another default config has been applied already.
370373
*/
371374
public static synchronized void setConfigFromFile() {
372-
if (globalSettingsApplied)
373-
throw new UnsupportedOperationException("Cannot set default configuration - another configuration has already been applied.");
374-
375375
List<File> dirsToSearch = Collections.singletonList(configDir());
376376
File file = FileUtil.findFile(dirsToSearch, "blacklab", Arrays.asList("yaml", "yml", "json"));
377377
if (file != null) {
378378
try {
379-
blackLabConfig = BlackLabConfig.readConfigFile(file);
379+
setConfig(BlackLabConfig.readConfigFile(file), true);
380380
configDir = file.getParentFile();
381381
} catch (IOException e) {
382382
logger.warn("Could not load default blacklab configuration file " + file + ": " + e.getMessage());
@@ -396,12 +396,8 @@ public static synchronized void setConfigFromFile() {
396396
public static synchronized void setConfig(BlackLabConfig config, boolean forceApply) {
397397
if (globalSettingsApplied && !forceApply)
398398
return;
399-
400-
if (globalSettingsApplied) {
401-
throw new UnsupportedOperationException(
402-
"Cannot set default configuration - another configuration has already been applied.");
403-
}
404-
399+
if (globalSettingsApplied)
400+
throw new UnsupportedOperationException(MSG_DEFAULT_CONFIG_ALREADY_APPLIED);
405401
blackLabConfig = config;
406402
}
407403

engine/src/main/java/nl/inl/blacklab/search/extensions/QueryExtensions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class QueryExtensions {
1515
private QueryExtensions() {
1616
}
1717

18-
static {
18+
public static void registerAll() {
1919
register(XFDebug.class); // Debug functions such as _ident(), _FI1(), _FI2()
2020
register(XFRelations.class); // Functions for working with relations
2121
register(XFPunctBeforeAfter.class); // Pseudo-annotations punctBefore/punctAfter

solr/src/main/java/org/ivdnt/blacklab/solr/BlackLabSearchComponent.java

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.io.PrintWriter;
77
import java.io.StringWriter;
88
import java.nio.charset.StandardCharsets;
9-
import java.util.List;
109
import java.util.Map;
1110

1211
import org.apache.commons.lang3.StringUtils;
@@ -23,17 +22,8 @@
2322

2423
import nl.inl.blacklab.Constants;
2524
import nl.inl.blacklab.instrumentation.RequestInstrumentationProvider;
26-
import nl.inl.blacklab.plugins.AuthMethodProvider;
27-
import nl.inl.blacklab.plugins.PluginManager;
28-
import nl.inl.blacklab.queryParser.JsonParserProvider;
29-
import nl.inl.blacklab.queryParser.contextql.ContextQLParserProvider;
30-
import nl.inl.blacklab.queryParser.corpusql.BcqlParserProvider;
3125
import nl.inl.blacklab.search.BlackLabIndex;
32-
import nl.inl.blacklab.server.auth.AuthClarinEppn;
33-
import nl.inl.blacklab.server.auth.AuthDebugFixed;
34-
import nl.inl.blacklab.server.auth.AuthDebugUrl;
35-
import nl.inl.blacklab.server.auth.AuthHttpBasic;
36-
import nl.inl.blacklab.server.auth.AuthRequestValue;
26+
import nl.inl.blacklab.server.BlsMain;
3727
import nl.inl.blacklab.server.config.BLSConfig;
3828
import nl.inl.blacklab.server.config.BLSConfigDebug;
3929
import nl.inl.blacklab.server.datastream.DataStream;
@@ -96,16 +86,7 @@ public void inform(SolrCore core) {
9686
BLSConfig config = getConfig(core);
9787

9888
// Before the plugin system is initialized, add our plugin type to it
99-
PluginManager.addPluginType(AuthMethodProvider.class);
100-
PluginManager.addWebSafePlugins(List.of(
101-
AuthHttpBasic.class,
102-
AuthDebugFixed.class,
103-
AuthClarinEppn.class,
104-
AuthDebugUrl.class,
105-
AuthRequestValue.class,
106-
BcqlParserProvider.class,
107-
JsonParserProvider.class,
108-
ContextQLParserProvider.class));
89+
BlsMain.setUpBlsPlugins();
10990

11091
// Instantiate our search manager from the config
11192
config.setIsSolr(true);

0 commit comments

Comments
 (0)