diff --git a/src/main/java/org/gcube/informationsystem/queries/templates/impl/entities/QueryTemplateImpl.java b/src/main/java/org/gcube/informationsystem/queries/templates/impl/entities/QueryTemplateImpl.java index f90b528..9ac9461 100644 --- a/src/main/java/org/gcube/informationsystem/queries/templates/impl/entities/QueryTemplateImpl.java +++ b/src/main/java/org/gcube/informationsystem/queries/templates/impl/entities/QueryTemplateImpl.java @@ -2,12 +2,15 @@ package org.gcube.informationsystem.queries.templates.impl.entities; import java.io.IOException; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName; import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; import org.gcube.com.fasterxml.jackson.databind.JsonNode; import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; +import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; +import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.informationsystem.base.impl.entities.EntityElementImpl; import org.gcube.informationsystem.queries.templates.reference.entities.QueryTemplate; import org.gcube.informationsystem.queries.templates.reference.properties.TemplateVariable; @@ -29,8 +32,10 @@ public class QueryTemplateImpl extends EntityElementImpl implements QueryTemplat protected ObjectMapper objectMapper; protected JsonNode template; + protected Map templateVariables; - + protected JsonNode params; + public QueryTemplateImpl() { this.templateVariables = new HashMap<>(); this.objectMapper = new ObjectMapper(); @@ -87,4 +92,59 @@ public class QueryTemplateImpl extends EntityElementImpl implements QueryTemplat this.templateVariables.put(name, templateVariable); } + @Override + public JsonNode getJsonQuery() throws Exception { + ObjectNode objectNode = objectMapper.createObjectNode(); + for(TemplateVariable tv : templateVariables.values()) { + objectNode.put(tv.getName(), tv.getDefaultValue()); + } + return getJsonQuery(objectNode); + } + + protected JsonNode replaceVariables(JsonNode jsonNode) throws Exception { + Iterator fieldNames = jsonNode.fieldNames(); + while(fieldNames.hasNext()) { + String fieldName = fieldNames.next(); + JsonNode node = jsonNode.get(fieldName); + switch (node.getNodeType()) { + case OBJECT: + node = replaceVariables(node); + ((ObjectNode) jsonNode).set(fieldName, node); + break; + + case ARRAY: + ArrayNode arrayNode = (ArrayNode) node; + for(int i = 0; i < arrayNode.size(); i++) { + JsonNode arrayElement = arrayNode.get(i); + arrayElement = replaceVariables(arrayElement); + arrayNode.set(i, arrayElement); + } + break; + + case STRING: + String value = node.asText(); + if(templateVariables.containsKey(value)) { + JsonNode jn = params.get(value); + if(jn == null) { + throw new Exception("No value provided for " + value + " variables"); + } + ((ObjectNode) jsonNode).set(fieldName, jn); + } + break; + + default: + break; + } + } + return jsonNode; + } + + @Override + public JsonNode getJsonQuery(JsonNode values) throws Exception { + this.params = values; + JsonNode query = template.deepCopy(); + query = replaceVariables(query); + return query; + } + } diff --git a/src/main/java/org/gcube/informationsystem/queries/templates/reference/entities/QueryTemplate.java b/src/main/java/org/gcube/informationsystem/queries/templates/reference/entities/QueryTemplate.java index 3fd78fe..64235b2 100644 --- a/src/main/java/org/gcube/informationsystem/queries/templates/reference/entities/QueryTemplate.java +++ b/src/main/java/org/gcube/informationsystem/queries/templates/reference/entities/QueryTemplate.java @@ -69,4 +69,17 @@ public interface QueryTemplate extends EntityElement { */ public void addTemplateVariable(TemplateVariable templateVariable); -} + /** + * @return the JsonQuery replacing the variables using the default values contained in TemplateVariables + * @throws Exception + */ + public JsonNode getJsonQuery() throws Exception; + + /** + * @param values + * @return the JsonQuery replacing the variables using the provided values + * @throws Exception + */ + public JsonNode getJsonQuery(JsonNode values) throws Exception; + +} \ No newline at end of file