def setUpMethods(self, port): '''set up all methods representing the port operations. Parameters: port -- Port that defines the operations. ''' assert isinstance(port, WSDLTools.Port), \ 'expecting WSDLTools.Port not: ' %type(port) sd = self._services.get(port.getService().name) assert sd is not None, 'failed to initialize.' binding = port.getBinding() portType = port.getPortType() action_in = '' for bop in binding.operations: try: op = portType.operations[bop.name] except KeyError: raise WsdlGeneratorError( 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, bop.name, binding.name)) for ext in bop.extensions: if isinstance(ext, WSDLTools.SoapOperationBinding): action_in = ext.soapAction break else: warnings.warn('Port(%s) operation(%s) defined in Binding(%s) missing soapAction' \ %(port.name,op.name,binding.name) ) msgin = op.getInputMessage() msgin_name = TextProtect(msgin.name) method_name = self.getMethodName(op.name) m = sd.newMethod() print >> m, '%sdef %s(self, ps, **kw):' % (self.getIndent(level=1), method_name) if msgin is not None: print >> m, '%srequest = ps.Parse(%s.typecode)' % ( self.getIndent(level=2), msgin_name) else: print >> m, '%s# NO input' % self.getIndent(level=2) msgout = op.getOutputMessage() if msgout is not None: msgout_name = TextProtect(msgout.name) print >> m, '%sreturn request,%s()' % (self.getIndent(level=2), msgout_name) else: print >> m, '%s# NO output' % self.getIndent(level=2) print >> m, '%sreturn request,None' % self.getIndent(level=2) print >> m, '' print >> m, '%ssoapAction[\'%s\'] = \'%s\'' % (self.getIndent( level=1), action_in, method_name) print >>m, '%sroot[(%s.typecode.nspname,%s.typecode.pname)] = \'%s\'' \ %(self.getIndent(level=1), msgin_name, msgin_name, method_name) return
def getServiceModuleName(self): '''return module name. ''' name = GetModuleBaseNameFromWSDL(self.wsdl) if not name: raise WsdlGeneratorError('could not determine a service name') if self.server_module_suffix is None: return name return '%s%s' % (name, self.server_module_suffix)
def getAlias(cls, ns): if ns in cls.alias_dict: return cls.alias_dict[ns][1] msg = 'failed to find import for schema "%s"'%ns +\ 'possibly missing @schemaLocation attribute.' if ns in SCHEMA.XSD_LIST: msg = 'missing built-in typecode for schema "%s"' % ns raise WsdlGeneratorError(msg)
def getClientModuleName(self): """client module name. """ name = GetModuleBaseNameFromWSDL(self._wsdl) if not name: raise WsdlGeneratorError('could not determine a service name') if self.client_module_suffix is None: return name return '%s%s' % (name, self.client_module_suffix)
def getTypesModuleName(self): """types module name. """ if self.types_module_name is not None: return self.types_module_name name = GetModuleBaseNameFromWSDL(self._wsdl) if not name: raise WsdlGeneratorError('could not determine a service name') if self.types_module_suffix is None: return name return '%s%s' % (name, self.types_module_suffix)
def fromWSDL(self, wsdl): '''setup the service description from WSDL, should not need to override. ''' assert isinstance(wsdl, WSDLTools.WSDL), 'expecting WSDL instance' if len(wsdl.services) == 0: raise WsdlGeneratorError('No service defined') self.reset() self.wsdl = wsdl self.setUpHeader() self.setUpImports() for service in wsdl.services: sd = self._service_class(service.name) self._services[service.name] = sd for port in service.ports: desc = BindingDescription(wsdl=wsdl) try: desc.setUp(port.getBinding()) except Wsdl2PythonError: continue for soc in desc.operations: if not soc.hasInput(): continue self.messages.append(MessageWriter()) self.messages[-1].setUp(soc, port, input=True) if soc.hasOutput(): self.messages.append(MessageWriter()) self.messages[-1].setUp(soc, port, input=False) for e in port.extensions: if isinstance(e, WSDLTools.SoapAddressBinding): sd.location = e.location self.setUpMethods(port) self.setUpClassDef(service) self.setUpInitDef(service)
def setUp(self, soc, port, input=False): assert isinstance(soc, ServiceOperationContainer),\ 'expecting a ServiceOperationContainer instance' assert isinstance(port, WSDLTools.Port),\ 'expecting a WSDL.Port instance' rpc, literal = soc.isRPC(), soc.isLiteral(input) kw, klass = {}, None if rpc and literal: klass = ServiceRPCLiteralMessageContainer elif not rpc and literal: kw['do_extended'] = self.do_extended klass = ServiceDocumentLiteralMessageContainer elif rpc and not literal: klass = ServiceRPCEncodedMessageContainer else: raise WsdlGeneratorError('doc/enc not supported.') self.content = klass(**kw) self.content.setUp(port, soc, input)
def setUpMethods(self, port): '''set up all methods representing the port operations. Parameters: port -- Port that defines the operations. ''' assert isinstance(port, WSDLTools.Port), \ 'expecting WSDLTools.Port not: ' %type(port) binding = port.getBinding() portType = port.getPortType() service = port.getService() s = self._services[service.name] for bop in binding.operations: try: op = portType.operations[bop.name] except KeyError: raise WsdlGeneratorError( 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, op.name, binding.name)) soap_action = wsaction_in = wsaction_out = None if op.input is not None: wsaction_in = op.getInputAction() if op.output is not None: wsaction_out = op.getOutputAction() for ext in bop.extensions: if isinstance(ext, WSDLTools.SoapOperationBinding) is False: continue soap_action = ext.soapAction if not soap_action: break if wsaction_in is None: break if wsaction_in == soap_action: break if self.strict is False: warnings.warn( 'Port(%s) operation(%s) in Binding(%s) soapAction(%s) != WS-Action(%s)' % (port.name, op.name, binding.name, soap_action, wsaction_in), ) break raise WsdlGeneratorError( 'Port(%s) operation(%s) in Binding(%s) soapAction(%s) MUST match WS-Action(%s)' % (port.name, op.name, binding.name, soap_action, wsaction_in)) method_name = self.getMethodName(op.name) m = s.newMethod() print >> m, '%sdef %s(self, ps, address):' % (self.getIndent( level=1), method_name) msgin_name = msgout_name = None msgin, msgout = op.getInputMessage(), op.getOutputMessage() if msgin is not None: msgin_name = TextProtect(msgin.name) if msgout is not None: msgout_name = TextProtect(msgout.name) indent = self.getIndent(level=2) for l in self.createMethodBody(msgin_name, msgout_name): print >> m, indent + l print >> m, '' print >> m, '%ssoapAction[\'%s\'] = \'%s\'' % (self.getIndent( level=1), wsaction_in, method_name) print >> m, '%swsAction[\'%s\'] = \'%s\'' % (self.getIndent( level=1), method_name, wsaction_out) print >>m, '%sroot[(%s.typecode.nspname,%s.typecode.pname)] = \'%s\'' \ %(self.getIndent(level=1), msgin_name, msgin_name, method_name)