From 9a5d7e7b012aa7e39aa91abbdc88a24a8e8ea28f Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Tue, 6 Jun 2017 15:07:08 +0200 Subject: [PATCH] new api call format for removing overlay --- .../17296/DELETE_token=MOCK_TOKEN_ID&} | 0 pom.xml | 3 + rest-api/.classpath | 66 +++++++++++-------- .../org.eclipse.core.resources.prefs | 2 + .../org.eclipse.wst.common.component | 1 - rest-api/pom.xml | 12 ++++ .../lcsb/mapviewer/api/BaseController.java | 3 + .../java/lcsb/mapviewer/api/BaseRestImpl.java | 1 - .../api/ObjectNotFoundException.java | 13 ++++ .../projects/overlays/OverlayController.java | 66 +++++++++++-------- .../projects/overlays/OverlayRestImpl.java | 7 +- .../api/projects/AllProjectTests.java | 2 + .../projects/overlays/AllOverlaysTests.java | 11 ++++ .../overlays/OverlayControllerTest.java | 43 ++++++++++++ 14 files changed, 168 insertions(+), 62 deletions(-) rename frontend-js/testFiles/apiCalls/{overlay/removeOverlay/POST_overlayId=17296&projectId=sample&token=MOCK_TOKEN_ID& => projects/sample/overlays/17296/DELETE_token=MOCK_TOKEN_ID&} (100%) create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/ObjectNotFoundException.java create mode 100644 rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java create mode 100644 rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayControllerTest.java diff --git a/frontend-js/testFiles/apiCalls/overlay/removeOverlay/POST_overlayId=17296&projectId=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/overlays/17296/DELETE_token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/overlay/removeOverlay/POST_overlayId=17296&projectId=sample&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/sample/overlays/17296/DELETE_token=MOCK_TOKEN_ID& diff --git a/pom.xml b/pom.xml index 7e0e056d56..c4ae7d49e1 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,9 @@ <jersey.version>1.18.1</jersey.version> <rs-jax.version>1.1.1</rs-jax.version> + <jackson.version>2.8.8</jackson.version> + + <log4j.version>1.2.17</log4j.version> <apache.commons-lang3.version>3.1</apache.commons-lang3.version> diff --git a/rest-api/.classpath b/rest-api/.classpath index f2b9c43c7c..3783d3d93c 100644 --- a/rest-api/.classpath +++ b/rest-api/.classpath @@ -1,29 +1,37 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" output="target/classes" path="src/main/java"> - <attributes> - <attribute name="optional" value="true"/> - <attribute name="maven.pomderived" value="true"/> - </attributes> - </classpathentry> - <classpathentry kind="src" output="target/test-classes" path="src/test/java"> - <attributes> - <attribute name="optional" value="true"/> - <attribute name="maven.pomderived" value="true"/> - </attributes> - </classpathentry> - <classpathentry kind="src" path="src/main/resources"/> - <classpathentry kind="src" path="src/test/resources"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> - <attributes> - <attribute name="maven.pomderived" value="true"/> - </attributes> - </classpathentry> - <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> - <attributes> - <attribute name="maven.pomderived" value="true"/> - <attribute name="org.eclipse.jst.component.nondependency" value=""/> - </attributes> - </classpathentry> - <classpathentry kind="output" path="target/classes"/> -</classpath> +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" output="target/classes" path="src/main/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" output="target/test-classes" path="src/test/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + <attribute name="org.eclipse.jst.component.nondependency" value=""/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="target/classes"/> +</classpath> diff --git a/rest-api/.settings/org.eclipse.core.resources.prefs b/rest-api/.settings/org.eclipse.core.resources.prefs index 4c28b1a898..04cfa2c1a8 100644 --- a/rest-api/.settings/org.eclipse.core.resources.prefs +++ b/rest-api/.settings/org.eclipse.core.resources.prefs @@ -1,4 +1,6 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 encoding/<project>=UTF-8 diff --git a/rest-api/.settings/org.eclipse.wst.common.component b/rest-api/.settings/org.eclipse.wst.common.component index e049d3a484..30ef6cd5dc 100644 --- a/rest-api/.settings/org.eclipse.wst.common.component +++ b/rest-api/.settings/org.eclipse.wst.common.component @@ -2,6 +2,5 @@ <wb-module deploy-name="MapViewer-rest-api"> <wb-resource deploy-path="/" source-path="/src/main/java"/> <wb-resource deploy-path="/" source-path="/src/main/resources"/> - <wb-resource deploy-path="/" source-path="/src/test/resources"/> </wb-module> </project-modules> diff --git a/rest-api/pom.xml b/rest-api/pom.xml index cb185247b6..6898343897 100644 --- a/rest-api/pom.xml +++ b/rest-api/pom.xml @@ -48,6 +48,18 @@ <artifactId>spring-faces</artifactId> <version>${springframework.webflow.version}</version> </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + <version>${jackson.version}</version> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>${jackson.version}</version> + </dependency> <dependency> <groupId>org.mockito</groupId> diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java index d7f6e3c8fe..6d7382eb32 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java @@ -18,6 +18,9 @@ public abstract class BaseController { logger.error(e, e); if (e instanceof SecurityException) { return new ResponseEntity<Object>("{\"error\" : \"Access denied.\",\"reason\":\"" + e.getMessage() + "\"}", new HttpHeaders(), HttpStatus.FORBIDDEN); + } else if (e instanceof ObjectNotFoundException) { + return new ResponseEntity<Object>( + "{\"error\" : \"Object not found.\",\"reason\":\"" + e.getMessage() + "\"}", new HttpHeaders(), HttpStatus.NOT_FOUND); } else if (e instanceof QueryException) { return new ResponseEntity<Object>( "{\"error\" : \"Query server error.\",\"reason\":\"" + e.getMessage() + "\"}", new HttpHeaders(), HttpStatus.BAD_REQUEST); diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java index 8cfea323f1..272e3998a2 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java @@ -26,7 +26,6 @@ public abstract class BaseRestImpl { protected Map<String, Object> okStatus() { Map<String, Object> result = new HashMap<>(); - result.put("status", "OK"); return result; } diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/ObjectNotFoundException.java b/rest-api/src/main/java/lcsb/mapviewer/api/ObjectNotFoundException.java new file mode 100644 index 0000000000..907d839df8 --- /dev/null +++ b/rest-api/src/main/java/lcsb/mapviewer/api/ObjectNotFoundException.java @@ -0,0 +1,13 @@ +package lcsb.mapviewer.api; + +public class ObjectNotFoundException extends QueryException { + + public ObjectNotFoundException(String message) { + super(message); + } + + public ObjectNotFoundException(String message, Exception reason) { + super(message, reason); + } + +} diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java index fec3dc8f94..0b74eab909 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java @@ -4,17 +4,20 @@ import java.io.IOException; import java.util.List; import java.util.Map; -import javax.ws.rs.PathParam; - +import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + import lcsb.mapviewer.api.BaseController; import lcsb.mapviewer.api.QueryException; import lcsb.mapviewer.model.cache.FileEntry; @@ -24,15 +27,19 @@ import lcsb.mapviewer.services.view.LayoutView; @RestController public class OverlayController extends BaseController { + private Logger logger = Logger.getLogger(OverlayController.class); + @Autowired - private OverlayRestImpl overlayController; + private OverlayRestImpl overlayRestImp; + + private ObjectMapper mapper = new ObjectMapper(); @RequestMapping(value = "/projects/{projectId}/overlays/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public List<LayoutView> getOverlayList(// @RequestParam(value = "token") String token, // @PathVariable(value = "projectId") String projectId // ) throws SecurityException, QueryException { - return overlayController.getOverlayList(token, projectId); + return overlayRestImp.getOverlayList(token, projectId); } @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) @@ -41,7 +48,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "projectId") String projectId, // @PathVariable(value = "overlayId") String overlayId// ) throws SecurityException, QueryException { - return overlayController.getOverlayById(token, projectId, overlayId); + return overlayRestImp.getOverlayById(token, projectId, overlayId); } @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}/models/{modelId}/bioEntities/", method = { RequestMethod.GET }, @@ -51,7 +58,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "projectId") String projectId, // @PathVariable(value = "overlayId") String overlayId, @RequestParam(value = "columns", defaultValue = "") String columns) throws SecurityException, QueryException { - return overlayController.getOverlayElements(token, projectId, Integer.valueOf(overlayId), columns); + return overlayRestImp.getOverlayElements(token, projectId, Integer.valueOf(overlayId), columns); } @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}/models/{modelId}/bioEntities/reactions/{reactionId}/", method = { RequestMethod.GET }, @@ -64,7 +71,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "reactionId") String reactionId, // @RequestParam(value = "columns", defaultValue = "") String columns // ) throws SecurityException, QueryException { - return overlayController + return overlayRestImp .getOverlayElement(token, projectId, Integer.valueOf(modelId), Integer.valueOf(overlayId), Integer.valueOf(reactionId), "REACTION", columns); } @@ -78,7 +85,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "elementId") String reactionId, // @RequestParam(value = "columns", defaultValue = "") String columns // ) throws SecurityException, QueryException { - return overlayController + return overlayRestImp .getOverlayElement(token, projectId, Integer.valueOf(modelId), Integer.valueOf(overlayId), Integer.valueOf(reactionId), "ALIAS", columns); } @@ -92,12 +99,22 @@ public class OverlayController extends BaseController { @RequestParam(value = "filename") String filename, // @RequestParam(value = "type", defaultValue = "") String type // ) throws SecurityException, QueryException, IOException { - return overlayController.addOverlay(token, projectId, name, description, content, filename, type); + return overlayRestImp.addOverlay(token, projectId, name, description, content, filename, type); + } + + @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}", method = { RequestMethod.DELETE }, produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> removeOverlay( // + @RequestBody String body, // + @PathVariable(value = "projectId") String projectId, // + @PathVariable(value = "overlayId") String overlayId // + ) throws SecurityException, QueryException, IOException { + ObjectNode node = mapper.readValue(body, ObjectNode.class); + return overlayRestImp.removeOverlay(node.get("token").asText(), projectId, overlayId); } @RequestMapping(value = "/overlay/getOverlayTypes", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public List<Map<String, Object>> getOverlayTypes(@RequestParam(value = "token") String token) throws SecurityException, QueryException { - return overlayController.getOverlayTypes(token); + return overlayRestImp.getOverlayTypes(token); } @RequestMapping(value = "/overlay/updateOverlay", method = { RequestMethod.GET, RequestMethod.PUT, RequestMethod.POST }, @@ -105,21 +122,14 @@ public class OverlayController extends BaseController { public Map<String, Object> updateOverlay(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, @RequestParam(value = "overlayId") String overlayId, @RequestParam(value = "name") String name, @RequestParam(value = "description") String description) throws SecurityException, QueryException { - return overlayController.updateOverlay(token, projectId, overlayId, name, description); - } - - @RequestMapping(value = "/overlay/removeOverlay", method = { RequestMethod.GET, RequestMethod.DELETE, RequestMethod.POST }, - produces = { MediaType.APPLICATION_JSON_VALUE }) - public Map<String, Object> removeOverlay(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, - @RequestParam(value = "overlayId") String overlayId) throws SecurityException, QueryException, IOException { - return overlayController.removeOverlay(token, projectId, overlayId); + return overlayRestImp.updateOverlay(token, projectId, overlayId, name, description); } @RequestMapping(value = "/overlay/getOverlaySource", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public ResponseEntity<byte[]> getOverlaySource(@RequestParam(value = "token") String token, @RequestParam(value = "projectId") String projectId, @RequestParam(value = "overlayId") String overlayId) throws SecurityException, QueryException { - FileEntry file = overlayController.getOverlaySource(token, projectId, overlayId); + FileEntry file = overlayRestImp.getOverlaySource(token, projectId, overlayId); MediaType type = MediaType.TEXT_PLAIN; if (file.getOriginalFileName().endsWith("xml")) { type = MediaType.APPLICATION_XML; @@ -130,20 +140,20 @@ public class OverlayController extends BaseController { } /** - * @return the overlayController - * @see #overlayController + * @return the overlayRestImp + * @see #overlayRestImp */ - public OverlayRestImpl getOverlayController() { - return overlayController; + public OverlayRestImpl getOverlayRestImp() { + return overlayRestImp; } /** - * @param overlayController - * the overlayController to set - * @see #overlayController + * @param overlayRestImp + * the overlayRestImp to set + * @see #overlayRestImp */ - public void setOverlayController(OverlayRestImpl overlayController) { - this.overlayController = overlayController; + public void setOverlayRestImp(OverlayRestImpl overlayRestImp) { + this.overlayRestImp = overlayRestImp; } } \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java index aef38648ff..72c881ef10 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import lcsb.mapviewer.api.BaseRestImpl; +import lcsb.mapviewer.api.ObjectNotFoundException; import lcsb.mapviewer.api.QueryException; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.model.cache.FileEntry; @@ -194,17 +195,17 @@ public class OverlayRestImpl extends BaseRestImpl { AuthenticationToken authenticationToken = userService.getToken(token); Model model = modelService.getLastModelByProjectId(projectId, authenticationToken); if (model == null) { - throw new QueryException("Project with given id doesn't exist"); + throw new ObjectNotFoundException("Project with given id doesn't exist"); } try { Integer id = Integer.valueOf(overlayId); LayoutView layout = layoutService.getLayoutById(model, id, authenticationToken); if (layout == null) { - throw new QueryException("Invalid overlay id"); + throw new ObjectNotFoundException("Overlay doesn't exist"); } layoutService.removeLayout(layout, null); } catch (NumberFormatException e) { - throw new QueryException("Invalid overlay id"); + throw new QueryException("Invalid overlay id: " + overlayId); } return okStatus(); } diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java index 61b2ebdb62..708c0ebd98 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/AllProjectTests.java @@ -5,9 +5,11 @@ import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; import lcsb.mapviewer.api.projects.models.AllModelsTests; +import lcsb.mapviewer.api.projects.overlays.AllOverlaysTests; @RunWith(Suite.class) @SuiteClasses({ AllModelsTests.class, // + AllOverlaysTests.class, // ModelMetaDataTest.class, // ProjectRestImplTest.class }) public class AllProjectTests { diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java new file mode 100644 index 0000000000..7ab3216f8e --- /dev/null +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/AllOverlaysTests.java @@ -0,0 +1,11 @@ +package lcsb.mapviewer.api.projects.overlays; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ OverlayControllerTest.class }) +public class AllOverlaysTests { + +} diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayControllerTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayControllerTest.java new file mode 100644 index 0000000000..53d680c49f --- /dev/null +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayControllerTest.java @@ -0,0 +1,43 @@ +package lcsb.mapviewer.api.projects.overlays; + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import lcsb.mapviewer.api.RestTestFunctions; +import lcsb.mapviewer.services.InvalidTokenException; + +public class OverlayControllerTest extends RestTestFunctions { + OverlayController controller = new OverlayController(); + + @Autowired + OverlayRestImpl overlayRestImp; + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + controller.setOverlayRestImp(overlayRestImp); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testTokenParsing() throws Exception { + String body = "{\"token\":\"" + token + "\"}"; + try { + controller.removeOverlay(body, "p_id", "-1"); + fail("Exception expected"); + } catch (InvalidTokenException e) { + } + } + +} -- GitLab