From 7d82b85013741a03e87f21aaa94333ebd2086467 Mon Sep 17 00:00:00 2001 From: Ainur <59531286+yagudin10@users.noreply.github.com> Date: Thu, 7 Jul 2022 16:33:11 +0300 Subject: [PATCH] CB-1636 delete connection folders through navigator tree (#956) * CB-1636 delete connection folders through navigator tree * CB-1636 fix exception for shared connection folders * CB-1636 global folders update fix --- .../src/io/cloudbeaver/WebServiceUtils.java | 3 ++ .../navigator/WebNavigatorNodeInfo.java | 11 ++++-- .../navigator/impl/WebServiceNavigator.java | 38 ++++++++++++++----- 3 files changed, 39 insertions(+), 13 deletions(-) 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 04c37fa887..3ae2a4f3e5 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/WebServiceUtils.java @@ -285,7 +285,10 @@ public class WebServiceUtils extends WebCommonUtils { dataSource.setDescription(config.getDescription()); if (config.getFolder() != null) { dataSource.setFolder(dataSource.getRegistry().getFolder(config.getFolder())); + } else { + dataSource.setFolder(null); } + getGlobalDataSourceRegistry().getAllFolders().clear(); saveAuthProperties(dataSource, dataSource.getConnectionConfiguration(), config.getCredentials(), config.isSaveCredentials()); } 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 6da702a29d..2825a0173f 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 @@ -19,7 +19,6 @@ package io.cloudbeaver.service.navigator; import io.cloudbeaver.DBWebException; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.model.WebPropertyInfo; -import io.cloudbeaver.model.rm.DBNAbstractResourceManagerNode; import io.cloudbeaver.model.rm.DBNResourceManagerResource; import io.cloudbeaver.model.session.WebSession; import org.jkiss.dbeaver.DBException; @@ -175,8 +174,14 @@ public class WebNavigatorNodeInfo { } } } - } else if (node instanceof DBNLocalFolder || node instanceof DBNAbstractResourceManagerNode) { - if (!isShared) { + } else if (isShared) { + return features.toArray(new String[0]); + } else if (node instanceof DBNLocalFolder) { + features.add(NODE_FEATURE_CAN_RENAME); + features.add(NODE_FEATURE_CAN_DELETE); + } else if (node instanceof DBNResourceManagerResource) { + features.add(NODE_FEATURE_CAN_DELETE); + if (!isFolder()) { features.add(NODE_FEATURE_CAN_RENAME); } } 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 e3c795b6a7..9dbf155ace 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 @@ -18,10 +18,10 @@ package io.cloudbeaver.service.navigator.impl; import io.cloudbeaver.DBWebException; +import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.model.WebCommandContext; import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.rm.DBNAbstractResourceManagerNode; -import io.cloudbeaver.model.rm.DBNResourceManagerProject; import io.cloudbeaver.model.rm.DBNResourceManagerResource; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.navigator.DBWServiceNavigator; @@ -35,6 +35,7 @@ import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceFolder; import org.jkiss.dbeaver.model.DBPRefreshableObject; import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.edit.DBECommandContext; import org.jkiss.dbeaver.model.edit.DBEObjectMaker; import org.jkiss.dbeaver.model.edit.DBEObjectRenamer; @@ -46,6 +47,7 @@ import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectContainer; import org.jkiss.dbeaver.model.struct.rdb.DBSCatalog; import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; +import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; @@ -323,8 +325,10 @@ public class WebServiceNavigator implements DBWServiceNavigator { public int deleteNodes(@NotNull WebSession session, @NotNull List nodePaths) throws DBWebException { try { DBRProgressMonitor monitor = session.getProgressMonitor(); - - Map nodes = new LinkedHashMap<>(); + DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); + Set tempFolders = ((DataSourceRegistry) sessionRegistry).getTemporaryFolders(); + boolean containsFolderNodes = false; + Map nodes = new LinkedHashMap<>(); for (String path : nodePaths) { DBNNode node = session.getNavigatorModel().getNodeByPath(monitor, path); if (node == null) { @@ -337,19 +341,33 @@ public class WebServiceNavigator implements DBWServiceNavigator { if (objectDeleter == null || !objectDeleter.canDeleteObject(object)) { throw new DBException("Object " + object + " delete is not supported"); } - nodes.put((DBNDatabaseNode) node, objectDeleter); + 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"); + } + nodes.put(node, null); } else { throw new DBWebException("Navigator node '" + path + "' is not a database node"); } } Map options = new LinkedHashMap<>(); - for (Map.Entry ne : nodes.entrySet()) { - DBSObject object = ne.getKey().getObject(); - DBCExecutionContext executionContext = getCommandExecutionContext(object); - DBECommandContext commandContext = new WebCommandContext(executionContext, false); - ne.getValue().deleteObject(commandContext, object, options); - commandContext.saveChanges(session.getProgressMonitor(), options); + for (Map.Entry ne : nodes.entrySet()) { + if (ne.getKey() instanceof DBNDatabaseNode) { + DBSObject object = ((DBNDatabaseNode) ne.getKey()).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); + } + } + if (containsFolderNodes) { + WebServiceUtils.updateConfigAndRefreshDatabases(session); } return nodes.size();