############################################################################ # Monte M. Goode, LBNL # See LBNLCopyright for copyright notice! ########################################################################### # utility classes used by new generator - mostly 'sugar' classes # that are actually imported by the generated code. also includes # utilities used by wsdl2python itself. # $Id: utility.py 1226 2006-05-26 18:11:19Z boverhof $ import re from ZSI import EvaluateException from ZSI.TCcompound import Struct from ZSI.generate import WsdlGeneratorError, Wsdl2PythonError from ZSI.wstools.Utility import SplitQName from ZSI.wstools.Namespaces import SCHEMA NCName_to_ModuleName = lambda name: re.sub('\.', '_', TextProtect(name)) NCName_to_ClassName = lambda name: re.sub('\.', '_', TextProtect(name)) TextProtect = lambda s: re.sub('[-./:# ]', '_', s) TextProtectAttributeName = lambda name: TextProtect('_%s' %name) Namespace2ModuleName = lambda ns: TextProtect(ns.lstrip('http://')).rstrip('_') def GetModuleBaseNameFromWSDL(wsdl): """By default try to construct a reasonable base name for all generated modules. Otherwise return None. """ base_name = wsdl.name or wsdl.services[0].name base_name = SplitQName(base_name)[1] if base_name is None: return None return NCName_to_ModuleName(base_name) namespace_name = lambda cls, ns: 'ns%s' % len(cls.alias_list) class NamespaceAliasDict: """a lookup table to store relevant namespaces and their aliases""" alias_dict = {} alias_list = [] def add(cls, ns): if cls.alias_dict.has_key(ns): return cls.alias_dict[ns] = (Namespace2ModuleName(ns), '%s' % namespace_name(cls,ns)) cls.alias_list.append(ns) add = classmethod(add) def getModuleName(cls, ns): if cls.alias_dict.has_key(ns): return cls.alias_dict[ns][0] 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 getModuleName = classmethod(getModuleName) def getAlias(cls, ns): if cls.alias_dict.has_key(ns): 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 getAlias = classmethod(getAlias) def getNSList(cls): return tuple(cls.alias_list) getNSList = classmethod(getNSList) class StringWriter: """generator util""" def __init__(self, val=None): self.data = [] if val: self.data.append(val) def set(self, val): if self.data: # in some cases the empty list reassignment fails, so.... self.data = None self.data = [] self.data.append(val) def write(self, val): self.data.append(val) def getvalue(self): if self.data: return ''.join(self.data) else: return '' def __iadd__(self, val): self.data.append(val) return self def __str__(self): return self.getvalue() # ---- generated code utils class MessageContainer: """generator util - used by address.py""" pass # Extract sub names from message parts so they can be used when mapping # a message's contents to a function's arguments. # Args is a list of Message Parts. i.e.: op.getInputMessage().parts.values() def GetPartsSubNames(args, wsdl): do_extended = True from wsdl2python import WriteServiceModule, SchemaDescription wsm = WriteServiceModule(wsdl, do_extended=do_extended) wsm.gatherNamespaces() toReturn = [] for arg in args: argSubnames = [] for l in wsm.usedNamespaces.values(): for schema in l: sd = SchemaDescription(do_extended=do_extended) sd.fromSchema(schema) argNamespace = arg.element[0] if (sd.targetNamespace == argNamespace): for i in sd.items: # arg.name is the part name, but we want it's type argElementType = arg.element[1] if str(argElementType) == str(i.content.name): argSubnames = [] # I'm not sure when the name attribute was dropped # but at some point, or in some circumstance it's not # there, but instead a ref attribute is there which is # tuple of (namespace, name). This hack fixes things, # but I'm not sure why this happens or has happened. # IRJ - 2005-05-25 if i.content.mgContent != None: for c in i.content.mgContent: nValue = "None" if c.isWildCard(): nValue="any" elif c.attributes.has_key("name"): nValue = c.attributes["name"] elif c.attributes.has_key("ref"): nValue = c.attributes["ref"][1] argSubnames.append(nValue) toReturn.append(argSubnames) return toReturn