00001 import base64 00002 import uuid 00003 00004 """There are several types used by the Bio-SPHERE platform to 00005 model the offered services. Especially the bs_definition and related 00006 classes are very similar in structure to WSDL. 00007 00008 The bs_service_request and bs_service_response classes are used for 00009 making the actual requests and response. They are similar in function 00010 to SOAP.""" 00011 00012 00013 class bs_data_type: 00014 """A class representing a data type in the Bio-SPHERE platform.""" 00015 00016 def __init__(self, name): 00017 self.namename = name 00018 00019 def isBuiltin(self): 00020 """Check whether this type is one builtin types (which are 00021 serialized differently) or a custom type. Returns true if it 00022 is a builtin type. 00023 """ 00024 if self.namename == 'bs_bool': return True 00025 elif self.namename == 'bs_string': return True 00026 elif self.namename == 'bs_byte': return True 00027 elif self.namename == 'bs_double': return True 00028 elif self.namename == 'bs_int16': return True 00029 elif self.namename == 'bs_uint16': return True 00030 elif self.namename == 'bs_int32': return True 00031 elif self.namename == 'bs_uint32': return True 00032 elif self.namename == 'bs_int64': return True 00033 elif self.namename == 'bs_uint64': return True 00034 elif self.namename == 'bs_double': return True 00035 else: return False 00036 00037 def toXML(self): 00038 return ' <type name="%s" />\n' % self.namename 00039 00040 00041 class bs_message_part: 00042 """Class representing a message part.""" 00043 00044 def __init__(self, name, type): 00045 self.namename = name 00046 self.typetype = type 00047 00048 def toXML(self): 00049 return ' <part name="%s" type="%s" />\n' % (self.namename, 00050 self.typetype.name) 00051 00052 00053 class bs_message: 00054 """Class representing a message, consisting of several parts.""" 00055 00056 def __init__(self, name, parts=None): 00057 self.namename = name 00058 if parts == None: self.partsparts = [] 00059 else: self.partsparts = parts 00060 00061 def toXML(self): 00062 return ' <message name="%s">\n' % self.namename + \ 00063 ''.join([part.toXML() for part in self.partsparts]) + \ 00064 ' </message>\n' 00065 00066 00067 class bs_operation: 00068 00069 def __init__(self, name, input=None, 00070 output=None, fault=None): 00071 self.namename = name 00072 self.inputinput = input 00073 self.outputoutput = output 00074 self.faultfault = fault 00075 00076 def toXML(self): 00077 ret = ' <operation name="%s">\n' % self.namename 00078 if self.inputinput != None: 00079 ret = ret + ' <input name="%s" />\n' % self.inputinput.name 00080 if self.outputoutput != None: 00081 ret = ret + ' <output name="%s" />\n' % self.outputoutput.name 00082 if self.faultfault != None: 00083 ret = ret + ' <fault name="%s" />\n' % self.faultfault.name 00084 return ret + ' </operation>\n' 00085 00086 00087 class bs_port_type: 00088 00089 def __init__(self, name, operations=None): 00090 self.namename = name 00091 if operations == None: self.operationsoperations = [] 00092 else: self.operationsoperations = operations 00093 00094 def toXML(self): 00095 return ' <portType name="%s">\n' % self.namename + \ 00096 ''.join([op.toXML() for op in self.operationsoperations]) + \ 00097 ' </portType>\n' 00098 00099 00100 class bs_port: 00101 00102 def __init__(self, name, type): 00103 self.namename = name 00104 self.typetype = type 00105 00106 def toXML(self): 00107 return ' <port name="%s" type="%s" />\n' % (self.namename, 00108 self.typetype.name) 00109 00110 class bs_service: 00111 00112 def __init__(self, name, ports=None): 00113 self.namename = name 00114 if ports == None: self.portsports = [] 00115 else: self.portsports = ports 00116 00117 def toXML(self): 00118 return ' <service name="%s">\n' % self.namename + \ 00119 ''.join([port.toXML() for port in self.portsports]) + \ 00120 ' </service>\n' 00121 00122 00123 class bs_definition: 00124 00125 def __init__(self, name, types=None, messages=None, 00126 porttypes=None, services=None): 00127 self.namename = name 00128 if types == None: self.typestypes = [] 00129 else: self.typestypes = types 00130 if messages == None: self.messagesmessages = [] 00131 else: self.messagesmessages = messages 00132 if porttypes == None: self.porttypesporttypes = [] 00133 else: self.porttypesporttypes = porttypes 00134 if services == None: self.servicesservices = [] 00135 else: self.servicesservices = services 00136 00137 def toXML(self): 00138 return '<definitions name="%s">\n' % self.namename + \ 00139 ''.join([t.toXML() for t in self.typestypes]) + \ 00140 ''.join([m.toXML() for m in self.messagesmessages]) + \ 00141 ''.join([p.toXML() for p in self.porttypesporttypes]) + \ 00142 ''.join([s.toXML() for s in self.servicesservices]) + \ 00143 '</definitions>\n' 00144 00145 00146 class bs_part_instance: 00147 00148 def __init__(self, name, type, data): 00149 self.namename = name 00150 self.typetype = type 00151 self.datadata = data 00152 00153 def toXML(self): 00154 ret = ' <part name="%s" type="%s">' % (self.namename, 00155 self.typetype.name) 00156 if self.typetype.isBuiltin(): 00157 ret = ret + str(self.datadata) 00158 else: 00159 ret = ret + base64.b64encode(self.datadata) 00160 return ret + '</part>\n' 00161 00162 00163 class bs_message_instance: 00164 00165 def __init__(self, name, direction='input', parts=None): 00166 self.namename = name 00167 self.directiondirection = direction 00168 if parts == None: self.partsparts = [] 00169 else: self.partsparts = parts 00170 00171 def toXML(self): 00172 return ' <%s message="%s">\n' % (self.directiondirection, self.namename) + \ 00173 ''.join([p.toXML() for p in self.partsparts]) + \ 00174 ' </%s>\n' % self.directiondirection 00175 00176 00177 class bs_service_request: 00178 00179 def __init__(self, service, port, operation, 00180 input=None, u=None): 00181 self.serviceservice = service 00182 self.portport = port 00183 self.operationoperation = operation 00184 self.inputinput = input 00185 self.uuiduuid = u 00186 if self.uuiduuid == None: 00187 self.uuiduuid = str(uuid.uuid4()) 00188 00189 def toXML(self): 00190 return '<request uuid="%s">\n' % self.uuiduuid + \ 00191 ' <use service="%s" port="%s" operation="%s" />\n' % (self.serviceservice, 00192 self.portport, 00193 self.operationoperation) + \ 00194 self.inputinput.toXML() + \ 00195 '</request>\n' 00196 00197 00198 class bs_service_response: 00199 00200 def __init__(self, service, port, operation, uuid, 00201 output=None, fault=None): 00202 self.serviceservice = service 00203 self.portport = port 00204 self.operationoperation = operation 00205 self.outputoutput = output 00206 self.faultfault = fault 00207 self.uuiduuid = uuid 00208 00209 def toXML(self): 00210 ret = '<response uuid="%s">\n' % self.uuiduuid + \ 00211 ' <used service="%s" port="%s" operation="%s" />\n' % (self.serviceservice, 00212 self.portport, 00213 self.operationoperation) 00214 if self.outputoutput != None: 00215 ret = ret + self.outputoutput.toXML() 00216 if self.faultfault != None: 00217 ret = ret + self.faultfault.toXML() 00218 return ret + '</response>\n'