CB-2372 fix connection folders

This commit is contained in:
yagudin10
2022-08-03 11:54:12 +03:00
parent 6ed67919b6
commit e321522b3f
6 changed files with 41 additions and 36 deletions
@@ -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() {
@@ -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");
}
@@ -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());
}
@@ -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
@@ -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);
}
@@ -375,8 +375,7 @@ public class WebServiceNavigator implements DBWServiceNavigator {
) throws DBWebException {
try {
DBRProgressMonitor monitor = session.getProgressMonitor();
DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry();
Set<DBPDataSourceFolder> tempFolders = ((DataSourceRegistry) sessionRegistry).getTemporaryFolders();
String projectId = null;
boolean containsFolderNodes = false;
Map<DBNNode, DBEObjectMaker> 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<String, Object> options = new LinkedHashMap<>();
for (Map.Entry<DBNNode, DBEObjectMaker> 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;