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