From 4645a8e3d1dbf7e1d4a19c9d08bc667ad771aee5 Mon Sep 17 00:00:00 2001 From: Alexander Skoblikov Date: Fri, 20 Oct 2023 18:14:24 +0200 Subject: [PATCH] Cb 3959 UI file system navigator view (#2069) * CB-4061 file systems feature * CB-4061 return rm fs navigator nodes * CB-3959 fix tests * CB-3959 encode spaces in rm uri --- .../io.cloudbeaver.service.fs/plugin.xml | 4 ++- .../rm/nio/RMNIOFileSystemProvider.java | 3 ++ .../io/cloudbeaver/service/rm/nio/RMPath.java | 36 +++++++++++++------ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/server/bundles/io.cloudbeaver.service.fs/plugin.xml b/server/bundles/io.cloudbeaver.service.fs/plugin.xml index 45540f23a6..09ad0fdeca 100644 --- a/server/bundles/io.cloudbeaver.service.fs/plugin.xml +++ b/server/bundles/io.cloudbeaver.service.fs/plugin.xml @@ -8,5 +8,7 @@ class="io.cloudbeaver.service.fs.WebServiceBindingFS"> - + + + diff --git a/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMNIOFileSystemProvider.java b/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMNIOFileSystemProvider.java index 676b28dddc..d1c367a781 100644 --- a/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMNIOFileSystemProvider.java +++ b/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMNIOFileSystemProvider.java @@ -29,6 +29,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.FileAttribute; @@ -80,6 +82,7 @@ public class RMNIOFileSystemProvider extends NIOFileSystemProvider { } RMNIOFileSystem rmNioFileSystem = new RMNIOFileSystem(projectId, this); String resourcePath = uri.getPath(); + resourcePath = URLDecoder.decode(resourcePath, StandardCharsets.UTF_8); if (CommonUtils.isNotEmpty(resourcePath) && projectId == null) { throw new IllegalArgumentException("Project is not specified in URI"); } diff --git a/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMPath.java b/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMPath.java index c38642269e..8b5d0eb37d 100644 --- a/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMPath.java +++ b/server/bundles/io.cloudbeaver.service.rm.nio/src/io/cloudbeaver/service/rm/nio/RMPath.java @@ -25,9 +25,14 @@ import org.jkiss.utils.CommonUtils; import java.io.IOException; import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.nio.file.LinkOption; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; public class RMPath extends NIOPath { @NotNull @@ -71,7 +76,7 @@ public class RMPath extends NIOPath { if (ArrayUtils.isEmpty(parts)) { return this; } - return new RMPath(rmNioFileSystem, parts[parts.length - 1]); + return new RMPath(new RMNIOFileSystem(null, getFileSystem().rmProvider()), parts[parts.length - 1]); } @Override @@ -122,22 +127,31 @@ public class RMPath extends NIOPath { @Override public URI toUri() { var fileSystem = getFileSystem(); - var uriBuilder = new StringBuilder(fileSystem.provider().getScheme()) - .append("://"); - - if (rmProjectId != null) { - uriBuilder.append(rmProjectId); + var uriBuilder = new StringBuilder(); + if (isAbsolute()) { + uriBuilder.append(fileSystem.provider().getScheme()) + .append("://"); } - String rmResourcePath = getResourcePath(); - if (rmResourcePath != null) { - uriBuilder.append(fileSystem.getSeparator()) - .append(rmResourcePath); - } + var paths = new ArrayList(); + paths.add(rmProjectId); + paths.add(getResourcePath()); + + uriBuilder.append( + paths.stream() + .filter(Objects::nonNull) + .map(s -> URLEncoder.encode(s, StandardCharsets.UTF_8)) + .collect(Collectors.joining(fileSystem.getSeparator())) + ); return URI.create(uriBuilder.toString()); } + @Override + public boolean isAbsolute() { + return rmNioFileSystem.getRmProjectId() != null; + } + @Override public Path toAbsolutePath() { if (isAbsolute()) {