From f083a0aabf99821ae12fd1e0602da11e9fbd4fc5 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Fri, 12 Nov 2021 10:32:19 +0100
Subject: [PATCH] Modified getVosPath method to correctly parsing encoded chars
 (e.g. %20)

---
 .../it/inaf/oats/vospace/datamodel/NodeUtils.java  | 14 +++++++++++---
 .../inaf/oats/vospace/datamodel/NodeUtilsTest.java |  9 +++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java b/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
index 0bcf0f1..88deaa2 100644
--- a/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
+++ b/src/main/java/it/inaf/oats/vospace/datamodel/NodeUtils.java
@@ -5,6 +5,8 @@
  */
 package it.inaf.oats.vospace.datamodel;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import net.ivoa.xml.vospace.v2.Node;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
@@ -245,10 +247,16 @@ public class NodeUtils {
     }
 
     public static String getVosPath(Node myNode) {
+        return getVosPath(myNode.getUri());
+    }
 
-        String nodeUri = myNode.getUri();
-
-        return nodeUri.replaceAll("vos://[^/]+", "");
+    public static String getVosPath(String nodeUri) {
+        try {
+            URI uri = new URI(nodeUri);
+            return uri.getPath();
+        } catch (URISyntaxException ex) {
+            throw new RuntimeException(ex);
+        }
     }
 
 }
diff --git a/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java b/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
index d68b991..5031c05 100644
--- a/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
+++ b/src/test/java/it/inaf/oats/vospace/datamodel/NodeUtilsTest.java
@@ -271,6 +271,15 @@ public class NodeUtilsTest {
         assertEquals("/mynode/child1/child2", NodeUtils.getVosPath(node));
     }
 
+    @Test
+    public void testGetVosPathSpecialChars() {
+
+        Node node = new DataNode();
+        node.setUri("vos://example.com!vospace/mynode/(%20+%20)/child2");
+
+        assertEquals("/mynode/( + )/child2", NodeUtils.getVosPath(node));
+    }
+
     @Test
     public void testGetParentPath() {
         assertEquals("/node1/node2", NodeUtils.getParentPath("/node1/node2/node2"));
-- 
GitLab