From c85974c9f5fe4c415ac10b7fcd0b5ad69e55ff25 Mon Sep 17 00:00:00 2001 From: Alexander Skoblikov Date: Mon, 10 Feb 2025 19:06:57 +0300 Subject: [PATCH] =?UTF-8?q?dbeaver/pro#3978=20init=20workspace=20before=20?= =?UTF-8?q?configuration,=20support=20temp=20fo=E2=80=A6=20(#3236)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * dbeaver/pro#3978 init workspace before configuration, support temp folder in services * dbeaver/pro#3978 fix tests --------- Co-authored-by: kseniaguzeeva <112612526+kseniaguzeeva@users.noreply.github.com> --- config/core/cloudbeaver.conf | 1 - .../BaseServerConfigurationController.java | 45 +++++----- .../server/BaseServletPlatform.java | 84 +++++++++++++++++++ .../model/config/CBServerConfig.java | 11 +-- .../io/cloudbeaver/server/CBApplication.java | 17 ++-- .../CBServerConfigurationController.java | 11 ++- .../cloudbeaver/server/BaseWebPlatform.java | 58 +------------ .../workspace/conf/cloudbeaver.conf | 1 - server/test/pom.xml | 3 + 9 files changed, 128 insertions(+), 103 deletions(-) create mode 100644 server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/server/BaseServletPlatform.java diff --git a/config/core/cloudbeaver.conf b/config/core/cloudbeaver.conf index 09311d9f16..cc96045610 100644 --- a/config/core/cloudbeaver.conf +++ b/config/core/cloudbeaver.conf @@ -2,7 +2,6 @@ server: { serverPort: "${CLOUDBEAVER_WEB_SERVER_PORT:8978}", - workspaceLocation: "${CLOUDBEAVER_WORKSPACE_LOCATION:workspace}", contentRoot: "web", driversLocation: "drivers", diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java index f6b37cb3d6..dad363c899 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseServerConfigurationController.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2025 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. @@ -19,10 +19,10 @@ package io.cloudbeaver.model.app; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.DBException; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.registry.fs.FileSystemProviderRegistry; -import org.jkiss.utils.IOUtils; +import org.jkiss.utils.CommonUtils; import java.net.URI; import java.nio.file.FileSystem; @@ -38,12 +38,13 @@ public abstract class BaseServerConfigurationController extends URL wsLocationURL = new URL( "file", //$NON-NLS-1$ null, - getServerConfiguration().getWorkspaceLocation()); + getWorkspaceDirectory().toAbsolutePath().toString()); instanceLoc.set(wsLocationURL, true); } } catch (Exception e) { - log.error("Error setting workspace location to " + getServerConfiguration().getWorkspaceLocation(), e); + log.error("Error setting workspace location to " + getWorkspaceDirectory().toAbsolutePath(), e); return; } @@ -440,13 +440,16 @@ public abstract class CBApplication extends @NotNull public Path getDataDirectory(boolean create) { - File dataDir = new File(getServerConfiguration().getWorkspaceLocation(), CBConstants.RUNTIME_DATA_DIR_NAME); - if (create && !dataDir.exists()) { - if (!dataDir.mkdirs()) { - log.error("Can't create data directory '" + dataDir.getAbsolutePath() + "'"); + Path dataDir = getWorkspaceDirectory().resolve(CBConstants.RUNTIME_DATA_DIR_NAME); + if (create && !Files.exists(dataDir)) { + try { + Files.createDirectories(dataDir); + } catch (IOException e) { + log.error("Can't create data directory '" + dataDir.toAbsolutePath() + "'"); + } } - return dataDir.toPath(); + return dataDir; } private void initializeSecurityController() throws DBException { diff --git a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java index 025ae6cb61..f94592e933 100644 --- a/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java +++ b/server/bundles/io.cloudbeaver.server.ce/src/io/cloudbeaver/server/CBServerConfigurationController.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2025 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. @@ -91,8 +91,6 @@ public abstract class CBServerConfigurationController loadConfiguration(configPath); } - initWorkspacePath(); - // Try to load configuration from runtime app config file Path runtimeConfigPath = getRuntimeAppConfigPath(); if (Files.exists(runtimeConfigPath)) { @@ -106,10 +104,11 @@ public abstract class CBServerConfigurationController validateFinalServerConfiguration(); } - @NotNull + @Nullable @Override - protected String getWorkspaceLocation() { - return getServerConfiguration().getWorkspaceLocation(); + public String getWorkspaceLocationFromEnv() { + String envValue = System.getenv("CLOUDBEAVER_WORKSPACE_LOCATION"); + return CommonUtils.nullIfEmpty(envValue); } public void loadConfiguration(Path configPath) throws DBException { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java index 803cf4a0ed..c05786881c 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/BaseWebPlatform.java @@ -16,38 +16,24 @@ */ package io.cloudbeaver.server; -import io.cloudbeaver.DBWConstants; import io.cloudbeaver.server.websockets.WebSocketPingPongJob; import org.eclipse.core.runtime.Plugin; import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBConstants; import org.jkiss.dbeaver.model.app.DBACertificateStorage; import org.jkiss.dbeaver.model.app.DBPWorkspace; import org.jkiss.dbeaver.model.impl.app.DefaultCertificateStorage; import org.jkiss.dbeaver.model.qm.QMRegistry; import org.jkiss.dbeaver.model.qm.QMUtils; -import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.registry.BasePlatformImpl; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; import org.jkiss.dbeaver.runtime.SecurityProviderUtils; import org.jkiss.dbeaver.runtime.qm.QMLogFileWriter; import org.jkiss.dbeaver.runtime.qm.QMRegistryImpl; -import org.jkiss.dbeaver.utils.ContentUtils; -import org.jkiss.utils.CommonUtils; -import org.jkiss.utils.StandardConstants; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public abstract class BaseWebPlatform extends BasePlatformImpl { - private static final Log log = Log.getLog(BaseWebPlatform.class); - public static final String BASE_TEMP_DIR = "dbeaver"; +public abstract class BaseWebPlatform extends BaseServletPlatform { public static final String TEMP_FILE_FOLDER = "temp-sql-upload-files"; public static final String TEMP_FILE_IMPORT_FOLDER = "temp-import-files"; - private Path tempFolder; private QMRegistryImpl queryManager; private QMLogFileWriter qmLogWriter; @@ -96,39 +82,6 @@ public abstract class BaseWebPlatform extends BasePlatformImpl { return workspace; } - @NotNull - public Path getTempFolder(@NotNull DBRProgressMonitor monitor, @NotNull String name) { - - if (tempFolder == null) { - synchronized (this) { - if (tempFolder == null) { - initTempFolder(monitor); - } - } - } - Path folder = tempFolder.resolve(name); - if (!Files.exists(folder)) { - try { - Files.createDirectories(folder); - } catch (IOException e) { - log.error("Error creating temp folder '" + folder.toAbsolutePath() + "'", e); - } - } - return folder; - } - - private void initTempFolder(@NotNull DBRProgressMonitor monitor) { - // Make temp folder - monitor.subTask("Create temp folder"); - String sysTempFolder = System.getProperty(StandardConstants.ENV_TMP_DIR); - if (CommonUtils.isNotEmpty(sysTempFolder)) { - tempFolder = Path.of(sysTempFolder).resolve(BASE_TEMP_DIR).resolve(DBWConstants.WORK_DATA_FOLDER_NAME); - } else { - //we do not use workspace because it can be in external file system - tempFolder = getApplication().getHomeDirectory().resolve(DBWConstants.WORK_DATA_FOLDER_NAME); - } - } - @NotNull public abstract WebApplication getApplication(); @@ -149,15 +102,6 @@ public abstract class BaseWebPlatform extends BasePlatformImpl { //queryManager = null; } DataSourceProviderRegistry.dispose(); - - // Remove temp folder - if (tempFolder != null) { - - if (!ContentUtils.deleteFileRecursive(tempFolder.toFile())) { - log.warn("Can't delete temp folder '" + tempFolder.toAbsolutePath() + "'"); - } - tempFolder = null; - } } @NotNull diff --git a/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf b/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf index 4511bd491c..6d2cf2a19c 100644 --- a/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf +++ b/server/test/io.cloudbeaver.test.platform/workspace/conf/cloudbeaver.conf @@ -3,7 +3,6 @@ serverPort: "${CLOUDBEAVER_TEST_PORT:18978}", serverName: "${CLOUDBEAVER_SERVER_NAME:CloudBeaver CE Test Server}", - workspaceLocation: "${CLOUDBEAVER_WORKSPACE_LOCATION:workspace}", contentRoot: "workspace/web", driversLocation: "../../../deploy/", diff --git a/server/test/pom.xml b/server/test/pom.xml index 884729c4c0..26b4da16e8 100644 --- a/server/test/pom.xml +++ b/server/test/pom.xml @@ -60,6 +60,9 @@ default io.cloudbeaver.test.platform.CEServerTestSuite -web-config workspace/conf/cloudbeaver.conf + + target/workspace + -Dlogback.configurationFile=workspace/conf/logback.xml ${debugArgs}