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'