Commit 3d0c8655 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Handled URL encoded node URI in VOSpace REST responses and added some tests

parent d60374fa
Loading
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -106,6 +106,9 @@
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <trimStackTrace>false</trimStackTrace>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
+2 −2
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ public class VOSpaceClient {

        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("Content-Type", useJson ? "application/json" : "text/xml")
                .PUT(HttpRequest.BodyPublishers.ofString(marshal(node)))
@@ -166,7 +166,7 @@ public class VOSpaceClient {

        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("Content-Type", useJson ? "application/json" : "text/xml")
                .POST(HttpRequest.BodyPublishers.ofString(marshal(node)))
+7 −4
Original line number Diff line number Diff line
@@ -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.MoveNodeModalHtmlGenerator;
import it.inaf.oats.vospace.datamodel.NodeUtils;
import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -79,6 +80,8 @@ public class NodesController extends BaseController {
    @GetMapping(value = "/nodesForMove", produces = MediaType.APPLICATION_JSON_VALUE)
    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();

        Node node = client.getNode(path);
@@ -99,7 +102,7 @@ public class NodesController extends BaseController {

        Transfer transfer = new Transfer();
        transfer.setDirection("pullFromVoSpace");
        transfer.setTarget(Arrays.asList("vos://" + authority + path));
        transfer.setTarget(Arrays.asList("vos://" + authority + urlEncodePath(path)));

        Protocol protocol = new Protocol();
        protocol.setUri("ivo://ivoa.net/vospace/core#httpget");
@@ -123,7 +126,7 @@ public class NodesController extends BaseController {
        LOG.debug("newFolder called for path {}/{}", parentPath, name);

        ContainerNode node = new ContainerNode();
        node.setUri("vos://" + authority + parentPath + "/" + name);
        node.setUri("vos://" + authority + urlEncodePath(parentPath + "/" + name));

        Property creator = new Property();
        creator.setUri("ivo://ivoa.net/vospace/core#creator");
@@ -162,8 +165,8 @@ public class NodesController extends BaseController {
    @PostMapping(value = "/move")
    public ResponseEntity<Job> moveNode(@RequestBody Map<String, Object> params) {

        String target = getRequiredParam(params, "target");
        String direction = getRequiredParam(params, "direction");
        String target = urlEncodePath(getRequiredParam(params, "target"));
        String direction = urlEncodePath(getRequiredParam(params, "direction"));

        Transfer transfer = new Transfer();
        transfer.setTarget(Arrays.asList("vos://" + authority + target));
+9 −4
Original line number Diff line number Diff line
@@ -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.data.UploadFilesData;
import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException;
import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -64,11 +65,15 @@ public class UploadController extends BaseController {
    public CompletableFuture<String> prepareForDownload(String parentPath, String fileName) {

        return CompletableFuture.supplyAsync(() -> {
            String nodeUri = "vos://" + authority + parentPath;
            if (!nodeUri.endsWith("/")) {
                nodeUri += "/";

            String path = parentPath;

            if (!path.endsWith("/")) {
                path += "/";
            }
            nodeUri += fileName;
            path += fileName;

            String nodeUri = "vos://" + authority + urlEncodePath(path);

            createDataNode(nodeUri, getUser().getName());

+9 −4
Original line number Diff line number Diff line
@@ -9,12 +9,14 @@ import it.inaf.ia2.aa.data.User;
import it.inaf.ia2.vospace.ui.exception.VOSpaceException;
import it.inaf.oats.vospace.datamodel.NodeProperties;
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.stream.Collectors;
import net.ivoa.xml.vospace.v2.DataNode;
import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.View;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@@ -41,7 +43,7 @@ public class NodeInfo {
    public NodeInfo(Node node, User user, String authority) {
        this.authority = authority;
        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.type = node.getType();
        this.creator = getCreator(node);
@@ -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);
        }

        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) {
Loading