home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / ZSI / generate / wsdl2dispatch.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  12.9 KB  |  367 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import inspect
  5. from cStringIO import StringIO
  6. import ZSI
  7. import string
  8. import sys
  9. import getopt
  10. import urlparse
  11. import types
  12. import warnings
  13. from ZSI.wstools import WSDLTools
  14. from ZSI.ServiceContainer import ServiceSOAPBinding, SimpleWSResource, WSAResource
  15. from ZSI.generate import WsdlGeneratorError, Wsdl2PythonError
  16. from utility import TextProtect, GetModuleBaseNameFromWSDL, NCName_to_ClassName, GetPartsSubNames, TextProtectAttributeName
  17. from containers import BindingDescription
  18. from wsdl2python import MessageWriter, WriteServiceModule, MessageTypecodeContainer, SchemaDescription
  19.  
  20. rsplit = lambda x, sep: (x[:x.rfind(sep)], x[x.rfind(sep) + 1:])
  21. if sys.version_info[0:2] == (2, 4, 0, 'final', 0)[0:2]:
  22.     
  23.     rsplit = lambda x, sep: x.rsplit(sep, 1)
  24.  
  25.  
  26. class SOAPService:
  27.     
  28.     def __init__(self, service):
  29.         self.classdef = StringIO()
  30.         self.initdef = StringIO()
  31.         self.location = ''
  32.         self.methods = []
  33.  
  34.     
  35.     def newMethod(self):
  36.         self.methods.append(StringIO())
  37.         return self.methods[-1]
  38.  
  39.  
  40.  
  41. class ServiceModuleWriter:
  42.     indent = '    '
  43.     server_module_suffix = '_server'
  44.     func_aname = TextProtectAttributeName
  45.     func_aname = staticmethod(func_aname)
  46.     separate_messages = False
  47.     
  48.     def __init__(self, base = ServiceSOAPBinding, prefix = 'soap', service_class = SOAPService):
  49.         if inspect.isclass(base):
  50.             self.base_class_name = base.__name__
  51.             self.base_module_name = inspect.getmodule(base).__name__
  52.         else:
  53.             (self.base_module_name, self.base_class_name) = base.rsplit('.', 1)
  54.         self.wsdl = None
  55.         self.method_prefix = prefix
  56.         self._service_class = SOAPService
  57.         self.header = None
  58.         self.imports = None
  59.         self.messages = []
  60.         self._services = None
  61.         self.types_module_path = None
  62.         self.types_module_name = None
  63.         self.messages_module_name = None
  64.  
  65.     
  66.     def reset(self):
  67.         self.header = StringIO()
  68.         self.imports = StringIO()
  69.         self.message = []
  70.         self._services = { }
  71.  
  72.     
  73.     def getIndent(self, level = 1):
  74.         return self.indent * level
  75.  
  76.     
  77.     def getMethodName(self, method):
  78.         return '%s_%s' % (self.method_prefix, TextProtect(method))
  79.  
  80.     
  81.     def getClassName(self, name):
  82.         return NCName_to_ClassName(name)
  83.  
  84.     
  85.     def setTypesModuleName(self, name):
  86.         self.types_module_name = name
  87.  
  88.     setClientModuleName = setTypesModuleName
  89.     
  90.     def getTypesModuleName(self):
  91.         if self.types_module_name is not None:
  92.             return self.types_module_name
  93.         wsm = WriteServiceModule(self.wsdl)
  94.         return wsm.getTypesModuleName()
  95.  
  96.     
  97.     def getServiceModuleName(self):
  98.         name = GetModuleBaseNameFromWSDL(self.wsdl)
  99.         if not name:
  100.             raise WsdlGeneratorError, 'could not determine a service name'
  101.         name
  102.         if self.server_module_suffix is None:
  103.             return name
  104.         return '%s%s' % (name, self.server_module_suffix)
  105.  
  106.     
  107.     def getTypesModulePath(self):
  108.         return self.types_module_path
  109.  
  110.     getClientModulePath = getTypesModulePath
  111.     
  112.     def setTypesModulePath(self, path):
  113.         self.types_module_path = path
  114.  
  115.     setClientModulePath = setTypesModulePath
  116.     
  117.     def setUpClassDef(self, service):
  118.         s = self._services[service.name].classdef
  119.         print >>s, 'class %s(%s):' % (self.getClassName(service.name), self.base_class_name)
  120.         print >>s, '%ssoapAction = {}' % self.getIndent(level = 1)
  121.         print >>s, '%sroot = {}' % self.getIndent(level = 1)
  122.  
  123.     
  124.     def setUpImports(self):
  125.         i = self.imports
  126.         print >>i, 'from ZSI.schema import GED, GTD'
  127.         print >>i, 'from ZSI.TCcompound import ComplexType, Struct'
  128.         module = self.getTypesModuleName()
  129.         package = self.getTypesModulePath()
  130.         if package:
  131.             module = '%s.%s' % (package, module)
  132.         
  133.         print >>i, 'from %s import *' % module
  134.         print >>i, 'from %s import %s' % (self.base_module_name, self.base_class_name)
  135.  
  136.     
  137.     def setUpInitDef(self, service):
  138.         sd = self._services[service.name]
  139.         d = sd.initdef
  140.         if sd.location is not None:
  141.             (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(sd.location)
  142.             print >>d, "%sdef __init__(self, post='%s', **kw):" % (self.getIndent(level = 1), path)
  143.         else:
  144.             print >>d, '%sdef __init__(self, post, **kw):' % self.getIndent(level = 1)
  145.         if self.base_module_name == inspect.getmodule(ServiceSOAPBinding).__name__:
  146.             print >>d, '%s%s.__init__(self, post)' % (self.getIndent(level = 2), self.base_class_name)
  147.             return None
  148.         print >>d, '%s%s.__init__(self)' % (self.getIndent(level = 2), self.base_class_name)
  149.  
  150.     
  151.     def mangle(self, name):
  152.         return TextProtect(name)
  153.  
  154.     
  155.     def getAttributeName(self, name):
  156.         return self.func_aname(name)
  157.  
  158.     
  159.     def setUpMethods(self, port):
  160.         sd = self._services.get(port.getService().name)
  161.         binding = port.getBinding()
  162.         portType = port.getPortType()
  163.         action_in = ''
  164.         for bop in binding.operations:
  165.             
  166.             try:
  167.                 op = portType.operations[bop.name]
  168.             except KeyError:
  169.                 ex = None
  170.                 raise WsdlGeneratorError, 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, bop.name, binding.name)
  171.  
  172.             for ext in bop.extensions:
  173.                 if isinstance(ext, WSDLTools.SoapOperationBinding):
  174.                     action_in = ext.soapAction
  175.                     break
  176.                     continue
  177.             
  178.             msgin = op.getInputMessage()
  179.             msgin_name = TextProtect(msgin.name)
  180.             method_name = self.getMethodName(op.name)
  181.             m = sd.newMethod()
  182.             print >>m, '%sdef %s(self, ps, **kw):' % (self.getIndent(level = 1), method_name)
  183.             if msgin is not None:
  184.                 print >>m, '%srequest = ps.Parse(%s.typecode)' % (self.getIndent(level = 2), msgin_name)
  185.             else:
  186.                 print >>m, '%s# NO input' % self.getIndent(level = 2)
  187.             msgout = op.getOutputMessage()
  188.             if msgout is not None:
  189.                 msgout_name = TextProtect(msgout.name)
  190.                 print >>m, '%sreturn request,%s()' % (self.getIndent(level = 2), msgout_name)
  191.             else:
  192.                 print >>m, '%s# NO output' % self.getIndent(level = 2)
  193.                 print >>m, '%sreturn request,None' % self.getIndent(level = 2)
  194.             print >>m, ''
  195.             print >>m, "%ssoapAction['%s'] = '%s'" % (self.getIndent(level = 1), action_in, method_name)
  196.             print >>m, "%sroot[(%s.typecode.nspname,%s.typecode.pname)] = '%s'" % (self.getIndent(level = 1), msgin_name, msgin_name, method_name)
  197.         
  198.  
  199.     
  200.     def setUpHeader(self):
  201.         print >>self.header, '#' * 50
  202.         print >>self.header, '# file: %s.py' % self.getServiceModuleName()
  203.         print >>self.header, '#'
  204.         print >>self.header, '# skeleton generated by "%s"' % self.__class__
  205.         print >>self.header, '#      %s' % ' '.join(sys.argv)
  206.         print >>self.header, '#'
  207.         print >>self.header, '#' * 50
  208.  
  209.     
  210.     def write(self, fd = sys.stdout):
  211.         print >>fd, self.header.getvalue()
  212.         print >>fd, self.imports.getvalue()
  213.         print >>fd, '# Messages ',
  214.         for m in self.messages:
  215.             print >>fd, m
  216.         
  217.         print >>fd, ''
  218.         print >>fd, ''
  219.         print >>fd, '# Service Skeletons'
  220.         for k, v in self._services.items():
  221.             print >>fd, v.classdef.getvalue()
  222.             print >>fd, v.initdef.getvalue()
  223.             for s in v.methods:
  224.                 print >>fd, s.getvalue()
  225.             
  226.         
  227.  
  228.     
  229.     def fromWSDL(self, wsdl):
  230.         if len(wsdl.services) == 0:
  231.             raise WsdlGeneratorError, 'No service defined'
  232.         len(wsdl.services) == 0
  233.         self.reset()
  234.         self.wsdl = wsdl
  235.         self.setUpHeader()
  236.         self.setUpImports()
  237.         for service in wsdl.services:
  238.             sd = self._service_class(service.name)
  239.             self._services[service.name] = sd
  240.             for port in service.ports:
  241.                 desc = BindingDescription(wsdl = wsdl)
  242.                 
  243.                 try:
  244.                     desc.setUp(port.getBinding())
  245.                 except Wsdl2PythonError:
  246.                     ex = None
  247.                     continue
  248.  
  249.                 for soc in desc.operations:
  250.                     if not soc.hasInput():
  251.                         continue
  252.                     
  253.                     self.messages.append(MessageWriter())
  254.                     self.messages[-1].setUp(soc, port, input = True)
  255.                     if soc.hasOutput():
  256.                         self.messages.append(MessageWriter())
  257.                         self.messages[-1].setUp(soc, port, input = False)
  258.                         continue
  259.                 
  260.                 for e in port.extensions:
  261.                     if isinstance(e, WSDLTools.SoapAddressBinding):
  262.                         sd.location = e.location
  263.                         continue
  264.                 
  265.                 self.setUpMethods(port)
  266.             
  267.             self.setUpClassDef(service)
  268.             self.setUpInitDef(service)
  269.         
  270.  
  271.  
  272.  
  273. class WSAServiceModuleWriter(ServiceModuleWriter):
  274.     
  275.     def __init__(self, base = WSAResource, prefix = 'wsa', service_class = SOAPService, strict = True):
  276.         ServiceModuleWriter.__init__(self, base, prefix, service_class)
  277.         self.strict = strict
  278.  
  279.     
  280.     def createMethodBody(msgInName, msgOutName, **kw):
  281.         body = []
  282.         if msgInName is not None:
  283.             body.append('request = ps.Parse(%s.typecode)' % msgInName)
  284.         
  285.         if msgOutName is not None:
  286.             body.append('return request,%s()' % msgOutName)
  287.         else:
  288.             body.append('return request,None')
  289.         return tuple(body)
  290.  
  291.     createMethodBody = staticmethod(createMethodBody)
  292.     
  293.     def setUpClassDef(self, service):
  294.         s = self._services[service.name].classdef
  295.         print >>s, 'class %s(%s):' % (self.getClassName(service.name), self.base_class_name)
  296.         print >>s, '%ssoapAction = {}' % self.getIndent(level = 1)
  297.         print >>s, '%swsAction = {}' % self.getIndent(level = 1)
  298.         print >>s, '%sroot = {}' % self.getIndent(level = 1)
  299.  
  300.     
  301.     def setUpMethods(self, port):
  302.         binding = port.getBinding()
  303.         portType = port.getPortType()
  304.         service = port.getService()
  305.         s = self._services[service.name]
  306.         for bop in binding.operations:
  307.             
  308.             try:
  309.                 op = portType.operations[bop.name]
  310.             except KeyError:
  311.                 ex = None
  312.                 raise WsdlGeneratorError, 'Port(%s) PortType(%s) missing operation(%s) defined in Binding(%s)' % (port.name, portType.name, op.name, binding.name)
  313.  
  314.             soap_action = None
  315.             wsaction_in = None
  316.             wsaction_out = None
  317.             if op.input is not None:
  318.                 wsaction_in = op.getInputAction()
  319.             
  320.             if op.output is not None:
  321.                 wsaction_out = op.getOutputAction()
  322.             
  323.             for ext in bop.extensions:
  324.                 if isinstance(ext, WSDLTools.SoapOperationBinding) is False:
  325.                     continue
  326.                 
  327.                 soap_action = ext.soapAction
  328.                 if not soap_action:
  329.                     break
  330.                 
  331.                 if wsaction_in is None:
  332.                     break
  333.                 
  334.                 if wsaction_in == soap_action:
  335.                     break
  336.                 
  337.                 if self.strict is False:
  338.                     warnings.warn('Port(%s) operation(%s) in Binding(%s) soapAction(%s) != WS-Action(%s)' % (port.name, op.name, binding.name, soap_action, wsaction_in))
  339.                     break
  340.                 
  341.                 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)
  342.             
  343.             method_name = self.getMethodName(op.name)
  344.             m = s.newMethod()
  345.             print >>m, '%sdef %s(self, ps, address):' % (self.getIndent(level = 1), method_name)
  346.             msgin_name = None
  347.             msgout_name = None
  348.             msgin = op.getInputMessage()
  349.             msgout = op.getOutputMessage()
  350.             if msgin is not None:
  351.                 msgin_name = TextProtect(msgin.name)
  352.             
  353.             if msgout is not None:
  354.                 msgout_name = TextProtect(msgout.name)
  355.             
  356.             indent = self.getIndent(level = 2)
  357.             for l in self.createMethodBody(msgin_name, msgout_name):
  358.                 print >>m, indent + l
  359.             
  360.             print >>m, ''
  361.             print >>m, "%ssoapAction['%s'] = '%s'" % (self.getIndent(level = 1), wsaction_in, method_name)
  362.             print >>m, "%swsAction['%s'] = '%s'" % (self.getIndent(level = 1), method_name, wsaction_out)
  363.             print >>m, "%sroot[(%s.typecode.nspname,%s.typecode.pname)] = '%s'" % (self.getIndent(level = 1), msgin_name, msgin_name, method_name)
  364.         
  365.  
  366.  
  367.