package gargl.typedefinitions; import java.util.HashSet; import java.util.HashMap; import java.util.Set; import java.util.Map; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import gargl.utilities.JsonUtils; import gargl.utilities.Parameter; public class Function { private String functionName; private Set<Parameter> parameters; private Map<String, String> headers; private String url; private String httpVersion; private Map<String, String> queryString; private String method; private Map<String, String> postData; private Map<String, String> responseFields; public Function(JsonObject jsonRequest) { parameters = new HashSet<Parameter>(); headers = new HashMap<String, String>(); queryString = new HashMap<String, String>(); postData = new HashMap<String, String>(); responseFields = new HashMap<String, String>(); // Set up Request object with all properties from JSON request this.setFunctionName(jsonRequest); this.setRequestMethod(jsonRequest); this.setHeaders(JsonUtils.findElement(jsonRequest, "headers")); this.setUrl(JsonUtils.findElement(jsonRequest, "url")); this.setQueryString(JsonUtils.findElement(jsonRequest, "queryString")); this.setPostData(JsonUtils.findElement(jsonRequest, "postData")); this.setResponseFields(JsonUtils.findElement(jsonRequest, "response")); } private void setResponseFields(JsonElement jsonResponse) { JsonElement responseFields = null; if(jsonResponse != null) responseFields = JsonUtils.findElement(jsonResponse, "fields"); if (responseFields != null) { for (JsonElement responseField : JsonUtils.asJsonArray(responseFields)) { JsonObject response = JsonUtils.asJsonObject(responseField); String name = response.get("name").getAsString(); String cssSelector = response.get("cssSelector").getAsString(); this.addResponseField(name, cssSelector); } } } private void setFunctionName(JsonObject jsonRequest) { JsonElement functionName = jsonRequest.get("functionName"); if (functionName != null) { this.functionName = functionName.getAsString(); } else { System.out.println("ERROR: Request object did not contain function name"); } } private void setHeaders(JsonElement headers) { JsonArray array_headers = JsonUtils.asJsonArray(headers); if (array_headers != null) { for (JsonElement jHeader : array_headers) { JsonObject header = JsonUtils.asJsonObject(jHeader); String name = header.get("name").getAsString(); String value = header.get("value").getAsString(); this.addHeader(name, value); if (Parameter.isParameter(value)) { this.addParameter(new Parameter(value)); } } } } private void setPostData(JsonElement jsonPostData) { JsonArray array_postDataParams = null; if(jsonPostData != null) array_postDataParams = JsonUtils.asJsonArray(jsonPostData); if (array_postDataParams != null) { for (JsonElement postParam : array_postDataParams) { JsonObject param = JsonUtils.asJsonObject(postParam); String name = param.get("name").getAsString(); String value = param.get("value").getAsString(); this.addPostData(name, value); if (Parameter.isParameter(value)) { this.addParameter(new Parameter(value)); } } } else { // Log if postData is empty for POST request (it shouldn't be) if ("POST".equals(this.getMethod())) { System.out.println("WARNING: POST request to " + this.getUrl() + " contains no postData"); } } } private void setQueryString(JsonElement queryStringParams) { JsonArray array_params = JsonUtils.asJsonArray(queryStringParams); if (array_params != null) { for (JsonElement jQueryParam : array_params) { JsonObject queryParam = JsonUtils.asJsonObject(jQueryParam); String name = queryParam.get("name").getAsString(); String value = queryParam.get("value").getAsString(); this.addQueryStringParam(name, value); if (Parameter.isParameter(value)) { this.addParameter(new Parameter(value)); } } } } private void setRequestMethod(JsonObject jsonRequest) { String method = JsonUtils.findElement(jsonRequest, "method").getAsString(); if (method != null) { this.method = method; } else { System.out.println("WARNING: Request did not contain method"); } } private void setUrl(JsonElement jsonRequest) { if (jsonRequest != null) { String url = jsonRequest.getAsString(); String[] urlParts = url.split("@"); for(int i = 0; i < urlParts.length; i ++) { if(i % 2 == 1) this.addParameter( new Parameter("@" + urlParts[i] + "@")); } this.url = url; } } private void addParameter(Parameter param) { parameters.add(param); } private void addResponseField(String name, String cssSelector) { responseFields.put(name, cssSelector); } private void addHeader(String header, String value) { headers.put(header, value); } private void addPostData(String name, String value) { this.postData.put(name, value); } private void addQueryStringParam(String name, String value) { this.queryString.put(name, value); } public Set<Parameter> getParameters() { return parameters; } public Map<String, String> getResponseFields() { return responseFields; } public String getFunctionName() { return functionName; } public Map<String, String> getHeaders() { return headers; } public String getHttpVersion() { return httpVersion; } public String getMethod() { return method; } public Map<String, String> getPostData() { return postData; } public Map<String, String> getQueryString() { return queryString; } public String getUrl() { return url; } public void printHeaders() { System.out.println(headers); } private void removeHeader(String header) { headers.remove(header); } }