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 14ff58a1dbf..e2d263da40b 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 @@ -20,13 +20,11 @@ import com.google.gson.GsonBuilder; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.registry.fs.FileSystemProviderRegistry; +import org.jkiss.dbeaver.registry.fs.FSUtils; import org.jkiss.utils.CommonUtils; -import java.net.URI; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; import java.nio.file.Path; /** @@ -65,30 +63,20 @@ protected synchronized Path initWorkspacePath() { if (CommonUtils.isEmpty(workspaceLocation)) { return defaultWorkspaceLocation; } - URI workspaceUri = URI.create(workspaceLocation); - if (workspaceUri.getScheme() == null) { - // default filesystem - return getHomeDirectory().resolve(workspaceLocation); - } else { - var externalFsProvider = - FileSystemProviderRegistry.getInstance().getFileSystemProviderBySchema(workspaceUri.getScheme()); - if (externalFsProvider == null) { - log.error("File system not found for scheme: " + workspaceUri.getScheme() + " default workspace " + - "location will be used"); + try { + Path externalFsPath = FSUtils.getPathFromURI(workspaceLocation); + if (externalFsPath == null) { + log.warn("Failed to detect workspace path from URI: " + workspaceLocation + + " default workspace location will be used"); return defaultWorkspaceLocation; } - ClassLoader fsClassloader = externalFsProvider.getInstance().getClass().getClassLoader(); - try (FileSystem externalFileSystem = FileSystems.newFileSystem(workspaceUri, - System.getenv(), - fsClassloader)) { - log.info("Path from external filesystem used for workspace: " + workspaceUri); - return externalFileSystem.provider().getPath(workspaceUri); - } catch (Exception e) { - log.error("Failed to initialize workspace path: " + workspaceUri + " default workspace " + - "location will be used", e); - } + log.info("Path from external filesystem used for workspace: " + externalFsPath); + return externalFsPath; + } catch (DBException e) { + log.error("Failed to detect workspace path from URI: " + workspaceLocation + + " default workspace location will be used", e); + return defaultWorkspaceLocation; } - return defaultWorkspaceLocation; } @Nullable diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/FSUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/WebFSUtils.java similarity index 96% rename from server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/FSUtils.java rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/WebFSUtils.java index ca64c38f36f..9224efbcf9f 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/FSUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/fs/WebFSUtils.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. @@ -28,7 +28,7 @@ import java.nio.file.Path; -public class FSUtils { +public class WebFSUtils { @NotNull public static String makeUniqueFsId(@NotNull DBFVirtualFileSystem fileSystem) { return fileSystem.getType() + "://" + fileSystem.getId(); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java index a641fd98669..268d946d05f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.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,7 +19,7 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.model.WebPropertyInfo; -import io.cloudbeaver.model.fs.FSUtils; +import io.cloudbeaver.model.fs.WebFSUtils; import io.cloudbeaver.model.rm.DBNResourceManagerResource; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebObjectFeatureProviderDescriptor; @@ -208,7 +208,7 @@ public String getObjectId() { if (node instanceof DBNPathBase dbnPath) { return DBFUtils.getUriFromPath(dbnPath.getPath()).toString(); } else if (node instanceof DBNFileSystem dbnFs) { - return FSUtils.makeUniqueFsId(dbnFs.getFileSystem()); + return WebFSUtils.makeUniqueFsId(dbnFs.getFileSystem()); } return null; } diff --git a/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/impl/WebServiceFS.java b/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/impl/WebServiceFS.java index 07b42f862b3..5b3273446ff 100644 --- a/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/impl/WebServiceFS.java +++ b/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/impl/WebServiceFS.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. @@ -18,7 +18,7 @@ import io.cloudbeaver.DBWConstants; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.model.fs.FSUtils; +import io.cloudbeaver.model.fs.WebFSUtils; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.fs.DBWServiceFS; import io.cloudbeaver.service.fs.model.FSFile; @@ -69,7 +69,7 @@ public FSFileSystem[] getAvailableFileSystems(@NotNull WebSession webSession, @N } return Arrays.stream(children) .map(fs -> new FSFileSystem( - FSUtils.makeUniqueFsId(fs.getFileSystem()), + WebFSUtils.makeUniqueFsId(fs.getFileSystem()), fs.getNodeUri(), fsRegistry.getProvider(fs.getFileSystem().getProviderId()).getRequiredAuth() ) @@ -94,7 +94,7 @@ public FSFileSystem getFileSystem( } var fsRegistry = FileSystemProviderRegistry.getInstance(); return new FSFileSystem( - FSUtils.makeUniqueFsId(fs.getFileSystem()), + WebFSUtils.makeUniqueFsId(fs.getFileSystem()), fs.getNodeUri(), fsRegistry.getProvider(fs.getFileSystem().getProviderId()).getRequiredAuth() ); @@ -108,7 +108,7 @@ public FSFileSystem getFileSystem( public FSFile getFile(@NotNull WebSession webSession, @NotNull String nodePath) throws DBWebException { try { - DBNPathBase node = FSUtils.getNodeByPath(webSession, nodePath); + DBNPathBase node = WebFSUtils.getNodeByPath(webSession, nodePath); return new FSFile(node); } catch (Exception e) { throw new DBWebException("Failed to found file: " + e.getMessage(), e); @@ -120,7 +120,7 @@ public FSFile getFile(@NotNull WebSession webSession, @NotNull String nodePath) public FSFile[] getFiles(@NotNull WebSession webSession, @NotNull String parentPath) throws DBWebException { try { - DBNPathBase folderPath = FSUtils.getNodeByPath(webSession, parentPath); + DBNPathBase folderPath = WebFSUtils.getNodeByPath(webSession, parentPath); var children = folderPath.getChildren(webSession.getProgressMonitor()); if (children == null) { return new FSFile[0]; @@ -140,7 +140,7 @@ public FSFile[] getFiles(@NotNull WebSession webSession, @NotNull String parentP public String readFileContent(@NotNull WebSession webSession, @NotNull String nodePath) throws DBWebException { try { - Path filePath = FSUtils.getPathFromNode(webSession, nodePath); + Path filePath = WebFSUtils.getPathFromNode(webSession, nodePath); var data = Files.readAllBytes(filePath); return new String(data, StandardCharsets.UTF_8); } catch (Exception e) { @@ -158,7 +158,7 @@ public FSFile writeFileContent( throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase node = FSUtils.getNodeByPath(webSession, nodePath); + DBNPathBase node = WebFSUtils.getNodeByPath(webSession, nodePath); Path filePath = node.getPath(); if (!forceOverwrite) { throw new DBException("Cannot overwrite exist file"); @@ -179,7 +179,7 @@ public FSFile createFile( ) throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase parentNode = FSUtils.getNodeByPath(webSession, parentPath); + DBNPathBase parentNode = WebFSUtils.getNodeByPath(webSession, parentPath); if (!Files.isDirectory(parentNode.getPath())) { throw new DBException(MessageFormat.format("Node ''{0}'' is not a directory", parentPath)); } @@ -200,10 +200,10 @@ public FSFile moveFile( ) throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase oldNode = FSUtils.getNodeByPath(webSession, oldNodePath); + DBNPathBase oldNode = WebFSUtils.getNodeByPath(webSession, oldNodePath); DBNPathBase oldParentNode = (DBNPathBase) oldNode.getParentNode(); String fileName = oldNode.getName(); - DBNPathBase parentNode = FSUtils.getNodeByPath(webSession, parentNodePath); + DBNPathBase parentNode = WebFSUtils.getNodeByPath(webSession, parentNodePath); Path parentPath = parentNode.getPath(); if (!Files.isDirectory(parentPath)) { throw new DBException(MessageFormat.format("Node ''{0}'' is not a directory", parentPath)); @@ -227,7 +227,7 @@ public FSFile renameFile( validateEditPermissions(webSession); validateFilename(newName); try { - DBNPathBase node = FSUtils.getNodeByPath(webSession, nodePath); + DBNPathBase node = WebFSUtils.getNodeByPath(webSession, nodePath); node.rename(webSession.getProgressMonitor(), newName); return new FSFile(node); } catch (Exception e) { @@ -243,9 +243,9 @@ public FSFile copyFile( ) throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase oldNode = FSUtils.getNodeByPath(webSession, oldNodePath); + DBNPathBase oldNode = WebFSUtils.getNodeByPath(webSession, oldNodePath); String fileName = oldNode.getName(); - DBNPathBase parentNode = FSUtils.getNodeByPath(webSession, parentNodePath); + DBNPathBase parentNode = WebFSUtils.getNodeByPath(webSession, parentNodePath); Path parentPath = parentNode.getPath(); if (!Files.isDirectory(parentPath)) { throw new DBException(MessageFormat.format("Node ''{0}'' is not a directory", parentPath)); @@ -267,7 +267,7 @@ public FSFile createFolder( ) throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase parentNode = FSUtils.getNodeByPath(webSession, parentPath); + DBNPathBase parentNode = WebFSUtils.getNodeByPath(webSession, parentPath); if (!Files.isDirectory(parentNode.getPath())) { throw new DBException(MessageFormat.format("Node ''{0}'' is not a directory", parentPath)); } @@ -287,7 +287,7 @@ public boolean deleteFile( ) throws DBWebException { validateEditPermissions(webSession); try { - DBNPathBase node = FSUtils.getNodeByPath(webSession, nodePath); + DBNPathBase node = WebFSUtils.getNodeByPath(webSession, nodePath); Path path = node.getPath(); Files.delete(path); DBNPathBase parentNode = (DBNPathBase) node.getParentNode(); diff --git a/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/model/WebFSServlet.java b/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/model/WebFSServlet.java index f929443e7be..f5abf12e2de 100644 --- a/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/model/WebFSServlet.java +++ b/server/bundles/io.cloudbeaver.service.fs/src/io/cloudbeaver/service/fs/model/WebFSServlet.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. @@ -18,7 +18,7 @@ import io.cloudbeaver.DBWConstants; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.model.fs.FSUtils; +import io.cloudbeaver.model.fs.WebFSUtils; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.server.CBApplication; import io.cloudbeaver.service.WebServiceServletBase; @@ -74,7 +74,7 @@ protected void processServiceRequest(WebSession session, HttpServletRequest requ } private void doGet(WebSession session, HttpServletRequest request, HttpServletResponse response) throws DBException, IOException { - Path path = FSUtils.getPathFromNode(session, request.getParameter("nodePath")); + Path path = WebFSUtils.getPathFromNode(session, request.getParameter("nodePath")); session.addInfoMessage("Download data ..."); response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + path.getFileName() + "\""); @@ -93,7 +93,7 @@ private void doPost(WebSession session, HttpServletRequest request, HttpServletR if (CommonUtils.isEmpty(parentNodePath)) { throw new DBException("Parent node path parameter is not found"); } - DBNPathBase node = FSUtils.getNodeByPath(session, parentNodePath); + DBNPathBase node = WebFSUtils.getNodeByPath(session, parentNodePath); Path path = node.getPath(); try { for (Part part : request.getParts()) {