CB-1184 App configuration merge implementation

This commit is contained in:
Serge Rider
2021-09-21 13:41:58 +03:00
parent 5836cbfceb
commit ff58ecb878
2 changed files with 64 additions and 15 deletions
@@ -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<String, Object> plugins = new LinkedHashMap<>();
private final Map<String, AuthProviderConfig> 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<String, Object> plugins;
private final Map<String, AuthProviderConfig> 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;
@@ -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<CBAppConfig> appConfigCreator = type -> appConfiguration;
InstanceCreator<CBDatabaseConfig> 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<String, Object> 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()) {