Loading vospace-ui-backend/pom.xml +3 −0 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,9 @@ <plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <version>2.22.2</version> <configuration> <trimStackTrace>false</trimStackTrace> </configuration> </plugin> </plugin> <plugin> <plugin> <groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId> Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -142,7 +142,7 @@ public class VOSpaceClient { String path = node.getUri().substring(("vos://" + authority).length()); String path = node.getUri().substring(("vos://" + authority).length()); HttpRequest request = getRequest("/nodes" + urlEncodePath(path)) HttpRequest request = getRequest("/nodes" + path) .header("Accept", useJson ? "application/json" : "text/xml") .header("Accept", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .PUT(HttpRequest.BodyPublishers.ofString(marshal(node))) .PUT(HttpRequest.BodyPublishers.ofString(marshal(node))) Loading @@ -166,7 +166,7 @@ public class VOSpaceClient { String path = node.getUri().substring(("vos://" + authority).length()); String path = node.getUri().substring(("vos://" + authority).length()); HttpRequest request = getRequest("/nodes" + urlEncodePath(path) + "?recursive=" + recursive) HttpRequest request = getRequest("/nodes" + path + "?recursive=" + recursive) .header("Accept", useJson ? "application/json" : "text/xml") .header("Accept", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .POST(HttpRequest.BodyPublishers.ofString(marshal(node))) .POST(HttpRequest.BodyPublishers.ofString(marshal(node))) Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java +7 −4 Original line number Original line Diff line number Diff line Loading @@ -13,6 +13,7 @@ import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MoveNodeModalHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MoveNodeModalHtmlGenerator; import it.inaf.oats.vospace.datamodel.NodeUtils; import it.inaf.oats.vospace.datamodel.NodeUtils; import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; Loading Loading @@ -79,6 +80,8 @@ public class NodesController extends BaseController { @GetMapping(value = "/nodesForMove", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value = "/nodesForMove", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<ListNodeData> listNodesForMoveModal(@RequestParam("path") String path, @RequestParam("nodeToMove") String nodeToMove, User principal) throws Exception { public ResponseEntity<ListNodeData> listNodesForMoveModal(@RequestParam("path") String path, @RequestParam("nodeToMove") String nodeToMove, User principal) throws Exception { LOG.debug("listNodes called for path {}", path); ListNodeData listNodeData = new ListNodeData(); ListNodeData listNodeData = new ListNodeData(); Node node = client.getNode(path); Node node = client.getNode(path); Loading @@ -99,7 +102,7 @@ public class NodesController extends BaseController { Transfer transfer = new Transfer(); Transfer transfer = new Transfer(); transfer.setDirection("pullFromVoSpace"); transfer.setDirection("pullFromVoSpace"); transfer.setTarget(Arrays.asList("vos://" + authority + path)); transfer.setTarget(Arrays.asList("vos://" + authority + urlEncodePath(path))); Protocol protocol = new Protocol(); Protocol protocol = new Protocol(); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); Loading @@ -123,7 +126,7 @@ public class NodesController extends BaseController { LOG.debug("newFolder called for path {}/{}", parentPath, name); LOG.debug("newFolder called for path {}/{}", parentPath, name); ContainerNode node = new ContainerNode(); ContainerNode node = new ContainerNode(); node.setUri("vos://" + authority + parentPath + "/" + name); node.setUri("vos://" + authority + urlEncodePath(parentPath + "/" + name)); Property creator = new Property(); Property creator = new Property(); creator.setUri("ivo://ivoa.net/vospace/core#creator"); creator.setUri("ivo://ivoa.net/vospace/core#creator"); Loading Loading @@ -162,8 +165,8 @@ public class NodesController extends BaseController { @PostMapping(value = "/move") @PostMapping(value = "/move") public ResponseEntity<Job> moveNode(@RequestBody Map<String, Object> params) { public ResponseEntity<Job> moveNode(@RequestBody Map<String, Object> params) { String target = getRequiredParam(params, "target"); String target = urlEncodePath(getRequiredParam(params, "target")); String direction = getRequiredParam(params, "direction"); String direction = urlEncodePath(getRequiredParam(params, "direction")); Transfer transfer = new Transfer(); Transfer transfer = new Transfer(); transfer.setTarget(Arrays.asList("vos://" + authority + target)); transfer.setTarget(Arrays.asList("vos://" + authority + target)); Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ package it.inaf.ia2.vospace.ui.controller; import it.inaf.ia2.vospace.ui.client.VOSpaceClient; import it.inaf.ia2.vospace.ui.client.VOSpaceClient; import it.inaf.ia2.vospace.ui.data.UploadFilesData; import it.inaf.ia2.vospace.ui.data.UploadFilesData; import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException; import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException; import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture; Loading Loading @@ -64,11 +65,15 @@ public class UploadController extends BaseController { public CompletableFuture<String> prepareForDownload(String parentPath, String fileName) { public CompletableFuture<String> prepareForDownload(String parentPath, String fileName) { return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> { String nodeUri = "vos://" + authority + parentPath; if (!nodeUri.endsWith("/")) { String path = parentPath; nodeUri += "/"; if (!path.endsWith("/")) { path += "/"; } } nodeUri += fileName; path += fileName; String nodeUri = "vos://" + authority + urlEncodePath(path); createDataNode(nodeUri, getUser().getName()); createDataNode(nodeUri, getUser().getName()); Loading vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/NodeInfo.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -9,12 +9,14 @@ import it.inaf.ia2.aa.data.User; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.oats.vospace.datamodel.NodeProperties; import it.inaf.oats.vospace.datamodel.NodeProperties; import it.inaf.oats.vospace.datamodel.NodeUtils; import it.inaf.oats.vospace.datamodel.NodeUtils; import java.util.List; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; import java.util.Optional; import java.util.stream.Collectors; import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.View; import org.slf4j.Logger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory; Loading @@ -41,7 +43,7 @@ public class NodeInfo { public NodeInfo(Node node, User user, String authority) { public NodeInfo(Node node, User user, String authority) { this.authority = authority; this.authority = authority; this.path = getPath(node); this.path = getPath(node); this.name = path.substring(path.lastIndexOf("/") + 1); this.name = URLDecoder.decode(path.substring(path.lastIndexOf("/") + 1), StandardCharsets.UTF_8); this.size = getSize(node); this.size = getSize(node); this.type = node.getType(); this.type = node.getType(); this.creator = getCreator(node); this.creator = getCreator(node); Loading @@ -65,7 +67,10 @@ public class NodeInfo { throw new VOSpaceException("Node authority is different from configured one! Configured is " + authority + ", but node URI is " + uri); throw new VOSpaceException("Node authority is different from configured one! Configured is " + authority + ", but node URI is " + uri); } } return uri.substring(prefix.length()); // returns decoded path return String.join("/", Arrays.stream(uri.substring(prefix.length()).split("/")) .map(p -> URLDecoder.decode(p, StandardCharsets.UTF_8)) .collect(Collectors.toList())); } } private String getCreator(Node node) { private String getCreator(Node node) { Loading Loading
vospace-ui-backend/pom.xml +3 −0 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,9 @@ <plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <version>2.22.2</version> <configuration> <trimStackTrace>false</trimStackTrace> </configuration> </plugin> </plugin> <plugin> <plugin> <groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId> Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -142,7 +142,7 @@ public class VOSpaceClient { String path = node.getUri().substring(("vos://" + authority).length()); String path = node.getUri().substring(("vos://" + authority).length()); HttpRequest request = getRequest("/nodes" + urlEncodePath(path)) HttpRequest request = getRequest("/nodes" + path) .header("Accept", useJson ? "application/json" : "text/xml") .header("Accept", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .PUT(HttpRequest.BodyPublishers.ofString(marshal(node))) .PUT(HttpRequest.BodyPublishers.ofString(marshal(node))) Loading @@ -166,7 +166,7 @@ public class VOSpaceClient { String path = node.getUri().substring(("vos://" + authority).length()); String path = node.getUri().substring(("vos://" + authority).length()); HttpRequest request = getRequest("/nodes" + urlEncodePath(path) + "?recursive=" + recursive) HttpRequest request = getRequest("/nodes" + path + "?recursive=" + recursive) .header("Accept", useJson ? "application/json" : "text/xml") .header("Accept", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .header("Content-Type", useJson ? "application/json" : "text/xml") .POST(HttpRequest.BodyPublishers.ofString(marshal(node))) .POST(HttpRequest.BodyPublishers.ofString(marshal(node))) Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java +7 −4 Original line number Original line Diff line number Diff line Loading @@ -13,6 +13,7 @@ import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MoveNodeModalHtmlGenerator; import it.inaf.ia2.vospace.ui.service.MoveNodeModalHtmlGenerator; import it.inaf.oats.vospace.datamodel.NodeUtils; import it.inaf.oats.vospace.datamodel.NodeUtils; import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; Loading Loading @@ -79,6 +80,8 @@ public class NodesController extends BaseController { @GetMapping(value = "/nodesForMove", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value = "/nodesForMove", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<ListNodeData> listNodesForMoveModal(@RequestParam("path") String path, @RequestParam("nodeToMove") String nodeToMove, User principal) throws Exception { public ResponseEntity<ListNodeData> listNodesForMoveModal(@RequestParam("path") String path, @RequestParam("nodeToMove") String nodeToMove, User principal) throws Exception { LOG.debug("listNodes called for path {}", path); ListNodeData listNodeData = new ListNodeData(); ListNodeData listNodeData = new ListNodeData(); Node node = client.getNode(path); Node node = client.getNode(path); Loading @@ -99,7 +102,7 @@ public class NodesController extends BaseController { Transfer transfer = new Transfer(); Transfer transfer = new Transfer(); transfer.setDirection("pullFromVoSpace"); transfer.setDirection("pullFromVoSpace"); transfer.setTarget(Arrays.asList("vos://" + authority + path)); transfer.setTarget(Arrays.asList("vos://" + authority + urlEncodePath(path))); Protocol protocol = new Protocol(); Protocol protocol = new Protocol(); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); Loading @@ -123,7 +126,7 @@ public class NodesController extends BaseController { LOG.debug("newFolder called for path {}/{}", parentPath, name); LOG.debug("newFolder called for path {}/{}", parentPath, name); ContainerNode node = new ContainerNode(); ContainerNode node = new ContainerNode(); node.setUri("vos://" + authority + parentPath + "/" + name); node.setUri("vos://" + authority + urlEncodePath(parentPath + "/" + name)); Property creator = new Property(); Property creator = new Property(); creator.setUri("ivo://ivoa.net/vospace/core#creator"); creator.setUri("ivo://ivoa.net/vospace/core#creator"); Loading Loading @@ -162,8 +165,8 @@ public class NodesController extends BaseController { @PostMapping(value = "/move") @PostMapping(value = "/move") public ResponseEntity<Job> moveNode(@RequestBody Map<String, Object> params) { public ResponseEntity<Job> moveNode(@RequestBody Map<String, Object> params) { String target = getRequiredParam(params, "target"); String target = urlEncodePath(getRequiredParam(params, "target")); String direction = getRequiredParam(params, "direction"); String direction = urlEncodePath(getRequiredParam(params, "direction")); Transfer transfer = new Transfer(); Transfer transfer = new Transfer(); transfer.setTarget(Arrays.asList("vos://" + authority + target)); transfer.setTarget(Arrays.asList("vos://" + authority + target)); Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ package it.inaf.ia2.vospace.ui.controller; import it.inaf.ia2.vospace.ui.client.VOSpaceClient; import it.inaf.ia2.vospace.ui.client.VOSpaceClient; import it.inaf.ia2.vospace.ui.data.UploadFilesData; import it.inaf.ia2.vospace.ui.data.UploadFilesData; import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException; import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException; import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture; Loading Loading @@ -64,11 +65,15 @@ public class UploadController extends BaseController { public CompletableFuture<String> prepareForDownload(String parentPath, String fileName) { public CompletableFuture<String> prepareForDownload(String parentPath, String fileName) { return CompletableFuture.supplyAsync(() -> { return CompletableFuture.supplyAsync(() -> { String nodeUri = "vos://" + authority + parentPath; if (!nodeUri.endsWith("/")) { String path = parentPath; nodeUri += "/"; if (!path.endsWith("/")) { path += "/"; } } nodeUri += fileName; path += fileName; String nodeUri = "vos://" + authority + urlEncodePath(path); createDataNode(nodeUri, getUser().getName()); createDataNode(nodeUri, getUser().getName()); Loading
vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/service/NodeInfo.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -9,12 +9,14 @@ import it.inaf.ia2.aa.data.User; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import it.inaf.oats.vospace.datamodel.NodeProperties; import it.inaf.oats.vospace.datamodel.NodeProperties; import it.inaf.oats.vospace.datamodel.NodeUtils; import it.inaf.oats.vospace.datamodel.NodeUtils; import java.util.List; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; import java.util.Optional; import java.util.stream.Collectors; import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.View; import org.slf4j.Logger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory; Loading @@ -41,7 +43,7 @@ public class NodeInfo { public NodeInfo(Node node, User user, String authority) { public NodeInfo(Node node, User user, String authority) { this.authority = authority; this.authority = authority; this.path = getPath(node); this.path = getPath(node); this.name = path.substring(path.lastIndexOf("/") + 1); this.name = URLDecoder.decode(path.substring(path.lastIndexOf("/") + 1), StandardCharsets.UTF_8); this.size = getSize(node); this.size = getSize(node); this.type = node.getType(); this.type = node.getType(); this.creator = getCreator(node); this.creator = getCreator(node); Loading @@ -65,7 +67,10 @@ public class NodeInfo { throw new VOSpaceException("Node authority is different from configured one! Configured is " + authority + ", but node URI is " + uri); throw new VOSpaceException("Node authority is different from configured one! Configured is " + authority + ", but node URI is " + uri); } } return uri.substring(prefix.length()); // returns decoded path return String.join("/", Arrays.stream(uri.substring(prefix.length()).split("/")) .map(p -> URLDecoder.decode(p, StandardCharsets.UTF_8)) .collect(Collectors.toList())); } } private String getCreator(Node node) { private String getCreator(Node node) { Loading