package gargl.generators;
import gargl.typedefinitions.Function;
import gargl.utilities.Parameter;
import java.util.Map;
import java.util.Map.Entry;
public class JavaClassGenerator extends Generator {
private static String JAVA_CLASS_FORMAT = "import java.io.BufferedReader;\n" +
"import java.io.DataOutputStream;\n" +
"import java.io.InputStreamReader;\n" +
"import java.net.HttpURLConnection;\n" +
"import java.io.InputStream;\n" +
"import java.util.zip.GZIPInputStream;\n" +
"import java.net.URL;\n\n" +
"public class %1$s \n{\n %2$s \n}";
private static String JAVA_METHOD_FORMAT = "public String %1$s throws Exception \n{\n %2$s \n}\n\n";
private static String JAVA_METHOD_SIGNATURE = "%1$s (%2$s)";
private static String JAVA_HEADER_FORMAT = "con.setRequestProperty(%1$s);\n";
private static String JAVA_HTTP_CONNECTION_FORMAT = "String url = %1$s;\n"
+ "URL obj = new URL(url);\n"
+ "HttpURLConnection con = (HttpURLConnection) obj.openConnection();\n\n"
+ "%2$s\n" +
"int responseCode = con.getResponseCode();\n"
+ "System.out.println(\"Sending 'GET' request to URL : \" + url);\n"
+ "System.out.println(\"Response Code : \" + responseCode);\n\n" +
"InputStream input = con.getInputStream()\n;" +
"if (\"gzip\".equals(con.getContentEncoding())) {\n" +
"input = new GZIPInputStream(input);\n" +
"}\n\n"+
"BufferedReader in = new BufferedReader(new InputStreamReader(input));\n"
+ "String inputLine;\n" + "StringBuffer response = new StringBuffer();\n\n" +
"while ((inputLine = in.readLine()) != null) {" + " response.append(inputLine);\n"
+ "}\n\n" +
"in.close();\n" + "System.out.println(response.toString());\n"
+ "return response.toString();";
private static String JAVA_POST_REQUEST_FORMAT = "String postData = \"%1$s\";\n"
+ "con.setDoOutput(true);\n\n"
+ "DataOutputStream wr = new DataOutputStream(con.getOutputStream());\n"
+ "wr.writeBytes(postData);\n" + "wr.flush();\n" + "wr.close();\n";
public String generateFunction(Function function) {
// Generate method signature using all necessary parameters
String methodSignature = generateMethodSignature(function);
// Generate strings for setting request method and headers
String methodAndHeaders = generateMethodAndHeaders(function);
// Generate querystring by appending url params and applying
// formatting
String queryString = generateQueryString(function);
// Surround request.getUrl() with quotes if it is a parameter, and
// do nothing if it is a parameter name
String url = Parameter.processParameter(function.getUrl(), function) + " + \"?" + queryString
+ "\"";
// Handle specifics for each type of request
if ("POST".equals(function.getMethod())) {
String postDataString = generatePostDataString(function.getPostData());
methodAndHeaders += String.format(JAVA_POST_REQUEST_FORMAT, postDataString);
} else if ("GET".equals(function.getMethod())) {
// Currently there is no special behavior for GET requests
}
// Insert connection specific properties into connection format
// string
String fullMethodBody = String.format(JAVA_HTTP_CONNECTION_FORMAT, url,
methodAndHeaders);
// Insert full method body in method format string
return String.format(JAVA_METHOD_FORMAT, methodSignature, fullMethodBody);
}
@Override
public void generateClass(String outputLocation) {
StringBuilder methodsSB = new StringBuilder();
for (Function request : this.module.functions) {
methodsSB.append(generateFunction(request));
System.out.println("LOG: Function " + request.getFunctionName() + " created");
}
String filename = this.module.name;
if(this.module.name == null || this.module.name.isEmpty()){
filename = "gargl_output";
System.out.println("WARNING: No module name given, filename defaulting to " + filename);
}
// File name is currently forced to be the same as module name
writeFile(outputLocation + filename + ".java",
String.format(JAVA_CLASS_FORMAT, filename, methodsSB.toString()));
}
private String generateMethodAndHeaders(Function function) {
StringBuilder sb = new StringBuilder();
// Set request method
sb.append("con.setRequestMethod(\"" + function.getMethod() + "\");\n\n");
// Set request headers
sb.append(generateHeaders(function) + "\n");
return sb.toString();
}
private String generateHeaders(Function function) {
StringBuilder sb = new StringBuilder();
for (Entry<String, String> header : function.getHeaders().entrySet()) {
StringBuilder headerSB = new StringBuilder("\"" + header.getKey() + "\", ");
headerSB.append(Parameter.processParameter(header.getValue(), function));
// Adding 'con.setRequestProperty(header, value) to overall
// StringBuilder
sb.append(String.format(JAVA_HEADER_FORMAT, headerSB.toString()));
}
return sb.toString();
}
String generateMethodSignature(Function function) {
StringBuilder sb = new StringBuilder();
if (function.getParameters().size() > 0) {
for (Parameter param : function.getParameters()) {
sb.append("String " + param.getParameterName() + ",");
}
sb.deleteCharAt(sb.length() - 1);
}
return String.format(JAVA_METHOD_SIGNATURE, function.getFunctionName(), sb.toString());
}
private String generatePostDataString(Map<String, String> postData) {
StringBuilder sb = new StringBuilder();
if (postData != null) {
for (Entry<String, String> param : postData.entrySet()) {
if (Parameter.isParameter(param.getValue())) {
String paramName = Parameter.parameterDecode(param.getValue());
sb.append(param.getKey() + "=\" + " + paramName + " + \"&");
} else {
sb.append(param.getKey() + "=" + param.getValue() + "&");
}
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
} else {
System.out.println("POST request generated without postData");
}
return sb.toString();
}
private String generateQueryString(Function function) {
StringBuilder sb = new StringBuilder();
for (Entry<String, String> param : function.getQueryString().entrySet()) {
if (Parameter.isParameter(param.getValue())) {
String paramName = Parameter.parameterDecode(param.getValue());
sb.append(param.getKey() + "=\" + " + paramName + " + \"&");
} else {
sb.append(param.getKey() + "=" + param.getValue() + "&");
}
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
}