From cdf52aecc9612eb8c85aed9af546bc9e96a51c13 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 8 Feb 2018 12:49:14 +0100
Subject: [PATCH] rest API for sbml functions

---
 .../model/map/kinetics/SbmlParameter.java     |  4 +
 .../model/map/kinetics/SbmlUnit.java          |  4 +
 rest-api/jsbml.log                            |  1 -
 .../models/functions/FunctionsRestImpl.java   |  1 +
 .../parameters/ParametersController.java      | 45 +++++++++
 .../models/parameters/ParametersRestImpl.java | 95 +++++++++++++++++++
 .../resources/applicationContext-rest.xml     |  1 +
 7 files changed, 150 insertions(+), 1 deletion(-)
 delete mode 100644 rest-api/jsbml.log
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersController.java
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java

diff --git a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlParameter.java b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlParameter.java
index acd4e885ec..aa27e7764a 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlParameter.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlParameter.java
@@ -115,4 +115,8 @@ public class SbmlParameter implements Serializable, SbmlArgument {
     return getParameterId();
   }
 
+  public int getId() {
+    return id;
+  }
+
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnit.java b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnit.java
index f1a1339c6a..07c8f01aa9 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnit.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnit.java
@@ -121,4 +121,8 @@ public class SbmlUnit implements Serializable {
     return new SbmlUnit(this);
   }
 
+  public int getId() {
+    return id;
+  }
+
 }
