EmbASP-Python
spd_desktop_service.py
1 from platforms.desktop.desktop_service import DesktopService
2 from languages.pddl.pddl_input_program import PDDLInputProgram
3 import json
4 import traceback
5 import sys
6 from languages.pddl.pddl_program_type import PDDLProgramType
8 from languages.pddl.pddl_exception import PDDLException
9 
10 
12  """Extension of DesktopService for SPD."""
13 
14  def __init__(self):
15  super(SPDDesktopService, self).__init__("")
16  self.__solver_url_resource_name = "solver.planning.domains"
17  self.__solver_url_path = "/solve"
18 
19  def __create_json(self, pddl_input_program):
20  """Returns a json object representing InputProgram."""
21  problem = ""
22  domain = ""
23 
24  for ip in pddl_input_program:
25  if not isinstance(ip, PDDLInputProgram):
26  continue
27  pip = ip
28  pType = pip.get_programs_type()
29 
30  if pType is PDDLProgramType.DOMAIN:
31  domain += str(pip.get_programs()) + str(pip.get_separator())
32  domain += self.__get_from_file(pip.get_files_paths(),
33  pip.get_separator())
34  elif pType is PDDLProgramType.PROBLEM:
35  problem += str(pip.get_programs()) + str(pip.get_separator())
36  problem += self.__get_from_file(pip.get_files_paths(),
37  pip.get_separator())
38  else:
39  raise ("Program type : " +
40  pip.get_programs_type() + " not valid.")
41 
42  if problem == "":
43  raise "Problem file not specified"
44  if domain == "":
45  raise "Domain file not specified"
46 
47  data = {"problem": problem, "domain": domain}
48 
49  json_data = json.dumps(data)
50 
51  return json_data
52 
53  def __get_from_file(self, files_paths, separator):
54  """Reads files from given paths and returns their content separated
55  by given string separator ."""
56  to_return = ""
57  for s in files_paths:
58  try:
59  to_return += self.__read_file(s)
60  to_return += separator
61  except IOError:
62  traceback.print_exc()
63  return to_return
64 
65  def __post_json_to_url(self, js):
66  """Posts a json string given to SPD solver server and returns result."""
67  try:
68  if sys.version_info < (3, 0):
69  import httplib
70  connection = httplib.HTTPConnection(
72  else:
73  import http.client
74  connection = http.client.HTTPConnection(
76 
77  headers = {'Content-type': 'application/json'}
78 
79  connection.request('POST', self.__solver_url_path, js, headers)
80 
81  response = connection.getresponse()
82 
83  if response.status == 200:
84  result = response.read().decode()
85  else:
86  raise PDDLException("HTTP connection error, response code : " + str(
87  response.status) + " response message : " + str(response.reason))
88  except:
89  raise PDDLException("Impossible to perform HTTP connection")
90  finally:
91  connection.close()
92  return result
93 
94  @staticmethod
95  def __read_file(s):
96  """Reads file from given path and returns its content."""
97  everything = ""
98  with open(s, 'r') as f:
99  try:
100  everything = f.read()
101  finally:
102  f.close()
103  return everything
104 
105  def _get_output(self, output, error):
106  """Returns SPDPlan object from given output and error strings."""
107  return SPDPlan(output, error)
108 
109  def start_sync(self, programs, options):
110  """Return SPDPlan object representing output generated from SPD solver
111  server."""
112  if not programs:
113  return self._get_output("", "PDDLInputProgram not defined")
114  try:
115  return self._get_output(self.__post_json_to_url(
116  str(self.__create_json(programs))), "")
117  except Exception as e:
118  return self._get_output("", "Error: " + str(e))
languages.pddl.pddl_exception.PDDLException
Definition: pddl_exception.py:1
languages.pddl.pddl_exception
Definition: pddl_exception.py:1
platforms.desktop.desktop_service
Definition: desktop_service.py:1
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__post_json_to_url
def __post_json_to_url(self, js)
Definition: spd_desktop_service.py:65
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__read_file
def __read_file(s)
Definition: spd_desktop_service.py:95
specializations.solver_planning_domains.spd_plan.SPDPlan
Definition: spd_plan.py:5
languages.pddl.pddl_input_program
Definition: pddl_input_program.py:1
platforms.desktop.desktop_service.DesktopService
Definition: desktop_service.py:11
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__solver_url_resource_name
__solver_url_resource_name
Definition: spd_desktop_service.py:16
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__get_from_file
def __get_from_file(self, files_paths, separator)
Definition: spd_desktop_service.py:53
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService
Definition: spd_desktop_service.py:11
languages.pddl.pddl_program_type
Definition: pddl_program_type.py:1
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__solver_url_path
__solver_url_path
Definition: spd_desktop_service.py:17
specializations.solver_planning_domains.desktop.spd_desktop_service.SPDDesktopService.__create_json
def __create_json(self, pddl_input_program)
Definition: spd_desktop_service.py:19
specializations.solver_planning_domains.spd_plan
Definition: spd_plan.py:1
platforms.desktop.desktop_service.DesktopService._get_output
def _get_output(self, output, error)
Definition: desktop_service.py:24