EmbASP-Java
SPDUtility.java
1 package it.unical.mat.embasp.specializations.solver_planning_domains;
2 
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.OutputStream;
7 import java.net.HttpURLConnection;
8 import java.net.URL;
9 import java.util.List;
10 import it.unical.mat.embasp.base.InputProgram;
11 import it.unical.mat.embasp.languages.pddl.PDDLException;
12 import it.unical.mat.embasp.languages.pddl.PDDLInputProgram;
13 
14 public abstract class SPDUtility {
15 
16  private final String solverUrl = "http://solver.planning.domains/solve";
17 
18  public SPDUtility() {
19  }
20 
21  private static final String escape(final String escapable) {
22  final StringBuilder builder = new StringBuilder();
23 
24  for(int i = 0; i < escapable.length(); i++) {
25  final char character = escapable.charAt(i);
26 
27  switch(character) {
28  case '"': builder.append("\\\""); break;
29  case '\\': builder.append("\\\\"); break;
30  case '\b': builder.append("\\b"); break;
31  case '\f': builder.append("\\f"); break;
32  case '\n': builder.append("\\n"); break;
33  case '\r': builder.append("\\r"); break;
34  case '\t': builder.append("\\t"); break;
35  case '/': builder.append("\\/"); break;
36  default:
37  if(((character >= '\u0000') && (character <= '\u001F')) || ((character >= '\u007F') && (character <= '\u009F')) || ((character >= '\u2000') && (character <= '\u20FF'))) {
38  final String characterHexCode = Integer.toHexString(character);
39 
40  builder.append("\\u");
41 
42  for(int k = 0; k < (4 - characterHexCode.length()); k++)
43  builder.append("0");
44 
45  builder.append(characterHexCode.toUpperCase());
46  } else
47  builder.append(character);
48  }
49  }
50 
51  return builder.toString();
52  }
53 
54  public String createJson(final List<InputProgram> pddlInputProgram) throws PDDLException {
55 
56  String problem = "";
57  String domain = "";
58 
59  for (final InputProgram ip : pddlInputProgram) {
60  if (!(ip instanceof PDDLInputProgram))
61  continue;
62  final PDDLInputProgram pip = (PDDLInputProgram) ip;
63  switch (pip.getProgramsType()) {
64  case DOMAIN:
65  domain += pip.getPrograms() + pip.getSeparator();
66  domain += getFromFile(pip.getFilesPaths(), pip.getSeparator());
67  break;
68  case PROBLEM:
69  problem += pip.getPrograms() + pip.getSeparator();
70  problem += getFromFile(pip.getFilesPaths(), pip.getSeparator());
71  break;
72  default:
73  throw new PDDLException("Program type : " + pip.getProgramsType() + " not valid.");
74  }
75  }
76 
77  if (problem.equals(""))
78  throw new PDDLException("Problem file not specified");
79  if (domain.equals(""))
80  throw new PDDLException("Domain file not specified");
81 
82  return "{\"problem\":\"" + escape(problem) + "\", \"domain\":\"" + escape(domain) + "\"}";
83  }
84 
85  private String getFromFile(final List<String> filesPaths, final String separator) {
86  final StringBuilder toReturn = new StringBuilder();
87  for (final String s : filesPaths)
88  try {
89  toReturn.append(readFile(s)).append(separator);
90  } catch (final IOException e) {
91  e.printStackTrace();
92  }
93  return toReturn.toString();
94  }
95 
96  public String postJsonToURL(final String json) throws PDDLException {
97 
98  String result = "";
99  try {
100  final URL myurl = new URL(solverUrl);
101  final HttpURLConnection con = (HttpURLConnection) myurl.openConnection();
102  con.setDoOutput(true);
103  con.setDoInput(true);
104 
105  con.setRequestProperty("Content-Type", "application/json");
106  // con.setRequestProperty("Accept", "application/json,text/plain");
107  con.setRequestProperty("Method", "POST");
108  final OutputStream os = con.getOutputStream();
109  os.write(json.getBytes("UTF-8"));
110  os.flush();
111  os.close();
112 
113  final StringBuilder sb = new StringBuilder();
114  final int HttpResult = con.getResponseCode();
115  if (HttpResult == HttpURLConnection.HTTP_OK) {
116  final BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
117  String line = null;
118  while ((line = br.readLine()) != null)
119  sb.append(line + "\n");
120  br.close();
121  result = sb.toString();
122  } else
123  throw new PDDLException("HTTP connection error, response code : " + con.getResponseCode() + " response message : " + con.getResponseMessage());
124  } catch (final Exception e) {
125  throw new PDDLException("Impossible to perform HTTP connection: " + e.getMessage());
126  }
127  return result;
128 
129  }
130 
131  protected abstract String readFile(String s) throws IOException;
132 
133 }
it.unical.mat.embasp.base.InputProgram
Definition: InputProgram.java:9
it.unical.mat.embasp.languages.pddl.PDDLInputProgram
Definition: PDDLInputProgram.java:5
it.unical.mat.embasp.base.InputProgram.getPrograms
String getPrograms()
Definition: InputProgram.java:97
it.unical.mat.embasp.specializations.solver_planning_domains.SPDUtility
Definition: SPDUtility.java:14
it.unical.mat.embasp.languages.pddl.PDDLException
Definition: PDDLException.java:3
it.unical.mat.embasp.base.InputProgram.getSeparator
String getSeparator()
Definition: InputProgram.java:106