diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java index 8bebdab49310..2730fbb494da 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseNode.java @@ -833,7 +833,7 @@ public String getNodeItemPath() { if (pathName.length() > 0) { pathName.insert(0, '/'); } - pathName.insert(0, node.getNodeDisplayName().replace("/", DBNModel.SLASH_ESCAPE_TOKEN)); + pathName.insert(0, DBNUtils.encodeNodePath(node.getNodeDisplayName())); } return pathName.toString(); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLegacyUtils.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLegacyUtils.java index 37ed8b36d534..6e1b8db0d309 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLegacyUtils.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNLegacyUtils.java @@ -139,7 +139,7 @@ private static DBNNode legacyFindNodeByPath( final List pathItems = nodePath.pathItems; for (int i = firstItem, itemsSize = pathItems.size(); i < itemsSize; i++) { - String item = pathItems.get(i).replace(DBNModel.SLASH_ESCAPE_TOKEN, "/"); + String item = pathItems.get(i); if (nodePath.type == DBNNode.NodePathType.ext && curNode instanceof DBNProject pn) { // Trigger project to load extra nodes pn.getExtraNode(DBNFileSystems.class); @@ -173,7 +173,7 @@ private static DBNNode legacyFindNodeByPath( } if (!pathItems.isEmpty()) { - String lastItemName = pathItems.get(pathItems.size() - 1).replace(DBNModel.SLASH_ESCAPE_TOKEN, "/"); + String lastItemName = pathItems.get(pathItems.size() - 1); if (!nodeMatchesPath(nodePath, curNode, lastItemName)) { // Tail node doesn't match tail node from the desired path return null; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java index 6205d90d56a8..26abec94d573 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNModel.java @@ -57,7 +57,6 @@ * (e.g. TreeViewer sometimes update only first TreeItem corresponding to model certain model object). */ public class DBNModel implements IResourceChangeListener { - public static final String SLASH_ESCAPE_TOKEN = "%2F"; private static final Log log = Log.getLog(DBNModel.class); @@ -271,7 +270,9 @@ private static NodePath getNodePath(@NotNull String path) { break; } } - return new NodePath(nodeType, CommonUtils.splitString(path, '/')); + final List items = CommonUtils.splitString(path, '/'); + items.replaceAll(DBNUtils::decodeNodePath); + return new NodePath(nodeType, items); } @Nullable @@ -327,7 +328,8 @@ public DBNNode getNodeByPath( log.debug("Project node not found"); return null; } - final NodePath nodePath = getNodePath(path); + NodePath nodePath = getNodePath(path); + if (nodePath.legacyFormat) { return DBNLegacyUtils.legacyGetNodeByPath(monitor, projectNode, nodePath); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNNode.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNNode.java index e0be00b941e9..1642c7177519 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNNode.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNNode.java @@ -283,7 +283,7 @@ public final String getNodeUri() { if (!pathBuilder.isEmpty()) { pathBuilder.insert(0, '/'); } - String nodeId = currentNode.getNodeId().replace("/", DBNModel.SLASH_ESCAPE_TOKEN); + String nodeId = DBNUtils.encodeNodePath(currentNode.getNodeId()); if (currentNode instanceof DBNResource && currentNode.getParentNode() instanceof DBNProject) { //FIXME: remove after migration to the real resource root node nodeId = DBNResource.FAKE_RESOURCE_ROOT_NODE + "/" + nodeId; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNUtils.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNUtils.java index 5c3f9204337f..351fb4d1a014 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNUtils.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/navigator/DBNUtils.java @@ -269,4 +269,24 @@ public boolean has(String name) { }; } + /** + * The method decode symbols('%2F','%25') + * + * @param nodePath - path + * @return - node path object + */ + public static String decodeNodePath(@NotNull String nodePath) { + return nodePath.replace("%2F", "/").replace("%25", "%"); + } + + /** + * The method encode symbols('/','%') + * + * @param path - path + * @return - string path segment + */ + public static String encodeNodePath(@NotNull String path) { + return path.replace("%", "%25").replace("/", "%2F"); + } + }