diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java index c902d254f1..ff5d50cd34 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java @@ -35,21 +35,57 @@ import java.util.Map; public class CBAppConfig { public static final DataSourceNavigatorSettings DEFAULT_VIEW_SETTINGS = DataSourceNavigatorSettings.PRESET_FULL.getSettings(); - private boolean anonymousAccessEnabled = true; - private String anonymousUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME; - private String defaultUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME; - private boolean supportsCustomConnections = true; - private boolean supportsConnectionBrowser = false; - private boolean supportsUserWorkspaces = false; - private boolean publicCredentialsSaveEnabled = true; - private boolean adminCredentialsSaveEnabled = true; - private String[] enabledDrivers = new String[0]; - private String[] disabledDrivers = new String[0]; - private String defaultAuthProvider = LocalAuthProvider.PROVIDER_ID; - private String[] enabledAuthProviders = null; - private DataSourceNavigatorSettings defaultNavigatorSettings = DEFAULT_VIEW_SETTINGS; - private Map plugins = new LinkedHashMap<>(); - private final Map authConfiguration = new LinkedHashMap<>(); + private boolean anonymousAccessEnabled; + private String anonymousUserRole; + private String defaultUserRole; + private boolean supportsCustomConnections; + private boolean supportsConnectionBrowser; + private boolean supportsUserWorkspaces; + private boolean publicCredentialsSaveEnabled; + private boolean adminCredentialsSaveEnabled; + private String[] enabledDrivers; + private String[] disabledDrivers; + private String defaultAuthProvider; + private String[] enabledAuthProviders; + private DataSourceNavigatorSettings defaultNavigatorSettings; + private final Map plugins; + private final Map authConfiguration; + + public CBAppConfig() { + this.anonymousAccessEnabled = true; + this.anonymousUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME; + this.defaultUserRole = CBConstants.DEFAUL_APP_ANONYMOUS_ROLE_NAME; + this.supportsCustomConnections = true; + this.supportsConnectionBrowser = false; + this.supportsUserWorkspaces = false; + this.publicCredentialsSaveEnabled = true; + this.adminCredentialsSaveEnabled = true; + this.enabledDrivers = new String[0]; + this.disabledDrivers = new String[0]; + this.defaultAuthProvider = LocalAuthProvider.PROVIDER_ID; + this.enabledAuthProviders = null; + this.defaultNavigatorSettings = DEFAULT_VIEW_SETTINGS; + this.plugins = new LinkedHashMap<>(); + this.authConfiguration = new LinkedHashMap<>(); + } + + public CBAppConfig(CBAppConfig src) { + this.anonymousAccessEnabled = src.anonymousAccessEnabled; + this.anonymousUserRole = src.anonymousUserRole; + this.defaultUserRole = src.defaultUserRole; + this.supportsCustomConnections = src.supportsCustomConnections; + this.supportsConnectionBrowser = src.supportsConnectionBrowser; + this.supportsUserWorkspaces = src.supportsUserWorkspaces; + this.publicCredentialsSaveEnabled = src.publicCredentialsSaveEnabled; + this.adminCredentialsSaveEnabled = src.adminCredentialsSaveEnabled; + this.enabledDrivers = src.enabledDrivers; + this.disabledDrivers = src.disabledDrivers; + this.defaultAuthProvider = src.defaultAuthProvider; + this.enabledAuthProviders = src.enabledAuthProviders; + this.defaultNavigatorSettings = src.defaultNavigatorSettings; + this.plugins = new LinkedHashMap<>(src.plugins); + this.authConfiguration = new LinkedHashMap<>(src.authConfiguration); + } public boolean isAnonymousAccessEnabled() { return anonymousAccessEnabled; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index a3ad80c5f1..e92596603b 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -56,6 +56,8 @@ import java.net.URL; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * This class controls all aspects of the application's execution @@ -443,6 +445,8 @@ public class CBApplication extends BaseApplicationImpl { homeDirectory = new File(homeFolder); String productConfigPath = null; + CBAppConfig prevConfig = new CBAppConfig(appConfiguration); + // Stupid way to populate existing objects but ok google (https://github.com/google/gson/issues/431) InstanceCreator appConfigCreator = type -> appConfiguration; InstanceCreator dbConfigCreator = type -> databaseConfiguration; @@ -496,6 +500,15 @@ public class CBApplication extends BaseApplicationImpl { log.error("Error parsing server configuration", e); } + // Merge new config with old one + { + Map mergedPlugins = Stream.concat(prevConfig.getPlugins().entrySet().stream(), + appConfiguration.getPlugins().entrySet().stream()).collect( + Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o, o2) -> o2)); + appConfiguration.getPlugins().clear(); + appConfiguration.getPlugins().putAll(mergedPlugins); + } + if (!CommonUtils.isEmpty(productConfigPath)) { File productConfigFile = new File(productConfigPath); if (!productConfigFile.exists()) {