Skip to content
Snippets Groups Projects
Commit ac677429 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Added ErrorController and NodeNotFoundException

parent 09d327c9
No related branches found
No related tags found
No related merge requests found
package it.inaf.oats.vospace; package it.inaf.oats.vospace;
import it.inaf.oats.vospace.exception.NodeNotFoundException;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -21,6 +22,7 @@ public class ListNodeController extends BaseNodeController { ...@@ -21,6 +22,7 @@ public class ListNodeController extends BaseNodeController {
produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE}) produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE})
public ResponseEntity<Node> listNode(HttpServletRequest request) { public ResponseEntity<Node> listNode(HttpServletRequest request) {
String path = getPath(); String path = getPath();
return ResponseEntity.ok(nodeDAO.listNode(path)); return ResponseEntity.ok(nodeDAO.listNode(path)
.orElseThrow(() -> new NodeNotFoundException(path)));
} }
} }
package it.inaf.oats.vospace.exception;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("${server.error.path:${error.path:/error}}")
public class ErrorController extends AbstractErrorController {
@Autowired
public ErrorController(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
@RequestMapping(produces = MediaType.TEXT_XML_VALUE)
public void errorText(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> errors = super.getErrorAttributes(request, true);
response.setContentType("text/plain;charset=UTF-8");
response.getOutputStream().print((String) errors.get("message"));
}
@Override
public String getErrorPath() {
return null;
}
}
package it.inaf.oats.vospace.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class NodeNotFoundException extends VoSpaceException {
public NodeNotFoundException(String path) {
super("NodeNotFound: " + path);
}
}
package it.inaf.oats.vospace.exception;
public class VoSpaceException extends RuntimeException {
public VoSpaceException(String message) {
super(message);
}
}
...@@ -5,6 +5,7 @@ import java.sql.PreparedStatement; ...@@ -5,6 +5,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.Optional;
import javax.sql.DataSource; import javax.sql.DataSource;
import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.DataNode;
...@@ -43,7 +44,7 @@ public class NodeDAO { ...@@ -43,7 +44,7 @@ public class NodeDAO {
return myNode; return myNode;
} }
public Node listNode(String path) { public Optional<Node> listNode(String path) {
String sql = "SELECT os.vos_path, n.node_id, type, async_trans, owner_id, group_read, group_write, is_public, content_length, created_on, last_modified from node n\n" String sql = "SELECT os.vos_path, n.node_id, type, async_trans, owner_id, group_read, group_write, is_public, content_length, created_on, last_modified from node n\n"
+ "JOIN node_vos_path os ON n.node_id = os.node_id\n" + "JOIN node_vos_path os ON n.node_id = os.node_id\n"
...@@ -59,6 +60,10 @@ public class NodeDAO { ...@@ -59,6 +60,10 @@ public class NodeDAO {
return getNodeFromResultSet(row); return getNodeFromResultSet(row);
}); });
if(parentAndChildren.isEmpty()) {
return Optional.empty();
}
// Query returns parent as first node // Query returns parent as first node
Node node = parentAndChildren.get(0); Node node = parentAndChildren.get(0);
...@@ -70,7 +75,7 @@ public class NodeDAO { ...@@ -70,7 +75,7 @@ public class NodeDAO {
} }
} }
return node; return Optional.of(node);
} }
private String getFirstLevelChildrenSelector(String path) { private String getFirstLevelChildrenSelector(String path) {
......
...@@ -2,6 +2,7 @@ package it.inaf.oats.vospace; ...@@ -2,6 +2,7 @@ package it.inaf.oats.vospace;
import static it.inaf.oats.vospace.VOSpaceXmlTestUtil.loadDocument; import static it.inaf.oats.vospace.VOSpaceXmlTestUtil.loadDocument;
import it.inaf.oats.vospace.persistence.NodeDAO; import it.inaf.oats.vospace.persistence.NodeDAO;
import java.util.Optional;
import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.ContainerNode;
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;
...@@ -55,7 +56,7 @@ public class ListNodeControllerTest { ...@@ -55,7 +56,7 @@ public class ListNodeControllerTest {
@Test @Test
public void testNodeXml() throws Exception { public void testNodeXml() throws Exception {
when(dao.listNode(eq("/mynode"))).thenReturn(getDataNode()); when(dao.listNode(eq("/mynode"))).thenReturn(Optional.of(getDataNode()));
String xml = mockMvc.perform(get("/nodes/mynode") String xml = mockMvc.perform(get("/nodes/mynode")
.accept(MediaType.APPLICATION_XML)) .accept(MediaType.APPLICATION_XML))
...@@ -70,11 +71,18 @@ public class ListNodeControllerTest { ...@@ -70,11 +71,18 @@ public class ListNodeControllerTest {
verify(dao, times(1)).listNode(eq("/mynode")); verify(dao, times(1)).listNode(eq("/mynode"));
} }
private Node getRootNode() { @Test
public void testNodeNotFound() throws Exception {
mockMvc.perform(get("/nodes/mynode")
.accept(MediaType.APPLICATION_XML))
.andExpect(status().isNotFound());
}
private Optional<Node> getRootNode() {
ContainerNode root = new ContainerNode(); ContainerNode root = new ContainerNode();
root.setUri(URI_PREFIX + "/"); root.setUri(URI_PREFIX + "/");
root.getNodes().add(getDataNode()); root.getNodes().add(getDataNode());
return root; return Optional.of(root);
} }
private Node getDataNode() { private Node getDataNode() {
......
...@@ -27,7 +27,7 @@ public class NodeDAOTest { ...@@ -27,7 +27,7 @@ public class NodeDAOTest {
@Test @Test
public void testListNode() { public void testListNode() {
ContainerNode root = (ContainerNode) dao.listNode("/"); ContainerNode root = (ContainerNode) dao.listNode("/").get();
assertEquals(4, root.getNodes().size()); assertEquals(4, root.getNodes().size());
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment