From 76e497fd5404d86d61864f826571f392d96c4431 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 8 Feb 2018 12:59:00 +0100
Subject: [PATCH] rest API for units

---
 .../map/kinetics/SbmlUnitTypeFactor.java      |  4 +
 .../models/units/UnitsController.java         | 45 +++++++++++
 .../projects/models/units/UnitsRestImpl.java  | 75 +++++++++++++++++++
 .../resources/applicationContext-rest.xml     |  1 +
 4 files changed, 125 insertions(+)
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsController.java
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java

diff --git a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnitTypeFactor.java b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnitTypeFactor.java
index b718204ce9..f1d6f1975b 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnitTypeFactor.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/kinetics/SbmlUnitTypeFactor.java
@@ -124,4 +124,8 @@ public class SbmlUnitTypeFactor implements Serializable {
     return new SbmlUnitTypeFactor(this);
   }
 
+  public int getId() {
+    return id;
+  }
+
 }
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsController.java
new file mode 100644
index 0000000000..c55f3b092c
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsController.java
@@ -0,0 +1,45 @@
+package lcsb.mapviewer.api.projects.models.units;
+
+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 UnitsController extends BaseController {
+  @Autowired
+  private UnitsRestImpl unitController;
+
+  @RequestMapping(value = "/projects/{projectId}/models/{modelId}/units/{unitId}", method = {
+      RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+  public Map<String, Object> getUnit(//
+      @PathVariable(value = "projectId") String projectId, //
+      @PathVariable(value = "modelId") String modelId, //
+      @PathVariable(value = "unitId") String unitId, //
+      @CookieValue(value = Configuration.AUTH_TOKEN) String token //
+  ) throws QueryException, SecurityException {
+    return unitController.getUnit(projectId, modelId, token, unitId);
+  }
+
+  @RequestMapping(value = "/projects/{projectId}/models/{modelId}/units/", method = {
+      RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+  public List<Map<String, Object>> getUnits(//
+      @PathVariable(value = "projectId") String projectId, //
+      @PathVariable(value = "modelId") String modelId, //
+      @CookieValue(value = Configuration.AUTH_TOKEN) String token //
+  ) throws QueryException, SecurityException {
+    return unitController.getUnits(projectId, modelId, token);
+  }
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000000..887b551fbe
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/units/UnitsRestImpl.java
@@ -0,0 +1,75 @@
+package lcsb.mapviewer.api.projects.models.units;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.SbmlUnit;
+import lcsb.mapviewer.model.map.kinetics.SbmlUnitTypeFactor;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.services.SecurityException;
+
+@Transactional(value = "txManager")
+public class UnitsRestImpl extends BaseRestImpl {
+
+  /**
+   * Default class logger.
+   */
+  @SuppressWarnings("unused")
+  private Logger logger = Logger.getLogger(UnitsRestImpl.class);
+
+  public Map<String, Object> getUnit(String projectId, String modelId, String token, String unitId)
+      throws SecurityException, QueryException {
+    List<Model> models = getModels(projectId, modelId, token);
+    int id = Integer.valueOf(unitId);
+    for (Model model : models) {
+      for (SbmlUnit unit : model.getUnits()) {
+        if (unit.getId() == id) {
+          return unitToMap(unit);
+        }
+      }
+    }
+    throw new ObjectNotFoundException("Unit with given id doesn't exist");
+  }
+
+  private Map<String, Object> unitToMap(SbmlUnit unit) {
+    Map<String, Object> result = new HashMap<>();
+    result.put("id", unit.getId());
+    result.put("unitId", unit.getUnitId());
+    result.put("name", unit.getName());
+    List<Map<String, Object>> factors = new ArrayList<>();
+    for (SbmlUnitTypeFactor factor : unit.getUnitTypeFactors()) {
+      factors.add(factorToMap(factor));
+    }
+    result.put("unitTypeFactors", factors);
+    return result;
+  }
+
+  private Map<String, Object> factorToMap(SbmlUnitTypeFactor factor) {
+    Map<String, Object> result =  new HashMap<>();
+    result.put("id", factor.getId());
+    result.put("exponent", factor.getExponent());
+    result.put("multiplier", factor.getMultiplier());
+    result.put("scale", factor.getScale());
+    result.put("unitType", factor.getUnitType());
+    return result;
+  }
+
+  public List<Map<String, Object>> getUnits(String projectId, String modelId, String token) throws SecurityException {
+    List<Map<String, Object>> result = new ArrayList<>();
+    List<Model> models = getModels(projectId, modelId, token);
+    for (Model model : models) {
+      for (SbmlUnit unit : model.getUnits()) {
+        result.add(unitToMap(unit));
+      }
+    }
+    return result;
+  }
+}
diff --git a/rest-api/src/main/resources/applicationContext-rest.xml b/rest-api/src/main/resources/applicationContext-rest.xml
index 8393530a34..fac20694fa 100644
--- a/rest-api/src/main/resources/applicationContext-rest.xml
+++ b/rest-api/src/main/resources/applicationContext-rest.xml
@@ -23,6 +23,7 @@
 	<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="UnitsRestImpl" class="lcsb.mapviewer.api.projects.models.units.UnitsRestImpl"/>
 	<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