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
This commit is contained in:
Ainur
2022-07-07 16:33:11 +03:00
committed by GitHub
parent 141d8ec27a
commit 7d82b85013
3 changed files with 39 additions and 13 deletions
@@ -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());
}
@@ -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);
}
}
@@ -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<String> nodePaths) throws DBWebException {
try {
DBRProgressMonitor monitor = session.getProgressMonitor();
Map<DBNDatabaseNode, DBEObjectMaker> nodes = new LinkedHashMap<>();
DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry();
Set<DBPDataSourceFolder> tempFolders = ((DataSourceRegistry) sessionRegistry).getTemporaryFolders();
boolean containsFolderNodes = false;
Map<DBNNode, DBEObjectMaker> 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<String, Object> options = new LinkedHashMap<>();
for (Map.Entry<DBNDatabaseNode, DBEObjectMaker> 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<DBNNode, DBEObjectMaker> 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();