From 97cccedb73ea50566cd63e97366108cb5c3f100a Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 25 Jul 2019 19:45:45 +0200
Subject: [PATCH] modelId should be numeric

---
 .../main/java/lcsb/mapviewer/api/BaseRestImpl.java  | 10 +++++++---
 .../mapviewer/api/projects/ProjectController.java   |  2 +-
 .../mapviewer/api/projects/ProjectRestImpl.java     |  4 ++--
 .../api/projects/models/ModelController.java        |  5 +++--
 .../api/projects/models/ModelRestImpl.java          | 13 ++++++++-----
 .../models/parameters/ParametersRestImpl.java       |  4 ++--
 .../api/projects/models/units/UnitsRestImpl.java    |  2 +-
 7 files changed, 24 insertions(+), 16 deletions(-)

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 b7be8ff5af..bc9c4366ab 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
@@ -8,6 +8,7 @@ import javax.xml.transform.*;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -160,10 +161,9 @@ public abstract class BaseRestImpl {
    * @param modelId
    *          list of model identifiers separated by "," or '*' when all models
    *          should be returned
-   * @throws ObjectNotFoundException
-   *           thrown when data for given identifiers doesn't exist
+   * @throws QueryException 
    */
-  protected List<Model> getModels(String projectId, String modelId) throws ObjectNotFoundException {
+  protected List<Model> getModels(String projectId, String modelId) throws QueryException {
     Model model = modelService.getLastModelByProjectId(projectId);
     if (model == null) {
       throw new ObjectNotFoundException("Project with given id doesn't exist");
@@ -172,6 +172,10 @@ public abstract class BaseRestImpl {
 
     if (!modelId.equals("*")) {
       for (String str : modelId.split(",")) {
+        if (!StringUtils.isNumeric(str)) {
+          throw new QueryException("Invalid modelId: " + modelId);
+        }
+
         Model submodel = model.getSubmodelById(Integer.valueOf(str));
         if (submodel == null) {
           throw new ObjectNotFoundException("Model with given id doesn't exist");
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
index 02801a3c10..081f60fa2f 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java
@@ -114,7 +114,7 @@ public class ProjectController extends BaseController {
 
   @PreAuthorize("hasAnyAuthority('IS_ADMIN', 'READ_PROJECT:' + #projectId)")
   @GetMapping(value = "/{projectId}/statistics")
-  public Object getStatistics(@PathVariable(value = "projectId") String projectId) throws ObjectNotFoundException {
+  public Object getStatistics(@PathVariable(value = "projectId") String projectId) throws QueryException {
     return projectController.getStatistics(projectId);
   }
 
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index 00139e1e0f..63814e80e0 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -195,7 +195,7 @@ public class ProjectRestImpl extends BaseRestImpl {
     return project.getInputData();
   }
 
-  public Map<String, Object> getStatistics(String projectId) throws ObjectNotFoundException {
+  public Map<String, Object> getStatistics(String projectId) throws QueryException {
     Map<String, Object> result = new TreeMap<>();
 
     Map<MiriamType, Integer> elementAnnotations = new TreeMap<>();
@@ -624,7 +624,7 @@ public class ProjectRestImpl extends BaseRestImpl {
     return null;
   }
 
-  public List<Map<String, Object>> getSubmapConnections(String projectId) throws ObjectNotFoundException {
+  public List<Map<String, Object>> getSubmapConnections(String projectId) throws QueryException {
     List<Map<String, Object>> result = new ArrayList<>();
     List<Model> models = getModels(projectId, "*");
     List<Element> elements = new ArrayList<>();
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
index dabceafea3..de89361e93 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
@@ -37,7 +38,7 @@ public class ModelController extends BaseController {
   @PreAuthorize("hasAnyAuthority('IS_ADMIN', 'READ_PROJECT:' + #projectId)")
   @GetMapping(value = "/")
   public List<Map<String, Object>> getModels(@PathVariable(value = "projectId") String projectId)
-      throws ObjectNotFoundException {
+      throws QueryException {
     return modelController.getModels(projectId);
   }
 
@@ -45,7 +46,7 @@ public class ModelController extends BaseController {
   @GetMapping(value = "/{modelId:.+}")
   public Object getModel(
       @PathVariable(value = "modelId") String modelId,
-      @PathVariable(value = "projectId") String projectId) throws ObjectNotFoundException {
+      @PathVariable(value = "projectId") String projectId) throws QueryException {
     if (modelId.equals("*")) {
       return modelController.getModels(projectId);
     } else {
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
index 15c1affd90..da7ac0174e 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
@@ -1,12 +1,12 @@
 package lcsb.mapviewer.api.projects.models;
 
-import java.awt.*;
+import java.awt.Color;
 import java.awt.geom.*;
 import java.io.*;
 import java.util.*;
-import java.util.List;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,7 +59,7 @@ public class ModelRestImpl extends BaseRestImpl {
     this.layoutService = layoutService;
   }
 
-  public List<Map<String, Object>> getModels(String projectId) throws ObjectNotFoundException {
+  public List<Map<String, Object>> getModels(String projectId) throws QueryException {
     Project project = getProjectService().getProjectByProjectId(projectId);
     if (project == null) {
       throw new ObjectNotFoundException("Project with given id doesn't exist");
@@ -67,7 +67,10 @@ public class ModelRestImpl extends BaseRestImpl {
     return createData(project);
   }
 
-  public Map<String, Object> getModel(String projectId, String modelId) {
+  public Map<String, Object> getModel(String projectId, String modelId) throws QueryException {
+    if (!StringUtils.isNumeric(modelId)) {
+      throw new QueryException("Invalid modelId: " + modelId);
+    }
     Model model = getModelService().getLastModelByProjectId(projectId);
     Model submodel = model.getSubmodelById(modelId);
     if (submodel == null) {
@@ -95,7 +98,7 @@ public class ModelRestImpl extends BaseRestImpl {
     }
   }
 
-  private List<Map<String, Object>> createData(Project project) {
+  private List<Map<String, Object>> createData(Project project) throws QueryException {
     List<Map<String, Object>> result = new ArrayList<>();
     Model model = getModelService().getLastModelByProjectId(project.getProjectId());
     if (model != null) {
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java
index 62ef329cc8..3e2c3fc1ba 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java
@@ -36,7 +36,7 @@ public class ParametersRestImpl extends BaseRestImpl {
   }
 
   private Set<SbmlParameter> getParametersFromProject(String projectId, String modelId)
-      throws ObjectNotFoundException {
+      throws QueryException {
     List<Model> models = getModels(projectId, modelId);
     Set<SbmlParameter> parameters = new LinkedHashSet<>();
 
@@ -52,7 +52,7 @@ public class ParametersRestImpl extends BaseRestImpl {
   }
 
   private Set<SbmlParameter> getGlobalParametersFromProject(String projectId, String modelId)
-      throws ObjectNotFoundException {
+      throws QueryException {
     List<Model> models = getModels(projectId, modelId);
     Set<SbmlParameter> parameters = new LinkedHashSet<>();
 
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java
index b276f87957..692ba97912 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java
@@ -59,7 +59,7 @@ public class UnitsRestImpl extends BaseRestImpl {
     return result;
   }
 
-  public List<Map<String, Object>> getUnits(String projectId, String modelId) throws ObjectNotFoundException {
+  public List<Map<String, Object>> getUnits(String projectId, String modelId) throws QueryException {
     List<Map<String, Object>> result = new ArrayList<>();
     List<Model> models = getModels(projectId, modelId);
     for (Model model : models) {
-- 
GitLab