예제 #1
0
    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
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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)
예제 #7
0
    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)
예제 #8
0
    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)