diff --git a/rest-api/jsbml.log b/rest-api/jsbml.log
deleted file mode 100644
index 66a05c7b2e..0000000000
--- a/rest-api/jsbml.log
+++ /dev/null
@@ -1 +0,0 @@
-2018-02-08 12:13:41,962 INFO o.r.Reflections [main] Reflections took 57 ms to scan 1 urls, producing 34 keys and 433 values 
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/functions/FunctionsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/functions/FunctionsRestImpl.java
index 94dd0f42d3..975151ba92 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/functions/FunctionsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/functions/FunctionsRestImpl.java
@@ -21,6 +21,7 @@ public class FunctionsRestImpl extends BaseRestImpl {
   /**
    * Default class logger.
    */
+  @SuppressWarnings("unused")
   private Logger logger = Logger.getLogger(FunctionsRestImpl.class);
 
   public Map<String, Object> getFunction(String projectId, String modelId, String token, String functionId)
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersController.java
new file mode 100644
index 0000000000..4316a71f8b
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersController.java
@@ -0,0 +1,45 @@
+package lcsb.mapviewer.api.projects.models.parameters;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.CookieValue;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import lcsb.mapviewer.api.BaseController;
+import lcsb.mapviewer.api.QueryException;
+import lcsb.mapviewer.common.Configuration;
+import lcsb.mapviewer.services.SecurityException;
+
+@RestController
+public class ParametersController extends BaseController {
+  @Autowired
+  private ParametersRestImpl parameterController;
+
+  @RequestMapping(value = "/projects/{projectId}/models/{modelId}/parameters/{parameterId}", method = {
+      RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+  public Map<String, Object> getParameter(//
+      @PathVariable(value = "projectId") String projectId, //
+      @PathVariable(value = "modelId") String modelId, //
+      @PathVariable(value = "parameterId") String parameterId, //
+      @CookieValue(value = Configuration.AUTH_TOKEN) String token //
+  ) throws QueryException, SecurityException {
+    return parameterController.getParameter(projectId, modelId, token, parameterId);
+  }
+
+  @RequestMapping(value = "/projects/{projectId}/models/{modelId}/parameters/", method = {
+      RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+  public List<Map<String, Object>> getParameters(//
+      @PathVariable(value = "projectId") String projectId, //
+      @PathVariable(value = "modelId") String modelId, //
+      @CookieValue(value = Configuration.AUTH_TOKEN) String token //
+  ) throws QueryException, SecurityException {
+    return parameterController.getParameters(projectId, modelId, token);
+  }
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000000..c76f1bed4e
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/parameters/ParametersRestImpl.java
@@ -0,0 +1,95 @@
+package lcsb.mapviewer.api.projects.models.parameters;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.api.ObjectNotFoundException;
+import lcsb.mapviewer.api.QueryException;
+import lcsb.mapviewer.model.map.kinetics.SbmlParameter;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.reaction.Reaction;
+import lcsb.mapviewer.services.SecurityException;
+
+@Transactional(value = "txManager")
+public class ParametersRestImpl extends BaseRestImpl {
+
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private Logger logger = Logger.getLogger(ParametersRestImpl.class);
+
+  public Map<String, Object> getParameter(String projectId, String modelId, String token, String parameterId)
+      throws SecurityException, QueryException {
+    Set<SbmlParameter> globalParameters = getGlobalParametersFromProject(projectId, modelId, token);
+    Set<SbmlParameter> parameters = getParametersFromProject(projectId, modelId, token);
+    int id = Integer.valueOf(parameterId);
+    for (SbmlParameter parameter : parameters) {
+      if (parameter.getId() == id) {
+        return parameterToMap(parameter, globalParameters.contains(parameter));
+      }
+    }
+    throw new ObjectNotFoundException("Parameter with given id doesn't exist");
+  }
+
+  private Set<SbmlParameter> getParametersFromProject(String projectId, String modelId, String token)
+      throws SecurityException {
+    List<Model> models = getModels(projectId, modelId, token);
+    Set<SbmlParameter> parameters = new HashSet<>();
+
+    for (Model model : models) {
+      parameters.addAll(model.getParameters());
+      for (Reaction reaction : model.getReactions()) {
+        if (reaction.getKinetics() != null) {
+          parameters.addAll(reaction.getKinetics().getParameters());
+        }
+      }
+    }
+    return parameters;
+  }
+
+  private Set<SbmlParameter> getGlobalParametersFromProject(String projectId, String modelId, String token)
+      throws SecurityException {
+    List<Model> models = getModels(projectId, modelId, token);
+    Set<SbmlParameter> parameters = new HashSet<>();
+
+    for (Model model : models) {
+      parameters.addAll(model.getParameters());
+    }
+    return parameters;
+  }
+
+  private Map<String, Object> parameterToMap(SbmlParameter parameter, boolean global) {
+    Map<String, Object> result = new HashMap<>();
+    result.put("id", parameter.getId());
+    result.put("parameterId", parameter.getParameterId());
+    result.put("name", parameter.getName());
+    result.put("value", parameter.getValue());
+    result.put("global", global);
+    if (parameter.getUnits() != null) {
+      result.put("unitsId", parameter.getUnits().getId());
+    } else {
+      result.put("unitsId", null);
+    }
+    return result;
+  }
+
+  public List<Map<String, Object>> getParameters(String projectId, String modelId, String token)
+      throws SecurityException {
+    List<Map<String, Object>> result = new ArrayList<>();
+    Set<SbmlParameter> globalParameters = getGlobalParametersFromProject(projectId, modelId, token);
+    Set<SbmlParameter> parameters = getParametersFromProject(projectId, modelId, token);
+    for (SbmlParameter parameter : parameters) {
+      result.add(parameterToMap(parameter, globalParameters.contains(parameter)));
+    }
+    return result;
+  }
+}
diff --git a/rest-api/src/main/resources/applicationContext-rest.xml b/rest-api/src/main/resources/applicationContext-rest.xml
index 460411f87d..8393530a34 100644
--- a/rest-api/src/main/resources/applicationContext-rest.xml
+++ b/rest-api/src/main/resources/applicationContext-rest.xml
@@ -22,6 +22,7 @@
 	<bean id="ChemicalRestImpl" class="lcsb.mapviewer.api.projects.chemicals.ChemicalRestImpl"/>
 	<bean id="ElementsRestImpl" class="lcsb.mapviewer.api.projects.models.bioEntities.elements.ElementsRestImpl"/>
 	<bean id="FunctionsRestImpl" class="lcsb.mapviewer.api.projects.models.functions.FunctionsRestImpl"/>
+	<bean id="ParametersRestImpl" class="lcsb.mapviewer.api.projects.models.parameters.ParametersRestImpl"/>
 	<bean id="DrugRestImpl" class="lcsb.mapviewer.api.projects.drugs.DrugRestImpl"/>
 	<bean id="MiRnaRestImpl" class="lcsb.mapviewer.api.projects.mirnas.MiRnaRestImpl"/>
 	<bean id="OverlayRestImpl" class="lcsb.mapviewer.api.projects.overlays.OverlayRestImpl"/>
-- 
GitLab