From e321522b3f5344f3c9ee50d401b7eec014eecfb0 Mon Sep 17 00:00:00 2001 From: yagudin10 Date: Wed, 3 Aug 2022 11:54:12 +0300 Subject: [PATCH] CB-2372 fix connection folders --- .../model/WebConnectionFolderInfo.java | 6 ++-- .../utils/WebConnectionFolderUtils.java | 2 +- .../src/io/cloudbeaver/WebServiceUtils.java | 4 +-- .../service/core/DBWServiceCore.java | 24 +++++++++----- .../service/core/impl/WebServiceCore.java | 10 +++--- .../navigator/impl/WebServiceNavigator.java | 31 +++++++++---------- 6 files changed, 41 insertions(+), 36 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionFolderInfo.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionFolderInfo.java index b30eca4e46..3a5a0d0fef 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionFolderInfo.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/WebConnectionFolderInfo.java @@ -21,14 +21,14 @@ import org.jkiss.dbeaver.model.DBPDataSourceFolder; import org.jkiss.dbeaver.model.meta.Property; public class WebConnectionFolderInfo { - private String projectId; + private final String projectId; private final WebSession session; private final DBPDataSourceFolder dataSourceFolder; - public WebConnectionFolderInfo(WebSession session, DBPDataSourceFolder dataSourceFolder, String projectId) { + public WebConnectionFolderInfo(WebSession session, DBPDataSourceFolder dataSourceFolder) { this.session = session; this.dataSourceFolder = dataSourceFolder; - this.projectId = projectId; + this.projectId = dataSourceFolder.getDataSourceRegistry().getProject().getId(); } public WebSession getSession() { diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebConnectionFolderUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebConnectionFolderUtils.java index e2d6aa5b0d..c95ebd05d3 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebConnectionFolderUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebConnectionFolderUtils.java @@ -33,7 +33,7 @@ public class WebConnectionFolderUtils { folder = session.getProjectById(projectId).getDataSourceRegistry().getFolder(folderPath); } if (folder != null) { - return new WebConnectionFolderInfo(session, folder, session.getProjectById(projectId).getId()); + return new WebConnectionFolderInfo(session, folder); } else { throw new DBWebException("Folder '" + folderPath + "' not found"); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java index d65e082e6c..13b9cafbf5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java @@ -326,8 +326,8 @@ public class WebServiceUtils extends WebCommonUtils { return folder; } - public static void updateConfigAndRefreshDatabases(WebSession session) { - DBNProject projectNode = session.getNavigatorModel().getRoot().getProjectNode(session.getSingletonProject()); + public static void updateConfigAndRefreshDatabases(WebSession session, String projectId) { + DBNProject projectNode = session.getNavigatorModel().getRoot().getProjectNode(session.getProjectById(projectId)); DBNModel.updateConfigAndRefreshDatabases(projectNode.getDatabases()); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java index fd8276ada3..99bbb2eb79 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/DBWServiceCore.java @@ -162,18 +162,26 @@ public interface DBWServiceCore extends DBWService { /////////////////////////////////////////// // Folders - @WebAction + @WebProjectAction(requireProjectPermissions = {RMConstants.PERMISSION_PROJECT_CONNECTIONS_EDIT}) WebConnectionFolderInfo createConnectionFolder( - @NotNull WebSession session, @Nullable String projectId, @Nullable String folderPath, @NotNull String newName - ) throws DBWebException; + @NotNull WebSession session, + @Nullable @WebObjectId String projectId, + @NotNull String parentNodePath, + @NotNull String newName) throws DBWebException; - @WebAction + @WebProjectAction(requireProjectPermissions = {RMConstants.PERMISSION_PROJECT_CONNECTIONS_EDIT}) WebConnectionFolderInfo renameConnectionFolder( - @NotNull WebSession session, @Nullable String projectId, @NotNull String folderPath, @NotNull String newName - ) throws DBWebException; + @NotNull WebSession session, + @Nullable @WebObjectId + String projectId, + @NotNull String folderPath, + @NotNull String newName) throws DBWebException; - @WebAction - boolean deleteConnectionFolder(@NotNull WebSession session, @Nullable String projectId, @NotNull String nodePath) throws DBWebException; + @WebProjectAction(requireProjectPermissions = {RMConstants.PERMISSION_PROJECT_CONNECTIONS_EDIT}) + boolean deleteConnectionFolder( + @NotNull WebSession session, + @Nullable @WebObjectId String projectId, + @NotNull String nodePath) throws DBWebException; /////////////////////////////////////////// // Navigator settings diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java index d8e31e25c6..8803cb98a2 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java @@ -162,7 +162,7 @@ public class WebServiceCore implements DBWServiceCore { return Collections.singletonList(folderInfo); } return webSession.getProjectById(projectId).getDataSourceRegistry().getAllFolders().stream() - .map(f -> new WebConnectionFolderInfo(webSession, f, projectId)).collect(Collectors.toList()); + .map(f -> new WebConnectionFolderInfo(webSession, f)).collect(Collectors.toList()); } @Override @@ -630,8 +630,8 @@ public class WebServiceCore implements DBWServiceCore { } DBPDataSourceRegistry sessionRegistry = session.getProjectById(projectId).getDataSourceRegistry(); DBPDataSourceFolder newFolder = WebServiceUtils.createFolder(parentNode, folderName, sessionRegistry); - WebConnectionFolderInfo folderInfo = new WebConnectionFolderInfo(session, newFolder, sessionRegistry.getProject().getId()); - WebServiceUtils.updateConfigAndRefreshDatabases(session); + WebConnectionFolderInfo folderInfo = new WebConnectionFolderInfo(session, newFolder); + WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); return folderInfo; } catch (DBException e) { @@ -649,7 +649,7 @@ public class WebServiceCore implements DBWServiceCore { WebConnectionFolderUtils.validateConnectionFolder(newName); WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, projectId, folderPath); folderInfo.getDataSourceFolder().setName(newName); - WebServiceUtils.updateConfigAndRefreshDatabases(session); + WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); return folderInfo; } @@ -666,7 +666,7 @@ public class WebServiceCore implements DBWServiceCore { session.addInfoMessage("Delete folder"); DBPDataSourceRegistry sessionRegistry = session.getProjectById(projectId).getDataSourceRegistry(); sessionRegistry.removeFolder(folderInfo.getDataSourceFolder(), false); - WebServiceUtils.updateConfigAndRefreshDatabases(session); + WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); } catch (DBException e) { throw new DBWebException(e.getMessage(), e); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index 650819ebdb..7015e3e6f2 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -375,8 +375,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { ) throws DBWebException { try { DBRProgressMonitor monitor = session.getProgressMonitor(); - DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); - Set tempFolders = ((DataSourceRegistry) sessionRegistry).getTemporaryFolders(); + String projectId = null; boolean containsFolderNodes = false; Map nodes = new LinkedHashMap<>(); for (String path : nodePaths) { @@ -394,10 +393,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { nodes.put(node, objectDeleter); } else if (node instanceof DBNLocalFolder) { containsFolderNodes = true; - DBPDataSourceFolder folder = ((DBNLocalFolder) node).getFolder(); - if (tempFolders.contains(folder)) { - throw new DBWebException("Delete shared connection folder from navigator tree is not supported"); - } + projectId = node.getOwnerProject().getId(); nodes.put(node, null); } else if (node instanceof DBNResourceManagerResource) { nodes.put(node, null); @@ -408,23 +404,24 @@ public class WebServiceNavigator implements DBWServiceNavigator { Map options = new LinkedHashMap<>(); for (Map.Entry ne : nodes.entrySet()) { - if (ne.getKey() instanceof DBNDatabaseNode) { - DBSObject object = ((DBNDatabaseNode) ne.getKey()).getObject(); + DBNNode node = ne.getKey(); + if (node instanceof DBNDatabaseNode) { + DBSObject object = ((DBNDatabaseNode) node).getObject(); DBCExecutionContext executionContext = getCommandExecutionContext(object); DBECommandContext commandContext = new WebCommandContext(executionContext, false); ne.getValue().deleteObject(commandContext, object, options); commandContext.saveChanges(session.getProgressMonitor(), options); - } else if (ne.getKey() instanceof DBNLocalFolder) { - sessionRegistry.removeFolder(((DBNLocalFolder) ne.getKey()).getFolder(), false); - } else if (ne.getKey() instanceof DBNResourceManagerResource) { - DBNResourceManagerResource rmResource = ((DBNResourceManagerResource) ne.getKey()); - String projectId = rmResource.getResourceProject().getId(); + } else if (node instanceof DBNLocalFolder) { + node.getOwnerProject().getDataSourceRegistry().removeFolder(((DBNLocalFolder) node).getFolder(), false); + } else if (node instanceof DBNResourceManagerResource) { + DBNResourceManagerResource rmResource = ((DBNResourceManagerResource) node); + String resourceProjectId = rmResource.getResourceProject().getId(); String resourcePath = rmResource.getResourceFolder(); - session.getRmController().deleteResource(projectId, resourcePath, true); + session.getRmController().deleteResource(resourceProjectId, resourcePath, true); } } if (containsFolderNodes) { - WebServiceUtils.updateConfigAndRefreshDatabases(session); + WebServiceUtils.updateConfigAndRefreshDatabases(session, projectId); } return nodes.size(); @@ -450,7 +447,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { } if (node instanceof DBNDataSource) { DBPDataSourceFolder folder; - if (folderNode instanceof DBNRoot) { + if (folderNode instanceof DBNRoot || folderNode instanceof DBNProject) { folder = null; } else if (folderNode instanceof DBNLocalFolder) { folder = ((DBNLocalFolder) folderNode).getFolder(); @@ -458,7 +455,7 @@ public class WebServiceNavigator implements DBWServiceNavigator { throw new DBWebException("Navigator node '" + folderNodePath + "' is not a folder node"); } ((DBNDataSource) node).moveToFolder(folderNode.getOwnerProject(), folder); - session.getSingletonProject().getDataSourceRegistry().updateDataSource( + node.getOwnerProject().getDataSourceRegistry().updateDataSource( ((DBNDataSource) node).getDataSourceContainer()); } else if (node instanceof DBNResourceManagerResource) { boolean rmNewNode = folderNode instanceof DBNAbstractResourceManagerNode;