diff --git a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls index e9fdae4d9d..7ce82d2639 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls @@ -131,6 +131,6 @@ extend type Mutation { navDeleteNodes( nodePaths: [ID!]! ): Int # Moves nodes with specified IDs to the connection folder - navMoveNodesToFolder(nodePaths: [ID!]!, folderPath: String): Boolean + navMoveNodesToFolder(nodePaths: [ID!]!, folderPath: ID!): Boolean } \ No newline at end of file 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 2be8b04de7..8652863617 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 @@ -565,9 +565,7 @@ public class WebServiceCore implements DBWServiceCore { DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); DBPDataSourceFolder newFolder = WebServiceUtils.createFolder(parentNode, folderName, sessionRegistry); WebConnectionFolderInfo folderInfo = new WebConnectionFolderInfo(session, newFolder); - if (parentPath == null) { - WebServiceUtils.updateConfigAndRefreshDatabases(session); - } + WebServiceUtils.updateConfigAndRefreshDatabases(session); return folderInfo; } catch (DBException e) { @@ -583,6 +581,7 @@ public class WebServiceCore implements DBWServiceCore { ) throws DBWebException { WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, folderPath); folderInfo.getDataSourceFolder().setName(newName); + WebServiceUtils.updateConfigAndRefreshDatabases(session); return folderInfo; } @@ -591,16 +590,13 @@ public class WebServiceCore implements DBWServiceCore { try { WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, folderPath); DBPDataSourceFolder folder = folderInfo.getDataSourceFolder(); - boolean rootFolder = folder.getParent() != null; if (folder.getDataSourceRegistry().getProject() != session.getSingletonProject()) { throw new DBWebException("Global folder '" + folderInfo.getId() + "' cannot be deleted"); } session.addInfoMessage("Delete folder"); DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); sessionRegistry.removeFolder(folderInfo.getDataSourceFolder(), false); - if (rootFolder) { - WebServiceUtils.updateConfigAndRefreshDatabases(session); - } + WebServiceUtils.updateConfigAndRefreshDatabases(session); } catch (DBException e) { throw new DBWebException(e.getMessage(), e); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java index a49b0ec69a..bb97c99deb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java @@ -59,5 +59,5 @@ public interface DBWServiceNavigator extends DBWService { int deleteNodes(@NotNull WebSession session, @NotNull List nodePaths) throws DBWebException; @WebAction - boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, String folderPath) throws DBWebException; + boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, @NotNull String folderPath) throws DBWebException; } 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 3ad8be1f74..ee69da357e 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 @@ -139,7 +139,8 @@ public class WebNavigatorNodeInfo { if (node instanceof DBNDatabaseNode) { isShared = !((DBNDatabaseNode) node).getDataSourceContainer().isManageable(); } else if (node instanceof DBNLocalFolder) { - //isShared = ((DBNLocalFolder) node).getDataSourceRegistry().is + String projectName = ((DBNLocalFolder) node).getFolder().getDataSourceRegistry().getProject().getName(); + isShared = !projectName.equals(session.getUserId()); } if (isShared) { features.add("shared"); 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 178f270ef9..2525e2e040 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 @@ -20,17 +20,16 @@ package io.cloudbeaver.service.navigator.impl; import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.WebCommandContext; import io.cloudbeaver.model.WebConnectionInfo; -import io.cloudbeaver.model.WebConnectionFolderInfo; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.navigator.DBWServiceNavigator; import io.cloudbeaver.service.navigator.WebCatalog; import io.cloudbeaver.service.navigator.WebNavigatorNodeInfo; import io.cloudbeaver.service.navigator.WebStructContainers; -import io.cloudbeaver.utils.WebConnectionFolderUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; 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.edit.DBECommandContext; @@ -175,6 +174,9 @@ public class WebServiceNavigator implements DBWServiceNavigator { ((DBPRefreshableObject) dataSource).refreshObject(monitor); } ((DBNDataSource) node).cleanupNode(); + } else if (node instanceof DBNLocalFolder) { + // Refresh can't be applied to the local folder node + return true; } else { node.refreshNode(monitor, this); } @@ -354,17 +356,32 @@ public class WebServiceNavigator implements DBWServiceNavigator { } @Override - public boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, String folderNodePath) throws DBWebException { + public boolean moveNodesToFolder( + @NotNull WebSession session, + @NotNull List nodePaths, + @NotNull String folderNodePath + ) throws DBWebException { try { DBRProgressMonitor monitor = session.getProgressMonitor(); - WebConnectionFolderInfo folderPath = WebConnectionFolderUtils.getFolderInfo(session, folderNodePath); + DBNNode folderNode; + folderNode = session.getNavigatorModel().getNodeByPath(monitor, folderNodePath); for (String path : nodePaths) { DBNNode node = session.getNavigatorModel().getNodeByPath(monitor, path); if (node == null) { throw new DBWebException("Navigator node '" + path + "' not found"); } if (node instanceof DBNDataSource) { - ((DBNDataSource) node).moveToFolder(null, folderPath.getDataSourceFolder()); + DBPDataSourceFolder folder; + if (folderNode instanceof DBNRoot) { + folder = null; + } else if (folderNode instanceof DBNLocalFolder) { + folder = ((DBNLocalFolder) folderNode).getFolder(); + } else { + throw new DBWebException("Navigator node '" + folderNodePath + "' is not a folder node"); + } + ((DBNDataSource) node).moveToFolder(folderNode.getOwnerProject(), folder); + session.getSingletonProject().getDataSourceRegistry().updateDataSource( + ((DBNDataSource) node).getDataSourceContainer()); } else { throw new DBWebException("Navigator node '" + path + "' is not a data source node"); }