Go to the documentation of this file.00001
00002 import socket, json
00003
00004 class OroServerError(Exception):
00005 def __init__(self, value):
00006 self.value = value
00007 def __str__(self):
00008 return repr(self.value)
00009
00010 class Oro(object):
00011 def __init__(self, host, port):
00012
00013 self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
00014
00015
00016 self.s.connect((host, port))
00017 self.server = self.s.makefile()
00018
00019
00020 try:
00021 res = self.call_server(["listSimpleMethods"])
00022 self.rpc_methods = [(t.split('(')[0], len(t.split(','))) for t in res]
00023 except OroServerError:
00024 print('Cannot initialize the oro connector! Smthg wrong with the server!')
00025 self.server.close()
00026 self.s.close()
00027 exit()
00028
00029
00030 for m in self.rpc_methods:
00031 self.add_methods(m)
00032
00033 def __del__(self):
00034 close()
00035
00036 def call_server(self, req):
00037 for r in req:
00038 self.server.write(r)
00039 self.server.write("\n")
00040
00041 self.server.write("#end#\n")
00042 self.server.flush()
00043
00044 status = self.server.readline().rstrip('\n')
00045
00046 if status == 'ok':
00047 raw = self.server.readline().rstrip('\n')
00048 self.server.readline()
00049 if raw == '':
00050 return
00051
00052 res = encode8bits(json.loads(raw))
00053
00054 return res
00055 else:
00056 msg = self.server.readline().rstrip('\n') + ": " + self.server.readline().rstrip('\n')
00057 self.server.readline()
00058 raise OroServerError(msg)
00059
00060 def add_methods(self, m):
00061 def innermethod(*args):
00062 req = ["%s" % m[0]]
00063 for a in args:
00064 req.append(a)
00065 return self.call_server(req)
00066
00067 innermethod.__doc__ = "This method is a proxy for the oro-server %s method." % m[0]
00068 innermethod.__name__ = m[0]
00069 setattr(self,innermethod.__name__,innermethod)
00070
00071 def close(self):
00072 print('Closing the connection to ORO...')
00073 self.server.close()
00074 self.s.close()
00075 print('Done. Bye bye!')
00076
00077
00078 def encode8bits(o):
00079 if isinstance(o, list):
00080 return [encode8bits(o2) for o2 in o]
00081 return o.encode('ascii')
00082
00083
00084 if __name__ == '__main__':
00085
00086 HOST = 'localhost'
00087 PORT = 6969
00088
00089 try:
00090 oro = Oro(HOST, PORT)
00091
00092 oro.add("[johnny rdf:type Human, johnny rdfs:label \"A que Johnny\"]")
00093 oro.add("[hrp2 rdf:type Robot]")
00094 print(oro.lookup("A que Johnny")[0])
00095 print(oro.getSimilarities("johnny", "hrp2"))
00096 print(oro.getDifferences("johnny", "hrp2"))
00097 except OroServerError as ose:
00098 print('Oups! An error occured!')
00099 print(ose)
00100 finally:
00101 oro.close()