From 961a9c60f2e18399cce5abb582fd11f1b56a9b71 Mon Sep 17 00:00:00 2001 From: lvca Date: Thu, 8 Aug 2024 11:09:32 -0400 Subject: [PATCH] fix: server plugin installation priority Fixed issue #1684 --- .../java/com/arcadedb/server/ArcadeDBServer.java | 15 ++++++++++++--- .../java/com/arcadedb/server/ServerPlugin.java | 8 ++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/arcadedb/server/ArcadeDBServer.java b/server/src/main/java/com/arcadedb/server/ArcadeDBServer.java index fddd2987ce..91c4cb9a01 100644 --- a/server/src/main/java/com/arcadedb/server/ArcadeDBServer.java +++ b/server/src/main/java/com/arcadedb/server/ArcadeDBServer.java @@ -148,6 +148,9 @@ public synchronized void start() { // START HTTP SERVER IMMEDIATELY. THE HTTP ADDRESS WILL BE USED BY HA httpServer = new HttpServer(this); + + registerPlugins(ServerPlugin.INSTALLATION_PRIORITY.BEFORE_HTTP_ON); + httpServer.startService(); if (configuration.getValueAsBoolean(GlobalConfiguration.HA_ENABLED)) { @@ -155,13 +158,15 @@ public synchronized void start() { haServer.startService(); } - loadDefaultDatabases(); + registerPlugins(ServerPlugin.INSTALLATION_PRIORITY.AFTER_HTTP_ON); - registerPlugins(); + loadDefaultDatabases(); // RELOAD DATABASE IF A PLUGIN REGISTERED A NEW DATABASE (LIKE THE GREMLIN SERVER) loadDatabases(); + registerPlugins(ServerPlugin.INSTALLATION_PRIORITY.AFTER_DATABASES_OPEN); + status = STATUS.ONLINE; LogManager.instance().log(this, Level.INFO, "Available query languages: %s", new QueryEngineManager().getAvailableLanguages()); @@ -220,7 +225,7 @@ private Set getPluginNames() { return result; } - private void registerPlugins() { + private void registerPlugins(final ServerPlugin.INSTALLATION_PRIORITY installationPriority) { final String registeredPlugins = configuration.getValueAsString(GlobalConfiguration.SERVER_PLUGINS); if (registeredPlugins != null && !registeredPlugins.isEmpty()) { final String[] pluginEntries = registeredPlugins.split(","); @@ -233,6 +238,10 @@ private void registerPlugins() { final Class c = (Class) Class.forName(pluginClass); final ServerPlugin pluginInstance = c.getConstructor().newInstance(); + + if (pluginInstance.getInstallationPriority() != installationPriority) + continue; + pluginInstance.configure(this, configuration); pluginInstance.startService(); diff --git a/server/src/main/java/com/arcadedb/server/ServerPlugin.java b/server/src/main/java/com/arcadedb/server/ServerPlugin.java index 75a8ab530e..746993ed7a 100644 --- a/server/src/main/java/com/arcadedb/server/ServerPlugin.java +++ b/server/src/main/java/com/arcadedb/server/ServerPlugin.java @@ -22,7 +22,11 @@ import com.arcadedb.server.http.HttpServer; import io.undertow.server.handlers.PathHandler; +import static com.arcadedb.server.ServerPlugin.INSTALLATION_PRIORITY.BEFORE_HTTP_ON; + public interface ServerPlugin { + enum INSTALLATION_PRIORITY {BEFORE_HTTP_ON, AFTER_HTTP_ON, AFTER_DATABASES_OPEN} + default void configure(ArcadeDBServer arcadeDBServer, ContextConfiguration configuration) { // DEFAULT IMPLEMENTATION } @@ -36,4 +40,8 @@ default void stopService() { default void registerAPI(final HttpServer httpServer, final PathHandler routes) { // DEFAULT IMPLEMENTATION } + + default INSTALLATION_PRIORITY getInstallationPriority() { + return BEFORE_HTTP_ON; + } }