From 64b3ae280bee644b27c1b898f1aab9a7bb5d8e91 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Thu, 31 Mar 2022 11:22:12 +0300 Subject: [PATCH] CB-1859 Slf4j configuration redesign + CE configuration deployment fix --- .../core}/initial-data.conf | 0 config/core/logback.xml | 20 +++++ .../core}/product.conf | 0 .../.dbeaver/data-sources.json | 0 .../.dbeaver/provided-connections.json | 0 .../DefaultConfiguration/cloudbeaver.conf | 0 .../sample-databases/README.md | 0 .../.dbeaver/data-sources.json | 0 .../.dbeaver/provided-connections.json | 0 .../SQLiteConfiguration/cloudbeaver.conf | 0 .../sample-databases/db/Chinook.sqlitedb | Bin .../sample-databases/db/README | 0 deploy/build.bat | 5 +- deploy/build.sh | 2 +- .../model/app/BaseWebApplication.java | 71 ++++++++++++++++++ .../io/cloudbeaver/server/CBApplication.java | 59 +++++++-------- .../io/cloudbeaver/server/CBConstants.java | 3 - .../feature.properties | 2 +- .../io.cloudbeaver.server.feature/feature.xml | 7 +- .../build.properties | 2 + .../feature.properties | 4 + .../io.cloudbeaver.ws.feature/feature.xml | 48 ++++++++++++ .../io.cloudbeaver.ws.feature/pom.xml | 15 ++++ server/features/pom.xml | 2 + 24 files changed, 197 insertions(+), 43 deletions(-) rename {samples/sample-databases => config/core}/initial-data.conf (100%) create mode 100644 config/core/logback.xml rename {samples/sample-databases => config/core}/product.conf (100%) rename {samples => config}/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/data-sources.json (100%) rename {samples => config}/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json (100%) rename {samples => config}/sample-databases/DefaultConfiguration/cloudbeaver.conf (100%) rename {samples => config}/sample-databases/README.md (100%) rename {samples => config}/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/data-sources.json (100%) rename {samples => config}/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json (100%) rename {samples => config}/sample-databases/SQLiteConfiguration/cloudbeaver.conf (100%) rename {samples => config}/sample-databases/db/Chinook.sqlitedb (100%) rename {samples => config}/sample-databases/db/README (100%) create mode 100644 server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java create mode 100644 server/features/io.cloudbeaver.ws.feature/build.properties create mode 100644 server/features/io.cloudbeaver.ws.feature/feature.properties create mode 100644 server/features/io.cloudbeaver.ws.feature/feature.xml create mode 100644 server/features/io.cloudbeaver.ws.feature/pom.xml diff --git a/samples/sample-databases/initial-data.conf b/config/core/initial-data.conf similarity index 100% rename from samples/sample-databases/initial-data.conf rename to config/core/initial-data.conf diff --git a/config/core/logback.xml b/config/core/logback.xml new file mode 100644 index 0000000000..79ca690945 --- /dev/null +++ b/config/core/logback.xml @@ -0,0 +1,20 @@ + + + + + + + %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/sample-databases/product.conf b/config/core/product.conf similarity index 100% rename from samples/sample-databases/product.conf rename to config/core/product.conf diff --git a/samples/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/data-sources.json b/config/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/data-sources.json similarity index 100% rename from samples/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/data-sources.json rename to config/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/data-sources.json diff --git a/samples/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json b/config/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json similarity index 100% rename from samples/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json rename to config/sample-databases/DefaultConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json diff --git a/samples/sample-databases/DefaultConfiguration/cloudbeaver.conf b/config/sample-databases/DefaultConfiguration/cloudbeaver.conf similarity index 100% rename from samples/sample-databases/DefaultConfiguration/cloudbeaver.conf rename to config/sample-databases/DefaultConfiguration/cloudbeaver.conf diff --git a/samples/sample-databases/README.md b/config/sample-databases/README.md similarity index 100% rename from samples/sample-databases/README.md rename to config/sample-databases/README.md diff --git a/samples/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/data-sources.json b/config/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/data-sources.json similarity index 100% rename from samples/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/data-sources.json rename to config/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/data-sources.json diff --git a/samples/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json b/config/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json similarity index 100% rename from samples/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json rename to config/sample-databases/SQLiteConfiguration/GlobalConfiguration/.dbeaver/provided-connections.json diff --git a/samples/sample-databases/SQLiteConfiguration/cloudbeaver.conf b/config/sample-databases/SQLiteConfiguration/cloudbeaver.conf similarity index 100% rename from samples/sample-databases/SQLiteConfiguration/cloudbeaver.conf rename to config/sample-databases/SQLiteConfiguration/cloudbeaver.conf diff --git a/samples/sample-databases/db/Chinook.sqlitedb b/config/sample-databases/db/Chinook.sqlitedb similarity index 100% rename from samples/sample-databases/db/Chinook.sqlitedb rename to config/sample-databases/db/Chinook.sqlitedb diff --git a/samples/sample-databases/db/README b/config/sample-databases/db/README similarity index 100% rename from samples/sample-databases/db/README rename to config/sample-databases/db/README diff --git a/deploy/build.bat b/deploy/build.bat index 9dd842a3d2..651422d7f9 100644 --- a/deploy/build.bat +++ b/deploy/build.bat @@ -4,7 +4,8 @@ rem command line arguments SET CONFIGURATION_PATH=%1 SET SAMPLE_DATABASE_PATH=%2 -IF "%CONFIGURATION_PATH%"=="" SET CONFIGURATION_PATH="..\samples\sample-databases\DefaultConfiguration" +IF "%CONFIGURATION_PATH%"=="" SET CONFIGURATION_PATH="..\config\sample-databases\DefaultConfiguration" +echo "Configuration path=%CONFIGURATION_PATH%" echo Clone and build Cloudbeaver @@ -39,10 +40,10 @@ IF NOT "%SAMPLE_DATABASE_PATH%"=="" ( mkdir cloudbeaver\samples\db xcopy /E /Q %SAMPLE_DATABASE_PATH% cloudbeaver\samples\db >NUL ) +copy ..\config\core\* cloudbeaver\conf >NUL copy %CONFIGURATION_PATH%\GlobalConfiguration\.dbeaver\data-sources.json cloudbeaver\conf\initial-data-sources.conf >NUL copy %CONFIGURATION_PATH%\*.conf cloudbeaver\conf >NUL -copy ..\samples\sample-databases\*.conf cloudbeaver\conf >NUL move drivers cloudbeaver >NUL echo Build static content diff --git a/deploy/build.sh b/deploy/build.sh index cfb7594d15..6d13261649 100755 --- a/deploy/build.sh +++ b/deploy/build.sh @@ -45,9 +45,9 @@ if [[ -n "${SAMPLE_DATABASE_PATH}" ]]; then cp -rp "${SAMPLE_DATABASE_PATH}" cloudbeaver/samples/ fi +cp -rp ../conig/core/* cloudbeaver/conf cp -rp "${CONFIGURATION_PATH}"/GlobalConfiguration/.dbeaver/data-sources.json cloudbeaver/conf/initial-data-sources.conf cp -p "${CONFIGURATION_PATH}"/*.conf cloudbeaver/conf/ -cp -p ../samples/sample-databases/*.conf cloudbeaver/conf/ mv drivers cloudbeaver echo "Build static content" diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java new file mode 100644 index 0000000000..d011bd0af7 --- /dev/null +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java @@ -0,0 +1,71 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2022 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.model.app; + +import org.eclipse.core.runtime.Platform; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.registry.BaseApplicationImpl; + +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Web application + */ +public abstract class BaseWebApplication extends BaseApplicationImpl { + + public static final String DEFAULT_CONFIG_FILE_PATH = "/etc/cloudbeaver.conf"; + public static final String CLI_PARAM_WEB_CONFIG = "-web-config"; + + + private static final Log log = Log.getLog(BaseWebApplication.class); + + @Nullable + protected Path loadServerConfiguration() { + String configPath = DEFAULT_CONFIG_FILE_PATH; + + String[] args = Platform.getCommandLineArgs(); + for (int i = 0; i < args.length; i++) { + if (args[i].equals(CLI_PARAM_WEB_CONFIG) && args.length > i + 1) { + configPath = args[i + 1]; + break; + } + } + Path path = Path.of(configPath); + // Configure logging + Path logbackConfigPath = path.getParent().resolve("logback.xml").toAbsolutePath(); + if (!Files.exists(logbackConfigPath)) { + System.err.println("Can't find slf4j configuration file " + logbackConfigPath.toString()); + } else { + System.setProperty("logback.configurationFile", logbackConfigPath.toString()); + } + + // Load config file + try { + loadConfiguration(configPath); + } catch (Exception e) { + log.error("Error parsing configuration", e); + return null; + } + + return path; + } + + protected abstract void loadConfiguration(String configPath); + +} 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 8e75cc22d7..9d5e3e832f 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 @@ -20,20 +20,18 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.InstanceCreator; import com.google.gson.stream.JsonWriter; -import io.cloudbeaver.model.app.WebApplication; -import io.cloudbeaver.model.user.WebRole; -import io.cloudbeaver.model.user.WebUser; -import io.cloudbeaver.service.security.SecurityPluginService; -import io.cloudbeaver.utils.WebAppUtils; -import org.jkiss.dbeaver.model.security.SMAdminController; -import org.jkiss.dbeaver.model.security.SMController; -import org.jkiss.dbeaver.model.security.SMDataSourceGrant; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.auth.provider.AuthProviderConfig; +import io.cloudbeaver.model.app.BaseWebApplication; +import io.cloudbeaver.model.app.WebApplication; import io.cloudbeaver.model.session.WebAuthInfo; +import io.cloudbeaver.model.user.WebRole; +import io.cloudbeaver.model.user.WebUser; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.jetty.CBJettyServer; import io.cloudbeaver.service.DBWServiceInitializer; +import io.cloudbeaver.service.security.SecurityPluginService; +import io.cloudbeaver.utils.WebAppUtils; import org.eclipse.core.runtime.Platform; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.osgi.service.datalocation.Location; @@ -46,6 +44,9 @@ import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.app.DBPApplication; import org.jkiss.dbeaver.model.data.json.JSONUtils; import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings; +import org.jkiss.dbeaver.model.security.SMAdminController; +import org.jkiss.dbeaver.model.security.SMController; +import org.jkiss.dbeaver.model.security.SMDataSourceGrant; import org.jkiss.dbeaver.registry.BaseApplicationImpl; import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -75,7 +76,7 @@ import java.util.stream.Stream; /** * This class controls all aspects of the application's execution */ -public class CBApplication extends BaseApplicationImpl implements WebApplication { +public class CBApplication extends BaseWebApplication implements WebApplication { private static final Log log = Log.getLog(CBApplication.class); @@ -193,25 +194,8 @@ public class CBApplication extends BaseApplicationImpl implements WebApplication @Override public Object start(IApplicationContext context) { - String configPath = CBConstants.DEFAULT_CONFIG_FILE_PATH; - - String[] args = Platform.getCommandLineArgs(); - for (int i = 0; i < args.length; i++) { - if (args[i].equals(CBConstants.CLI_PARAM_WEB_CONFIG) && args.length > i + 1) { - configPath = args[i + 1]; - break; - } - } - try { - loadConfiguration(configPath); - - File runtimeConfigFile = getRuntimeAppConfigFile(); - if (runtimeConfigFile.exists()) { - log.debug("Runtime configuration [" + runtimeConfigFile.getAbsolutePath() + "]"); - parseConfiguration(runtimeConfigFile); - } - } catch (Exception e) { - log.error("Error parsing configuration", e); + Path configPath = loadServerConfiguration(); + if (configPath == null) { return null; } @@ -297,7 +281,7 @@ public class CBApplication extends BaseApplicationImpl implements WebApplication if (configurationMode) { // Try to configure automatically - performAutoConfiguration(new File(configPath).getParentFile()); + performAutoConfiguration(configPath.toFile().getParentFile()); } if (enableSecurityManager) { @@ -441,7 +425,22 @@ public class CBApplication extends BaseApplicationImpl implements WebApplication return SecurityPluginService.createSecurityService(this, databaseConfiguration); } - private void loadConfiguration(String configPath) { + @Nullable + @Override + protected Path loadServerConfiguration() { + Path path = super.loadServerConfiguration(); + + File runtimeConfigFile = getRuntimeAppConfigFile(); + if (runtimeConfigFile.exists()) { + log.debug("Runtime configuration [" + runtimeConfigFile.getAbsolutePath() + "]"); + parseConfiguration(runtimeConfigFile); + } + + return path; + } + + @Override + protected void loadConfiguration(String configPath) { log.debug("Using configuration [" + configPath + "]"); File configFile = new File(configPath); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java index 7530c6ee64..a13df141fe 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBConstants.java @@ -20,14 +20,11 @@ package io.cloudbeaver.server; * Various constants */ public class CBConstants { - public static final String DEFAULT_CONFIG_FILE_PATH = "/etc/cloudbeaver.conf"; public static final String RUNTIME_DATA_DIR_NAME = ".data"; public static final String RUNTIME_APP_CONFIG_FILE_NAME = ".cloudbeaver.runtime.conf"; public static final String RUNTIME_PRODUCT_CONFIG_FILE_NAME = ".product.runtime.conf"; public static final String AUTO_CONFIG_FILE_NAME = ".cloudbeaver.auto.conf"; - public static final String CLI_PARAM_WEB_CONFIG = "-web-config"; - public static final String PARAM_SERVER_PORT = "serverPort"; public static final String PARAM_SERVER_HOST = "serverHost"; public static final String PARAM_SERVER_NAME = "serverName"; diff --git a/server/features/io.cloudbeaver.server.feature/feature.properties b/server/features/io.cloudbeaver.server.feature/feature.properties index 283c056731..1309252e87 100644 --- a/server/features/io.cloudbeaver.server.feature/feature.properties +++ b/server/features/io.cloudbeaver.server.feature/feature.properties @@ -1,4 +1,4 @@ featureName=Cloudbeaver Server providerName=DBeaver Corp description=Cloudbeaver server feature -copyright=\u00A9 DBeaver Corp, 2022 +copyright=DBeaver Corp, 2022 diff --git a/server/features/io.cloudbeaver.server.feature/feature.xml b/server/features/io.cloudbeaver.server.feature/feature.xml index e832886e10..19efc266f6 100644 --- a/server/features/io.cloudbeaver.server.feature/feature.xml +++ b/server/features/io.cloudbeaver.server.feature/feature.xml @@ -28,10 +28,9 @@ - + - @@ -46,12 +45,8 @@ - - - - diff --git a/server/features/io.cloudbeaver.ws.feature/build.properties b/server/features/io.cloudbeaver.ws.feature/build.properties new file mode 100644 index 0000000000..b3a611b5c9 --- /dev/null +++ b/server/features/io.cloudbeaver.ws.feature/build.properties @@ -0,0 +1,2 @@ +bin.includes = feature.xml,\ + feature.properties diff --git a/server/features/io.cloudbeaver.ws.feature/feature.properties b/server/features/io.cloudbeaver.ws.feature/feature.properties new file mode 100644 index 0000000000..7e1d44bf28 --- /dev/null +++ b/server/features/io.cloudbeaver.ws.feature/feature.properties @@ -0,0 +1,4 @@ +featureName=Cloudbeaver Web Services feature +providerName=DBeaver Corp +description=Cloudbeaver Web Services feature +copyright=DBeaver Corp, 2022 diff --git a/server/features/io.cloudbeaver.ws.feature/feature.xml b/server/features/io.cloudbeaver.ws.feature/feature.xml new file mode 100644 index 0000000000..a873d446da --- /dev/null +++ b/server/features/io.cloudbeaver.ws.feature/feature.xml @@ -0,0 +1,48 @@ + + + + + %description + + + + %copyright + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/features/io.cloudbeaver.ws.feature/pom.xml b/server/features/io.cloudbeaver.ws.feature/pom.xml new file mode 100644 index 0000000000..b20b9adfd5 --- /dev/null +++ b/server/features/io.cloudbeaver.ws.feature/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + io.cloudbeaver + features + 1.0.0-SNAPSHOT + ../ + + io.cloudbeaver.ws.feature + 1.0.0-SNAPSHOT + eclipse-feature + diff --git a/server/features/pom.xml b/server/features/pom.xml index 2f8045d6ee..0633ac55ef 100644 --- a/server/features/pom.xml +++ b/server/features/pom.xml @@ -13,6 +13,8 @@ pom + io.cloudbeaver.ws.feature + io.cloudbeaver.server.feature io.cloudbeaver.ce.drivers.feature