diff --git a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java index 065dcaf105de0ba65adf4371779e51c8f2598697..74acd1edbd649e894601fcf666504bc505e9057f 100644 --- a/src/main/java/eu/hbp/mip/controllers/VariablesApi.java +++ b/src/main/java/eu/hbp/mip/controllers/VariablesApi.java @@ -14,6 +14,7 @@ import org.apache.log4j.Logger; import org.postgresql.util.PGobject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.rowset.SqlRowSet; @@ -33,14 +34,13 @@ public class VariablesApi { private static final Gson gson = new Gson(); - private static LinkedList<String> variables; - @Autowired @Qualifier("metaJdbcTemplate") private JdbcTemplate metaJdbcTemplate; @ApiOperation(value = "Get variables", response = List.class, responseContainer = "List") + @Cacheable("variables") @RequestMapping(method = RequestMethod.GET) public ResponseEntity<Iterable> getVariables( @ApiParam(value = "List of groups formatted like : (\"val1\", \"val2\", ...)") @RequestParam(value = "group", required = false) String group, @@ -52,11 +52,9 @@ public class VariablesApi { ) { LOGGER.info("Get variables"); - loadVariables(); - LinkedList<Object> variablesObjects = new LinkedList<>(); - for (String var : variables) + for (String var : loadVariables()) { variablesObjects.add(gson.fromJson(var, Object.class)); } @@ -65,15 +63,14 @@ public class VariablesApi { } @ApiOperation(value = "Get a variable", response = Object.class) + @Cacheable("variable") @RequestMapping(value = "/{code}", method = RequestMethod.GET) public ResponseEntity<Object> getAVariable( @ApiParam(value = "code of the variable ( multiple codes are allowed, separated by \",\" )", required = true) @PathVariable("code") String code ) { LOGGER.info("Get a variable"); - loadVariables(); - - for (String var : variables) + for (String var : loadVariables()) { JsonObject varObj = gson.fromJson(var, JsonElement.class).getAsJsonObject(); if (varObj.get("code").getAsString().equals(code)) @@ -89,6 +86,7 @@ public class VariablesApi { @ApiOperation(value = "Get values from a variable", response = List.class, responseContainer = "List") + @Cacheable("values") @RequestMapping(value = "/{code}/values", method = RequestMethod.GET) public ResponseEntity<Iterable> getValuesFromAVariable( @ApiParam(value = "code", required = true) @PathVariable("code") String code, @@ -96,9 +94,7 @@ public class VariablesApi { ) { LOGGER.info("Get values from a variable"); - loadVariables(); - - for (String var : variables) + for (String var : loadVariables()) { JsonObject varObj = gson.fromJson(var, JsonElement.class).getAsJsonObject(); if (varObj.get("code").getAsString().equals(code)) @@ -118,6 +114,7 @@ public class VariablesApi { } @ApiOperation(value = "Get groups and variables hierarchy", response = Object.class) + @Cacheable("vars_hierarchy") @RequestMapping(value = "/hierarchy", method = RequestMethod.GET) public ResponseEntity<Object> getVariablesHierarchy( ) { @@ -134,25 +131,24 @@ public class VariablesApi { } - private void loadVariables() { - if(variables == null) - { - String sqlQuery = "SELECT * FROM meta_variables"; - SqlRowSet data = metaJdbcTemplate.queryForRowSet(sqlQuery); - data.next(); - String json = ((PGobject) data.getObject("hierarchy")).getValue(); + private List<String> loadVariables() { + String sqlQuery = "SELECT * FROM meta_variables"; + SqlRowSet data = metaJdbcTemplate.queryForRowSet(sqlQuery); + data.next(); + String json = ((PGobject) data.getObject("hierarchy")).getValue(); - JsonObject root = gson.fromJson(json, JsonObject.class); + JsonObject root = gson.fromJson(json, JsonObject.class); - variables = new LinkedList<>(); - extractVariablesRecursive(root); - } + List<String> variables = new LinkedList<>(); + extractVariablesRecursive(root, variables); + + return variables; } - private void extractVariablesRecursive(JsonObject element) { + private void extractVariablesRecursive(JsonObject element, List<String> variables) { if (element.has("groups")){ for(JsonElement child : element.getAsJsonArray("groups")) { - extractVariablesRecursive(child.getAsJsonObject()); + extractVariablesRecursive(child.getAsJsonObject(), variables); } } if (element.has("variables")){