Commit 6fabe7e6 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Implemented folder creation

parent 79b85ff5
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4,4 +4,4 @@
**/dist/*
.env.local
nbactions.xml
.env.development.local
+17 −1
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@ package it.inaf.ia2.vospace.ui.client;

import com.fasterxml.jackson.databind.ObjectMapper;
import it.inaf.ia2.aa.data.User;
import it.inaf.ia2.vospace.ui.VOSpaceException;
import it.inaf.ia2.vospace.ui.VOSpaceUiApplication;
import it.inaf.ia2.vospace.ui.exception.VOSpaceException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
@@ -40,6 +40,9 @@ public class VOSpaceClient {
    @Value("${use-json}")
    private boolean useJson;

    @Value("${vospace-authority}")
    private String authority;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    private final HttpClient httpClient;
@@ -95,6 +98,19 @@ public class VOSpaceClient {
        return call(request, BodyHandlers.ofInputStream(), 200, res -> unmarshal(res, Transfer.class)).getProtocols();
    }

    public Node createNode(Node node) {

        String path = node.getUri().substring(("vos://" + authority).length());

        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)))
                .build();

        return call(request, BodyHandlers.ofInputStream(), 200, res -> unmarshal(res, Node.class));
    }

    private <T, U> U call(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler, int expectedStatusCode, Function<T, U> responseHandler) {
        try {
            return httpClient.sendAsync(request, responseBodyHandler)
+27 −0
Original line number Diff line number Diff line
package it.inaf.ia2.vospace.ui.controller;

import it.inaf.ia2.vospace.ui.client.VOSpaceClient;
import it.inaf.ia2.vospace.ui.exception.BadRequestException;
import it.inaf.ia2.vospace.ui.service.NodesService;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.Protocol;
import net.ivoa.xml.vospace.v2.Transfer;
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +15,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@@ -64,6 +69,28 @@ public class NodesController {
        return new ResponseEntity<>(headers, HttpStatus.SEE_OTHER);
    }

    @PostMapping(value = "/folder")
    public void newFolder(@RequestBody Map<String, String> params) {

        String parentPath = getRequiredParam(params, "parentPath");
        if (!parentPath.startsWith("/")) {
            parentPath = "/" + parentPath;
        }
        String name = getRequiredParam(params, "name");

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

        client.createNode(node);
    }

    private String getRequiredParam(Map<String, String> params, String key) {
        if (!params.containsKey(key)) {
            throw new BadRequestException("Missing mandatory parameter " + key);
        }
        return params.get(key);
    }

    /**
     * Slash is a special character in defining REST endpoints and trying to
     * define a PathVariable containing slashes doesn't work, so the endpoint
+12 −0
Original line number Diff line number Diff line
package it.inaf.ia2.vospace.ui.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public class BadRequestException extends VOSpaceException {

    public BadRequestException(String message) {
        super(message);
    }
}
+1 −1
Original line number Diff line number Diff line
package it.inaf.ia2.vospace.ui;
package it.inaf.ia2.vospace.ui.exception;

public class VOSpaceException extends RuntimeException {

Loading