From: <bov...@us...> - 2007-05-25 23:03:05
|
Revision: 1384 http://svn.sourceforge.net/pywebsvcs/?rev=1384&view=rev Author: boverhof Date: 2007-05-25 16:03:06 -0700 (Fri, 25 May 2007) Log Message: ----------- updates to ParsedSoap/parsing routines to use element tree. Many unittest work, some currently broken. Modified Paths: -------------- branches/zsi-element-tree/ZSI/TC.py branches/zsi-element-tree/ZSI/TCcompound.py branches/zsi-element-tree/ZSI/__init__.py branches/zsi-element-tree/ZSI/fault.py branches/zsi-element-tree/ZSI/parse.py branches/zsi-element-tree/test/test_t4.py branches/zsi-element-tree/test/test_t5.py branches/zsi-element-tree/test/test_t6.py branches/zsi-element-tree/test/wsdl2py/test_Attributes.py Modified: branches/zsi-element-tree/ZSI/TC.py =================================================================== --- branches/zsi-element-tree/ZSI/TC.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/ZSI/TC.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -8,7 +8,7 @@ _find_arraytype, _find_default_namespace, _find_href, _find_encstyle, \ _resolve_prefix, _find_xsi_attr, _find_type, \ _find_xmlns_prefix, _get_element_nsuri_name, _get_idstr, \ - _Node, EvaluateException, \ + EvaluateException, \ _valid_encoding, ParseException from ZSI.wstools.Namespaces import SCHEMA, SOAP @@ -233,8 +233,11 @@ Parameters: elt -- the DOM element being parsed ''' - return self.pname == elt.localName and \ - self.nspname in [None, elt.namespaceURI] +# return self.pname == elt.localName and \ +# self.nspname in [None, elt.namespaceURI] + nspname,pname = _get_element_nsuri_name(elt) + return self.pname == pname and \ + self.nspname == nspname def nilled(self, elt, ps): '''Is the element NIL, and is that okay? @@ -258,20 +261,24 @@ if not _valid_encoding(elt): raise EvaluateException('Invalid encoding', ps.Backtrace(elt)) c = _children(elt) - if mixed is False: - if len(c) == 0: - raise EvaluateException('Value missing', ps.Backtrace(elt)) - for c_elt in c: - if c_elt.nodeType == _Node.ELEMENT_NODE: - raise EvaluateException('Sub-elements in value', - ps.Backtrace(c_elt)) + if mixed is False and len(c): +# if len(c) == 0: +# raise EvaluateException('Value missing', ps.Backtrace(elt)) +# for c_elt in c: +# if c_elt.nodeType == _Node.ELEMENT_NODE: + raise EvaluateException('Sub-elements in value', ps.Backtrace(c[0])) # It *seems* to be consensus that ignoring comments and # concatenating the text nodes is the right thing to do. - return ''.join([E.nodeValue for E in c - if E.nodeType - in [ _Node.TEXT_NODE, _Node.CDATA_SECTION_NODE ]]) +# return ''.join([E.nodeValue for E in c +# if E.nodeType +# in [ _Node.TEXT_NODE, _Node.CDATA_SECTION_NODE ]]) + # ElementTree: need to strip?? + print "ELT: ", elt + print "TEXT: ", elt.text + return elt.text.strip() + def parse_attributes(self, elt, ps): '''find all attributes specified in the attribute_typecode_dict in current element tag, if an attribute is found set it in the Modified: branches/zsi-element-tree/ZSI/TCcompound.py =================================================================== --- branches/zsi-element-tree/ZSI/TCcompound.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/ZSI/TCcompound.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -20,8 +20,10 @@ from ZSI.wstools.logging import getLogger as _GetLogger import re, types -_find_arrayoffset = lambda E: E.getAttributeNS(SOAP.ENC, "offset") -_find_arrayposition = lambda E: E.getAttributeNS(SOAP.ENC, "position") +#_find_arrayoffset = lambda E: E.getAttributeNS(SOAP.ENC, "offset") +#_find_arrayposition = lambda E: E.getAttributeNS(SOAP.ENC, "position") +_find_arrayoffset = lambda ET: _find_attrNS(ET, SOAP.ENC, "offset") +_find_arrayposition = lambda ET: _find_attrNS(ET, SOAP.ENC, "position") _offset_pat = re.compile(r'\[[0-9]+\]') _position_pat = _offset_pat Modified: branches/zsi-element-tree/ZSI/__init__.py =================================================================== --- branches/zsi-element-tree/ZSI/__init__.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/ZSI/__init__.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -144,7 +144,7 @@ ## ## Stuff imported from elsewhere. -from xml.dom import Node as _Node +#from xml.dom import Node as _Node import types as _types ## @@ -161,19 +161,27 @@ ## ## Low-level DOM oriented utilities; useful for typecode implementors. -_attrs = lambda E: (E.attributes and E.attributes.values()) or [] -_children = lambda E: E.childNodes or [] -_child_elements = lambda E: [ n for n in (E.childNodes or []) - if n.nodeType == _Node.ELEMENT_NODE ] +#_attrs = lambda E: (E.attributes and E.attributes.values()) or [] +#_children = lambda E: E.childNodes or [] +#_child_elements = lambda E: [ n for n in (E.childNodes or []) +# if n.nodeType == _Node.ELEMENT_NODE ] +_attrs = lambda ET: ET.attrib.values() +_children = lambda ET: [] + ET.getchildren() + [ET.text] #ETREE: No logical equivalent? +_child_elements = lambda ET: ET.getchildren() + ## ## Stuff imported from elsewhere. from ZSI.wstools.Namespaces import SOAP as _SOAP, SCHEMA as _SCHEMA, XMLNS as _XMLNS ## ## Low-level DOM oriented utilities; useful for typecode implementors. -_find_arraytype = lambda E: E.getAttributeNS(_SOAP.ENC, "arrayType") -_find_encstyle = lambda E: E.getAttributeNS(_SOAP.ENV, "encodingStyle") +#_find_arraytype = lambda E: E.getAttributeNS(_SOAP.ENC, "arrayType") +#_find_encstyle = lambda E: E.getAttributeNS(_SOAP.ENV, "encodingStyle") +_find_arraytype = lambda ET: ET.get("{%s}arrayType" %_SOAP.ENC) +_find_encstyle = lambda ET: ET.get("{%s}encodingStyle" %_SOAP.ENV) + + try: from xml.dom import EMPTY_NAMESPACE _empty_nsuri_list = [ EMPTY_NAMESPACE ] @@ -181,56 +189,85 @@ #if None not in _empty_nsuri_list: __empty_nsuri_list.append(None) except: _empty_nsuri_list = [ None, '' ] -def _find_attr(E, attr): - for nsuri in _empty_nsuri_list: - try: - v = E.getAttributeNS(nsuri, attr) - if v: return v - except: pass - return None + + +def _find_attr(ET, attr): +# for nsuri in _empty_nsuri_list: +# try: +# v = E.getAttributeNS(nsuri, attr) +# if v: return v +# except: pass +# return None + return ET.get(attr) -def _find_attrNS(E, namespaceURI, localName): + + +def _find_attrNS(ET, namespaceURI, localName): '''namespaceURI localName ''' - try: - v = E.getAttributeNS(namespaceURI, localName) - if v: return v - except: pass - return None +# try: +# v = E.getAttributeNS(namespaceURI, localName) +# if v: return v +# except: pass +# return None + return ET.get("{%s}%s" %(namespaceURI,localName)) -def _find_attrNodeNS(E, namespaceURI, localName): +def _find_attrNodeNS(ET, namespaceURI, localName): '''Must grab the attribute Node to distinquish between an unspecified attribute(None) and one set to empty string(""). namespaceURI localName ''' - attr = E.getAttributeNodeNS(namespaceURI, localName) - if attr is None: return None - try: - return attr.value - except: pass - return E.getAttributeNS(namespaceURI, localName) +# attr = E.getAttributeNodeNS(namespaceURI, localName) +# if attr is None: return None +# try: +# return attr.value +# except: pass +# return E.getAttributeNS(namespaceURI, localName) + return _find_attrNS(ET, namespaceURI, localName) + + _find_href = lambda E: _find_attr(E, "href") -_find_xsi_attr = lambda E, attr: \ - E.getAttributeNS(_SCHEMA.XSI3, attr) \ - or E.getAttributeNS(_SCHEMA.XSI1, attr) \ - or E.getAttributeNS(_SCHEMA.XSI2, attr) +#_find_xsi_attr = lambda E, attr: \ +# E.getAttributeNS(_SCHEMA.XSI3, attr) \ +# or E.getAttributeNS(_SCHEMA.XSI1, attr) \ +# or E.getAttributeNS(_SCHEMA.XSI2, attr) +_find_xsi_attr = lambda ET, attr:\ + _find_attrNS(ET, _SCHEMA.XSI3, attr) \ + or _find_attrNS(ET, _SCHEMA.XSI1, attr) \ + or _find_attrNS(ET, _SCHEMA.XSI2, attr) + _find_type = lambda E: _find_xsi_attr(E, "type") -_find_xmlns_prefix = lambda E, attr: E.getAttributeNS(_XMLNS.BASE, attr) -_find_default_namespace = lambda E: E.getAttributeNS(_XMLNS.BASE, None) +#_find_xmlns_prefix = lambda E, attr: E.getAttributeNS(_XMLNS.BASE, attr) +#_find_default_namespace = lambda E: E.getAttributeNS(_XMLNS.BASE, None) +_find_xmlns_prefix = lambda ET, attr: _find_attrNS(_XMLNS.BASE, attr) +def _find_default_namespace(ET): + raise NotImplementedError( + "ElementTree API Extension ???" + ) -#_textprotect = lambda s: s.replace('&', '&').replace('<', '<') -_get_element_nsuri_name = lambda E: (E.namespaceURI, E.localName) +#_get_element_nsuri_name = lambda E: (E.namespaceURI, E.localName) +def _get_element_nsuri_name(ET): + idx = ET.tag.find('{') + if idx<0: + return (None, ET.tag) + + return tuple(ET.tag[idx+1:].split('}')) + -_is_element = lambda E: E.nodeType == _Node.ELEMENT_NODE +#_is_element = lambda E: E.nodeType == _Node.ELEMENT_NODE +def _is_element(ET): + raise NotImplementedError( + 'ElementTree API: Irrelevant' + ) def _resolve_prefix(celt, prefix): '''resolve prefix to a namespaceURI. If None or @@ -240,19 +277,22 @@ celt -- element node prefix -- xmlns:prefix, or empty str or None ''' - namespace = None - while _is_element(celt): - if prefix: - namespaceURI = _find_xmlns_prefix(celt, prefix) - else: - namespaceURI = _find_default_namespace(celt) - if namespaceURI: break - celt = celt.parentNode - else: - if prefix: - raise EvaluateException, 'cant resolve xmlns:%s' %prefix - return namespaceURI - +# namespace = None +# while _is_element(celt): +# if prefix: +# namespaceURI = _find_xmlns_prefix(celt, prefix) +# else: +# namespaceURI = _find_default_namespace(celt) +# if namespaceURI: break +# celt = celt.parentNode +# else: +# if prefix: +# raise EvaluateException, 'cant resolve xmlns:%s' %prefix +# return namespaceURI + raise NotImplementedError( + "ElementTree API Extension ???" + ) + def _valid_encoding(elt): '''Does this node have a valid encoding? ''' @@ -271,20 +311,24 @@ '''Return a "backtrace" from the given element to the DOM root, in XPath syntax. ''' - s = '' - while elt != dom: - name, parent = elt.nodeName, elt.parentNode - if parent is None: break - matches = [ c for c in _child_elements(parent) - if c.nodeName == name ] - if len(matches) == 1: - s = '/' + name + s - else: - i = matches.index(elt) + 1 - s = ('/%s[%d]' % (name, i)) + s - elt = parent - return s +# s = '' +# while elt != dom: +# name, parent = elt.nodeName, elt.parentNode +# if parent is None: break +# matches = [ c for c in _child_elements(parent) +# if c.nodeName == name ] +# if len(matches) == 1: +# s = '/' + name + s +# else: +# i = matches.index(elt) + 1 +# s = ('/%s[%d]' % (name, i)) + s +# elt = parent +# return s + return "Sorry no backtrace: ElementTree API Extension ???" + + + def _get_idstr(pyobj): '''Python 2.3.x generates a FutureWarning for negative IDs, so we use a different prefix character to ensure uniqueness, and Modified: branches/zsi-element-tree/ZSI/fault.py =================================================================== --- branches/zsi-element-tree/ZSI/fault.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/ZSI/fault.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -4,7 +4,7 @@ ''' from ZSI import _copyright, _children, _child_elements, \ - _get_idstr, _stringtypes, _seqtypes, _Node, SoapWriter, ZSIException + _get_idstr, _stringtypes, _seqtypes, SoapWriter, ZSIException from ZSI.TCcompound import Struct from ZSI.TC import QName, URI, String, XMLString, AnyElement, UNBOUNDED Modified: branches/zsi-element-tree/ZSI/parse.py =================================================================== --- branches/zsi-element-tree/ZSI/parse.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/ZSI/parse.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -2,21 +2,28 @@ # $Header$ '''SOAP messaging parsing. ''' - +from xml import etree +from xml.etree import ElementTree from ZSI import _copyright, _children, _attrs, _child_elements, _stringtypes, \ _backtrace, EvaluateException, ParseException, _valid_encoding, \ - _Node, _find_attr, _resolve_prefix + _find_attr, _resolve_prefix, _get_element_nsuri_name from ZSI.TC import AnyElement import types from ZSI.wstools.Namespaces import SOAP, XMLNS from ZSI.wstools.Utility import SplitQName -_find_actor = lambda E: E.getAttributeNS(SOAP.ENV, "actor") or None -_find_mu = lambda E: E.getAttributeNS(SOAP.ENV, "mustUnderstand") -_find_root = lambda E: E.getAttributeNS(SOAP.ENC, "root") -_find_id = lambda E: _find_attr(E, 'id') +#_find_actor = lambda E: E.getAttributeNS(SOAP.ENV, "actor") or None +#_find_mu = lambda E: E.getAttributeNS(SOAP.ENV, "mustUnderstand") +#_find_root = lambda E: E.getAttributeNS(SOAP.ENC, "root") +#_find_id = lambda E: _find_attr(E, 'id') +_find_actor = lambda ET: ET.attrib.get("{%s}%s" %(SOAP.ENV, "actor")) +_find_mu = lambda ET: ET.attrib.get("{%s}%s" %(SOAP.ENV, "mustUnderstand")) +_find_root = lambda ET: ET.attrib.get("{%s}%s" %(SOAP.ENV, "root")) +_find_id = lambda ET: ET.attrib.get("{%s}%s" %(SOAP.ENV, "id")) + + class ParsedSoap: '''A Parsed SOAP object. Convert the text to a DOM tree and parse SOAP elements. @@ -32,7 +39,7 @@ data_elements -- list of non-root elements in the SOAP Body trailer_elements -- list of elements following the SOAP body ''' - defaultReaderClass = None + defaultReaderClass = staticmethod(ElementTree.XML) def __init__(self, input, readerclass=None, keepdom=False, trailers=False, resolver=None, envelope=True, **kw): @@ -45,20 +52,21 @@ envelope -- look for a SOAP envelope. ''' - self.readerclass = readerclass self.keepdom = keepdom - if not self.readerclass: + if not readerclass: if self.defaultReaderClass != None: - self.readerclass = self.defaultReaderClass - else: - from xml.dom.ext.reader import PyExpat - self.readerclass = PyExpat.Reader + readerclass = self.defaultReaderClass +# else: +# from xml.dom.ext.reader import PyExpat +# readerclass = PyExpat.Reader try: - self.reader = self.readerclass() +# self.reader = readerclass() if type(input) in _stringtypes: - self.dom = self.reader.fromString(input) +# self.dom = self.reader.fromString(input) + self.dom = readerclass(input) else: - self.dom = self.reader.fromStream(input) +# self.dom = self.reader.fromStream(input) + self.dom = readerclass(input.read()) except Exception, e: # Is this in the header? Your guess is as good as mine. #raise ParseException("Can't parse document (" + \ @@ -75,47 +83,64 @@ self.trailers, self.resolver, self.id_cache = trailers, resolver, {} # Exactly one child element - c = [ E for E in _children(self.dom) - if E.nodeType == _Node.ELEMENT_NODE] - if len(c) == 0: - raise ParseException("Document has no Envelope", 0) - if len(c) != 1: - raise ParseException("Document has extra child elements", 0) +# c = [ E for E in _children(self.dom) +# if E.nodeType == _Node.ELEMENT_NODE] + elt = self.dom + #if len(c) == 0: + # raise ParseException("Document has no Envelope", 0) + #if len(c) != 1: + # raise ParseException("Document has extra child elements", 0) if envelope is False: - self.body_root = c[0] + self.body_root = elt return # And that one child must be the Envelope - elt = c[0] - if elt.localName != "Envelope" \ - or elt.namespaceURI != SOAP.ENV: - raise ParseException('Document has "' + elt.localName + \ +# if elt.localName != "Envelope" \ +# or elt.namespaceURI != SOAP.ENV: +# raise ParseException('Document has "' + elt.localName + \ +# '" element, not Envelope', 0) + if _get_element_nsuri_name(elt) != (SOAP.ENV, "Envelope"): + print "X: ", _get_element_nsuri_name(elt) != (SOAP.ENV, "Envelope") + print "A: ",_get_element_nsuri_name(elt) + print "V: ",(SOAP.ENV, "Envelope") + raise ParseException('Document has "' + \ + str(_get_element_nsuri_name(elt)) + \ '" element, not Envelope', 0) + self._check_for_legal_children("Envelope", elt) - for a in _attrs(elt): - name = a.nodeName - if name.find(":") == -1 and name not in [ "xmlns", "id" ]: +# for a in _attrs(elt): +# name = a.nodeName +# if name.find(":") == -1 and name not in [ "xmlns", "id" ]: +# raise ParseException('Unqualified attribute "' + \ +# name + '" in Envelope', 0) + for name in elt.keys(): + if name[0] != '{' and name not in [ "xmlns", "id" ]: raise ParseException('Unqualified attribute "' + \ name + '" in Envelope', 0) + self.envelope = elt if not _valid_encoding(self.envelope): raise ParseException("Envelope has invalid encoding", 0) # Get Envelope's child elements. - c = [ E for E in _children(self.envelope) - if E.nodeType == _Node.ELEMENT_NODE ] +# c = [ E for E in _children(self.envelope) +# if E.nodeType == _Node.ELEMENT_NODE ] + c = _child_elements(self.envelope) if len(c) == 0: raise ParseException("Envelope is empty (no Body)", 0) # Envelope's first child might be the header; if so, nip it off. elt = c[0] - if elt.localName == "Header" \ - and elt.namespaceURI == SOAP.ENV: +# if elt.localName == "Header" \ +# and elt.namespaceURI == SOAP.ENV: + if _get_element_nsuri_name(elt) == (SOAP.ENV, "Header"): self._check_for_legal_children("Header", elt) self._check_for_pi_nodes(_children(elt), 1) self.header = c.pop(0) self.header_elements = _child_elements(self.header) + + else: self.header, self.header_elements = None, [] @@ -123,15 +148,16 @@ if len(c) == 0: raise ParseException("Envelope has header but no Body", 0) elt = c.pop(0) - if elt.localName != "Body" \ - or elt.namespaceURI != SOAP.ENV: +# if elt.localName != "Body" \ +# or elt.namespaceURI != SOAP.ENV: + if _get_element_nsuri_name(elt) != (SOAP.ENV, "Body"): if self.header: raise ParseException('Header followed by "' + \ - elt.localName + \ + elt.tag + \ '" element, not Body', 0, elt, self.dom) else: raise ParseException('Document has "' + \ - elt.localName + \ + elt.tag + \ '" element, not Body', 0, elt, self.dom) self._check_for_legal_children("Body", elt, 0) self._check_for_pi_nodes(_children(elt), 0) @@ -149,7 +175,7 @@ else: self.trailer_elements = c for elt in self.trailer_elements: - if not elt.namespaceURI: + if _get_element_nsuri_name(elt)[0] is None: raise ParseException('Unqualified trailer element', 0, elt, self.dom) @@ -189,45 +215,47 @@ if id(E) != rootid ] self._check_for_pi_nodes(self.data_elements, 0) - def __del__(self): - try: - if not self.keepdom: - self.reader.releaseNode(self.dom) - except: - pass +# def __del__(self): +# try: +# if not self.keepdom: +# self.reader.releaseNode(self.dom) +# except: +# pass def _check_for_legal_children(self, name, elt, mustqualify=1): '''Check if all children of this node are elements or whitespace-only text nodes. ''' - inheader = name == "Header" - for n in _children(elt): - t = n.nodeType - if t == _Node.COMMENT_NODE: continue - if t != _Node.ELEMENT_NODE: - if t == _Node.TEXT_NODE and n.nodeValue.strip() == "": - continue - raise ParseException("Non-element child in " + name, - inheader, elt, self.dom) - if mustqualify and not n.namespaceURI: - raise ParseException('Unqualified element "' + \ - n.nodeName + '" in ' + name, inheader, elt, self.dom) +# inheader = name == "Header" +# for n in _children(elt): +# t = n.nodeType +# if t == _Node.COMMENT_NODE: continue +# if t != _Node.ELEMENT_NODE: +# if t == _Node.TEXT_NODE and n.nodeValue.strip() == "": +# continue +# raise ParseException("Non-element child in " + name, +# inheader, elt, self.dom) +# if mustqualify and not n.namespaceURI: +# raise ParseException('Unqualified element "' + \ +# n.nodeName + '" in ' + name, inheader, elt, self.dom) + return def _check_for_pi_nodes(self, list, inheader): '''Raise an exception if any of the list descendants are PI nodes. ''' - list = list[:] - while list: - elt = list.pop() - t = elt.nodeType - if t == _Node.PROCESSING_INSTRUCTION_NODE: - raise ParseException('Found processing instruction "<?' + \ - elt.nodeName + '...>"', - inheader, elt.parentNode, self.dom) - elif t == _Node.DOCUMENT_TYPE_NODE: - raise ParseException('Found DTD', inheader, - elt.parentNode, self.dom) - list += _children(elt) +# list = list[:] +# while list: +# elt = list.pop() +# t = elt.nodeType +# if t == _Node.PROCESSING_INSTRUCTION_NODE: +# raise ParseException('Found processing instruction "<?' + \ +# elt.nodeName + '...>"', +# inheader, elt.parentNode, self.dom) +# elif t == _Node.DOCUMENT_TYPE_NODE: +# raise ParseException('Found DTD', inheader, +# elt.parentNode, self.dom) +# list += _children(elt) + return def Backtrace(self, elt): '''Return a human-readable "backtrace" from the document root to @@ -252,7 +280,8 @@ if headers: list.extend(self.header_elements) while list: e = list.pop() - if e.nodeType == _Node.ELEMENT_NODE: +# if e.nodeType == _Node.ELEMENT_NODE: + if e is not None: nodeid = _find_id(e) if nodeid: self.id_cache[nodeid] = e @@ -288,17 +317,18 @@ element. The dictionaries are cached, and we recurse up the tree as necessary. ''' - d = self.ns_cache.get(id(elt)) - if not d: - if elt != self.dom: d = self.GetElementNSdict(elt.parentNode) - for a in _attrs(elt): - if a.namespaceURI == XMLNS.BASE: - if a.localName == "xmlns": - d[''] = a.nodeValue - else: - d[a.localName] = a.nodeValue - self.ns_cache[id(elt)] = d - return d.copy() +# d = self.ns_cache.get(id(elt)) +# if not d: +# if elt != self.dom: d = self.GetElementNSdict(elt.parentNode) +# for a in _attrs(elt): +# if a.namespaceURI == XMLNS.BASE: +# if a.localName == "xmlns": +# d[''] = a.nodeValue +# else: +# d[a.localName] = a.nodeValue +# self.ns_cache[id(elt)] = d +# return d.copy() + raise NotImplementedError, "ElementTree API: parent Extension??" def GetDomAndReader(self): '''Returns a tuple containing the dom and reader objects. (dom, reader) @@ -314,7 +344,8 @@ ''' e = self.body_root if not e: return 0 - return e.namespaceURI == SOAP.ENV and e.localName == 'Fault' +# return e.namespaceURI == SOAP.ENV and e.localName == 'Fault' + return _get_element_nsuri_name(e) == (SOAP.ENV, 'Fault') def Parse(self, how): '''Parse the message. @@ -326,7 +357,7 @@ '''Return a list of (uri,localname) tuples for all elements in the header that have mustUnderstand set. ''' - return [ ( E.namespaceURI, E.localName ) + return [ _get_element_nsuri_name(E) for E in self.header_elements if _find_mu(E) == "1" ] def WhatActorsArePresent(self): @@ -348,15 +379,18 @@ c, crange = self.header_elements[:], range(len(self.header_elements)) for i,what in [ (i, ofwhat[i]) for i in range(lenofwhat) ]: if isinstance(what, AnyElement): - raise EvaluateException, 'not supporting <any> as child of SOAP-ENC:Header' + raise EvaluateException( + 'not supporting <any> as child of SOAP-ENC:Header' + ) v = [] occurs = 0 namespaceURI,tagName = what.nspname,what.pname for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: - prefix,name = SplitQName(c_elt.tagName) - nsuri = _resolve_prefix(c_elt, prefix) - if tagName == name and namespaceURI == nsuri: +# prefix,name = SplitQName(c_elt.tagName) +# nsuri = _resolve_prefix(c_elt, prefix) +# if tagName == name and namespaceURI == nsuri: + if _get_element_nsuri_name(c_elt) == (nsuri, name): pyobj = what.parse(c_elt, self) else: continue Modified: branches/zsi-element-tree/test/test_t4.py =================================================================== --- branches/zsi-element-tree/test/test_t4.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/test/test_t4.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -2,7 +2,7 @@ import unittest, sys from ZSI import * from ZSI import resolvers -from xml.dom.ext import PrettyPrint +#from xml.dom.ext import PrettyPrint OUT = sys.stdout IN='''<SOAP-ENV:Envelope Modified: branches/zsi-element-tree/test/test_t5.py =================================================================== --- branches/zsi-element-tree/test/test_t5.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/test/test_t5.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -3,7 +3,7 @@ from ZSI import * from ZSI import resolvers from xml.dom import Node -from xml.dom.ext.reader import PyExpat +#from xml.dom.ext.reader import PyExpat try: import cStringIO as StringIO except ImportError: Modified: branches/zsi-element-tree/test/test_t6.py =================================================================== --- branches/zsi-element-tree/test/test_t6.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/test/test_t6.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -1,7 +1,7 @@ #!/usr/bin/env python import unittest, sys, multifile, mimetools, base64 -from xml.dom import Node -from xml.dom.ext.reader import PyExpat +#from xml.dom import Node +#from xml.dom.ext.reader import PyExpat from ZSI import * from ZSI import resolvers try: Modified: branches/zsi-element-tree/test/wsdl2py/test_Attributes.py =================================================================== --- branches/zsi-element-tree/test/wsdl2py/test_Attributes.py 2007-05-19 00:02:36 UTC (rev 1383) +++ branches/zsi-element-tree/test/wsdl2py/test_Attributes.py 2007-05-25 23:03:06 UTC (rev 1384) @@ -97,6 +97,10 @@ sw = SoapWriter() sw.serialize(pyobj) soap = str(sw) + + print '--'*30 + print soap + print '--'*30 ps = ParsedSoap(soap) pyobj2 = ps.Parse(pyobj.typecode) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-06-04 21:56:50
|
Revision: 1387 http://svn.sourceforge.net/pywebsvcs/?rev=1387&view=rev Author: boverhof Date: 2007-06-04 14:56:51 -0700 (Mon, 04 Jun 2007) Log Message: ----------- M test/test_t4.py M test/test_t5.py _M ZSI M ZSI/__init__.py M ZSI/TC.py M ZSI/parse.py M ZSI/TCcompound.py M ZSI/writer.py -- had to change to lxml for parsing xsi:type QName values, several fixes to get more unittests working Modified Paths: -------------- branches/zsi-element-tree/ZSI/TC.py branches/zsi-element-tree/ZSI/TCcompound.py branches/zsi-element-tree/ZSI/__init__.py branches/zsi-element-tree/ZSI/parse.py branches/zsi-element-tree/ZSI/writer.py branches/zsi-element-tree/test/test_t4.py branches/zsi-element-tree/test/test_t5.py Property Changed: ---------------- branches/zsi-element-tree/ZSI/ Property changes on: branches/zsi-element-tree/ZSI ___________________________________________________________________ Name: svn:externals - wstools https://svn.sourceforge.net/svnroot/pywebsvcs/trunk/wstools + wstools https://svn.sourceforge.net/svnroot/pywebsvcs/trunk/wstools Modified: branches/zsi-element-tree/ZSI/TC.py =================================================================== --- branches/zsi-element-tree/ZSI/TC.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/ZSI/TC.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -12,8 +12,8 @@ _valid_encoding, ParseException from ZSI.wstools.Namespaces import SCHEMA, SOAP -from ZSI.wstools.Utility import SplitQName -from ZSI.wstools.c14n import Canonicalize +#from ZSI.wstools.Utility import SplitQName +#from ZSI.wstools.c14n import Canonicalize from ZSI.wstools.logging import getLogger as _GetLogger import re, types, time, copy @@ -207,18 +207,26 @@ elt -- the DOM element being parsed ps -- the ParsedSoap object. ''' - typeName = _find_type(elt) - if typeName is None or typeName == "": + print "ELT: ", elt + print "PS: ", ps +# attr = _find_type(elt) +# if attr is None: +# return (None,None) + +# # Parse the QNAME. +# prefix,typeName = SplitQName(typeName) +# +# uri = ps.GetElementNSdict(elt).get(prefix) +# if uri is None: +# raise EvaluateException('Malformed type attribute (bad NS)', +# ps.Backtrace(elt)) + + prefix,typeName = _find_type(elt) + if typeName is None: return (None,None) - # Parse the QNAME. - prefix,typeName = SplitQName(typeName) - uri = ps.GetElementNSdict(elt).get(prefix) - if uri is None: - raise EvaluateException('Malformed type attribute (bad NS)', - ps.Backtrace(elt)) - - #typeName = list[1] + uri = _resolve_prefix(elt, prefix) + parselist,errorlist = self.get_parse_and_errorlist() if not parselist or \ (uri,typeName) in parselist or \ @@ -260,7 +268,7 @@ ''' if not _valid_encoding(elt): raise EvaluateException('Invalid encoding', ps.Backtrace(elt)) - c = _children(elt) + c = _child_elements(elt) if mixed is False and len(c): # if len(c) == 0: # raise EvaluateException('Value missing', ps.Backtrace(elt)) @@ -277,7 +285,7 @@ # ElementTree: need to strip?? print "ELT: ", elt print "TEXT: ", elt.text - return elt.text.strip() + return elt.text def parse_attributes(self, elt, ps): '''find all attributes specified in the attribute_typecode_dict in @@ -414,6 +422,7 @@ def parse(self, elt, ps): self.checkname(elt, ps) + elt.text is None if len(_children(elt)) == 0: href = _find_href(elt) if not href: @@ -433,7 +442,8 @@ elt = ps.FindLocalHREF(href, elt) self.checktype(elt, ps) if self.nilled(elt, ps): return Nilled - if len(_children(elt)) == 0: +# if len(_children(elt)) == 0: + if elt.text is None: v = self.empty_content else: v = self.simple_value(elt, ps) @@ -1364,7 +1374,7 @@ self.nspname,self.pname,nspname,pname), ps.Backtrace(elt)) #locate xsi:type - prefix, typeName = SplitQName(_find_type(elt)) + prefix, typeName = _find_type(elt) namespaceURI = _resolve_prefix(elt, prefix) pyclass = GTD(namespaceURI, typeName) if not pyclass: @@ -1452,7 +1462,7 @@ # Allow use of "<any>" element declarations w/ local # element declarations - prefix, typeName = SplitQName(_find_type(elt)) + prefix, typeName = _find_type(elt) if not skip and typeName: namespaceURI = _resolve_prefix(elt, prefix or 'xmlns') # First look thru user defined namespaces, if don't find Modified: branches/zsi-element-tree/ZSI/TCcompound.py =================================================================== --- branches/zsi-element-tree/ZSI/TCcompound.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/ZSI/TCcompound.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -4,7 +4,7 @@ ''' from ZSI import _copyright, _children, _child_elements, \ - _inttypes, _stringtypes, _seqtypes, _find_arraytype, _find_href, \ + _inttypes, _stringtypes, _seqtypes, _find_attrNS, _find_arraytype, _find_href, \ _find_type, _find_xmlns_prefix, _get_idstr, EvaluateException, \ ParseException @@ -152,6 +152,8 @@ elt = ps.FindLocalHREF(href, elt) c = _child_elements(elt) count = len(c) + print "COUNT: ", count + print "CHILD: ", c if self.nilled(elt, ps): return Nilled # Create the object. @@ -184,10 +186,13 @@ if debug: self.logger.debug("what: (%s,%s)", what.nspname, what.pname) - for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: + #for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: + for j,c_elt in [ (j, c[j]) for j in crange if c[j] is not None]: + self.logger.debug("CELT: (%s,%s)", j, c_elt) # Parse value, and mark this one done. if debug: - self.logger.debug("child node: (%s,%s)", c_elt.namespaceURI, c_elt.tagName) + #self.logger.debug("child node: (%s,%s)", c_elt.namespaceURI, c_elt.tagName) + self.logger.debug("child node: %s" %c_elt) match = False if what.name_match(c_elt): Modified: branches/zsi-element-tree/ZSI/__init__.py =================================================================== --- branches/zsi-element-tree/ZSI/__init__.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/ZSI/__init__.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -167,7 +167,7 @@ # if n.nodeType == _Node.ELEMENT_NODE ] _attrs = lambda ET: ET.attrib.values() -_children = lambda ET: [] + ET.getchildren() + [ET.text] #ETREE: No logical equivalent? +_children = lambda ET: [c for c in [] + ET.getchildren() + [ET.text] if c is not None] #ETREE: No logical equivalent? _child_elements = lambda ET: ET.getchildren() ## @@ -243,8 +243,13 @@ or _find_attrNS(ET, _SCHEMA.XSI1, attr) \ or _find_attrNS(ET, _SCHEMA.XSI2, attr) -_find_type = lambda E: _find_xsi_attr(E, "type") +def _find_type(E): + prefix,value = None, _find_xsi_attr(E, "type") + if value is not None and value.find(':') >= 0: + prefix,value = value.split(':') + return prefix,value + #_find_xmlns_prefix = lambda E, attr: E.getAttributeNS(_XMLNS.BASE, attr) #_find_default_namespace = lambda E: E.getAttributeNS(_XMLNS.BASE, None) _find_xmlns_prefix = lambda ET, attr: _find_attrNS(_XMLNS.BASE, attr) @@ -269,7 +274,7 @@ 'ElementTree API: Irrelevant' ) -def _resolve_prefix(celt, prefix): +def _resolve_prefix(E, prefix): '''resolve prefix to a namespaceURI. If None or empty str, return default namespace or None. @@ -289,10 +294,17 @@ # if prefix: # raise EvaluateException, 'cant resolve xmlns:%s' %prefix # return namespaceURI - raise NotImplementedError( - "ElementTree API Extension ???" - ) + +# raise NotImplementedError( +# "ElementTree API Extension ???" +# ) + + # lxml ElementTree API Extension + print prefix + print E.nsmap + return E.nsmap[prefix] + def _valid_encoding(elt): '''Does this node have a valid encoding? ''' Modified: branches/zsi-element-tree/ZSI/parse.py =================================================================== --- branches/zsi-element-tree/ZSI/parse.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/ZSI/parse.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -2,8 +2,10 @@ # $Header$ '''SOAP messaging parsing. ''' -from xml import etree -from xml.etree import ElementTree + +from lxml import etree +from lxml.etree import ElementTree + from ZSI import _copyright, _children, _attrs, _child_elements, _stringtypes, \ _backtrace, EvaluateException, ParseException, _valid_encoding, \ _find_attr, _resolve_prefix, _get_element_nsuri_name @@ -39,7 +41,7 @@ data_elements -- list of non-root elements in the SOAP Body trailer_elements -- list of elements following the SOAP body ''' - defaultReaderClass = staticmethod(ElementTree.XML) + defaultReaderClass = staticmethod(etree.XML) def __init__(self, input, readerclass=None, keepdom=False, trailers=False, resolver=None, envelope=True, **kw): Modified: branches/zsi-element-tree/ZSI/writer.py =================================================================== --- branches/zsi-element-tree/ZSI/writer.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/ZSI/writer.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -34,7 +34,8 @@ nsdict={}, outputclass=None, **kw): '''Initialize. ''' - outputclass = outputclass or ElementProxy + from ZSI.elementtreeproxy import ElementTreeProxy as ElementTreeProxy + outputclass = outputclass or ElementTreeProxy if not issubclass(outputclass, MessageInterface): raise TypeError, 'outputclass must subclass MessageInterface' Modified: branches/zsi-element-tree/test/test_t4.py =================================================================== --- branches/zsi-element-tree/test/test_t4.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/test/test_t4.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -45,7 +45,11 @@ # Faulted while processing; now it's the body print >>OUT, FaultFromException(e, 0, sys.exc_info()[2]).AsSOAP() self.fail() - PrettyPrint(dict['xmltest']) + + #PrettyPrint(dict['xmltest']) + print + print dict['xmltest'] + print print '**', dict['stringtest'], '**' def makeTestSuite(): Modified: branches/zsi-element-tree/test/test_t5.py =================================================================== --- branches/zsi-element-tree/test/test_t5.py 2007-06-02 23:26:01 UTC (rev 1386) +++ branches/zsi-element-tree/test/test_t5.py 2007-06-04 21:56:51 UTC (rev 1387) @@ -3,7 +3,8 @@ from ZSI import * from ZSI import resolvers from xml.dom import Node -#from xml.dom.ext.reader import PyExpat +from xml.etree import ElementTree + try: import cStringIO as StringIO except ImportError: @@ -21,8 +22,8 @@ print 'xml=', xml.getvalue() for h,b in cid.parts: print h, b.read() - dom = PyExpat.Reader().fromStream(xml) - print dom + print ElementTree.XML(xml.getvalue()) + print xml.getvalue() def makeTestSuite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-06-05 04:48:41
|
Revision: 1388 http://svn.sourceforge.net/pywebsvcs/?rev=1388&view=rev Author: boverhof Date: 2007-06-04 21:48:41 -0700 (Mon, 04 Jun 2007) Log Message: ----------- M test/wsdl2py/test_EchoWSAddr200403.py M test/wsdl2py/servers/EchoServer.py M test/test_t4.py M test/test_t5.py _M ZSI M ZSI/__init__.py M ZSI/TC.py M ZSI/parse.py M ZSI/TCcompound.py M ZSI/writer.py M ZSI/address.py -- fixed basic ws-addressing, pass EPR's around Modified Paths: -------------- branches/zsi-element-tree/ZSI/TC.py branches/zsi-element-tree/ZSI/TCcompound.py branches/zsi-element-tree/ZSI/__init__.py branches/zsi-element-tree/ZSI/address.py branches/zsi-element-tree/ZSI/parse.py branches/zsi-element-tree/test/wsdl2py/servers/EchoServer.py branches/zsi-element-tree/test/wsdl2py/test_EchoWSAddr200403.py Added Paths: ----------- branches/zsi-element-tree/ZSI/elementtreeproxy.py Modified: branches/zsi-element-tree/ZSI/TC.py =================================================================== --- branches/zsi-element-tree/ZSI/TC.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/ZSI/TC.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -10,7 +10,8 @@ _find_xmlns_prefix, _get_element_nsuri_name, _get_idstr, \ EvaluateException, \ _valid_encoding, ParseException - + +from lxml import etree from ZSI.wstools.Namespaces import SCHEMA, SOAP #from ZSI.wstools.Utility import SplitQName #from ZSI.wstools.c14n import Canonicalize @@ -26,6 +27,7 @@ except ImportError: from StringIO import StringIO +_is_etree_element = lambda E: type(E) is etree._Element _is_xsd_or_soap_ns = lambda ns: ns in [ SCHEMA.XSD3, SOAP.ENC, SCHEMA.XSD1, SCHEMA.XSD2, ] @@ -207,8 +209,6 @@ elt -- the DOM element being parsed ps -- the ParsedSoap object. ''' - print "ELT: ", elt - print "PS: ", ps # attr = _find_type(elt) # if attr is None: # return (None,None) @@ -283,8 +283,6 @@ # in [ _Node.TEXT_NODE, _Node.CDATA_SECTION_NODE ]]) # ElementTree: need to strip?? - print "ELT: ", elt - print "TEXT: ", elt.text return elt.text def parse_attributes(self, elt, ps): @@ -581,7 +579,8 @@ ps.Backtrace(elt)) elt = ps.FindLocalHREF(href, elt) (ns,type) = self.checktype(elt, ps) - if not type and elt.namespaceURI == SOAP.ENC: + #if not type and elt.namespaceURI == SOAP.ENC: + if not type and _get_element_nsuri_name(elt)[0] == SOAP.ENC: ns,type = SOAP.ENC, elt.localName if not type or (ns,type) == (SOAP.ENC,'Array'): if self.aslist or _find_arraytype(elt): @@ -1422,7 +1421,12 @@ raise TypeError, 'pyobj is a typecode instance.' what = getattr(pyobj, 'typecode', None) - if what is not None and type(pyobj) is types.InstanceType: + if what is None and _is_etree_element(pyobj): + e = elt._etree + e.append(pyobj) + return + + if what is None and type(pyobj) is types.InstanceType: tc = pyobj.__class__ what = Any.serialmap.get(tc) if not what: @@ -1479,13 +1483,16 @@ what.typed = True return pyobj - if skip: - what = XML(pname=(nspname,pname), wrapped=False) - elif self.processContents == 'lax': - what = Any(pname=(nspname,pname), unique=True) - else: - what = Any(pname=(nspname,pname), unique=True) + #if skip: + # what = XML(pname=(nspname,pname), wrapped=False) + #elif self.processContents == 'lax': + # what = Any(pname=(nspname,pname), unique=True) + #else: + # what = Any(pname=(nspname,pname), unique=True) + if what is None: + return elt + try: pyobj = what.parse(elt, ps) except EvaluateException, ex: Modified: branches/zsi-element-tree/ZSI/TCcompound.py =================================================================== --- branches/zsi-element-tree/ZSI/TCcompound.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/ZSI/TCcompound.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -198,6 +198,9 @@ if what.name_match(c_elt): match = True value = what.parse(c_elt, ps) + elif isinstance(what,AnyElement): + match = True + value = what.parse(c_elt, ps) else: # substitutionGroup head must be a global element declaration # if successful delegate to matching GED @@ -229,37 +232,38 @@ if self.inorder is True and i == j: raise EvaluateException('Out of order complexType', ps.Backtrace(c_elt)) - else: - # only supporting 1 <any> declaration in content. - if isinstance(what,AnyElement): - any = what - elif hasattr(what, 'default'): - v[what.aname] = what.default - elif what.minOccurs > 0 and not v.has_key(what.aname): - raise EvaluateException('Element "' + what.aname + \ - '" missing from complexType', ps.Backtrace(elt)) +# else: +# # only supporting 1 <any> declaration in content. +# if isinstance(what,AnyElement): +# any = what +# elif hasattr(what, 'default'): +# v[what.aname] = what.default +# elif what.minOccurs > 0 and not v.has_key(what.aname): +# raise EvaluateException('Element "' + what.aname + \ +# '" missing from complexType', ps.Backtrace(elt)) +# # Look for wildcards and unprocessed children # XXX Stick all this stuff in "any", hope for no collisions - if any is not None: - occurs = 0 - v[any.aname] = [] - for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: - value = any.parse(c_elt, ps) - if any.maxOccurs == UNBOUNDED or any.maxOccurs > 1: - v[any.aname].append(value) - else: - v[any.aname] = value +# if any is not None: +# occurs = 0 +# v[any.aname] = [] +# for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: +# value = any.parse(c_elt, ps) +# if any.maxOccurs == UNBOUNDED or any.maxOccurs > 1: +# v[any.aname].append(value) +# else: +# v[any.aname] = value +# +# occurs += 1 +# +# # No such thing as nillable <any> +# if any.maxOccurs == 1 and occurs == 0: +# v[any.aname] = None +# elif occurs < any.minOccurs or (any.maxOccurs!=UNBOUNDED and any.maxOccurs<occurs): +# raise EvaluateException('occurances of <any> elements(#%d) bound by (%d,%s)' %( +# occurs, any.minOccurs,str(any.maxOccurs)), ps.Backtrace(elt)) - occurs += 1 - - # No such thing as nillable <any> - if any.maxOccurs == 1 and occurs == 0: - v[any.aname] = None - elif occurs < any.minOccurs or (any.maxOccurs!=UNBOUNDED and any.maxOccurs<occurs): - raise EvaluateException('occurances of <any> elements(#%d) bound by (%d,%s)' %( - occurs, any.minOccurs,str(any.maxOccurs)), ps.Backtrace(elt)) - if not self.pyclass: return v Modified: branches/zsi-element-tree/ZSI/__init__.py =================================================================== --- branches/zsi-element-tree/ZSI/__init__.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/ZSI/__init__.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -300,8 +300,6 @@ # ) # lxml ElementTree API Extension - print prefix - print E.nsmap return E.nsmap[prefix] Modified: branches/zsi-element-tree/ZSI/address.py =================================================================== --- branches/zsi-element-tree/ZSI/address.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/ZSI/address.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -186,11 +186,12 @@ ReferenceProperties = getattr(endPointReference, '_ReferenceProperties', None) if ReferenceProperties is not None: for v in getattr(ReferenceProperties, '_any', ()): - if not hasattr(v,'typecode'): - raise EvaluateException, '<any> element, instance missing typecode attribute' + #if not hasattr(v,'typecode'): + # raise EvaluateException, '<any> element, instance missing typecode attribute' pyobjs.append(v) + self.header_pyobjs = tuple(pyobjs) def setResponseFromWSAddress(self, address, localURL): @@ -224,7 +225,10 @@ ''' for pyobj in self.header_pyobjs: if hasattr(pyobj, 'typecode') is False: - raise RuntimeError, 'all header pyobjs must have a typecode attribute' + #raise RuntimeError, 'all header pyobjs must have a typecode attribute' + # TODO: Assuming I know this is EPR/ReferenceParameters/any + sw.serialize_header(pyobj, typecode=AnyElement(), **kw) + continue sw.serialize_header(pyobj, **kw) Added: branches/zsi-element-tree/ZSI/elementtreeproxy.py =================================================================== --- branches/zsi-element-tree/ZSI/elementtreeproxy.py (rev 0) +++ branches/zsi-element-tree/ZSI/elementtreeproxy.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -0,0 +1,116 @@ +############################################################################ +# Joshua R. Boverhof, LBNL +# See Copyright for copyright notice! +########################################################################### +#from Ft.Xml.Domlette import NonvalidatingReaderBase, NonvalidatingReader +#from ZSI.wstools.c14n import Canonicalize +from ZSI.wstools.Namespaces import SCHEMA, XMLNS +#from ZSI.wstools.Utility import DOMException +from ZSI.wstools.Utility import MessageInterface + +#from xml.etree import ElementTree +from lxml import etree as ElementTree + +#class DomletteReader(NonvalidatingReaderBase): +# '''Used with ZSI.parse.ParsedSoap +# ''' +# fromString = NonvalidatingReaderBase.parseString +# fromStream = NonvalidatingReaderBase.parseStream + +class ElementProxyException(Exception): + '''TODO: Should probably rename DOMException ElementProxyException. + ''' + +class ElementTreeProxy(MessageInterface): + '''ElementTree wrapper + TODO: add c14n for message signatures, issue with "getPrefix" + ''' + + def __init__(self, sw, message=None): + '''Initialize. + sw -- SoapWriter + ''' + assert message is None, 'TODO' + self._etree = None + + def __str__(self): + return self.toString() + + def toString(self): + return ElementTree.tostring(self._etree) + + ############################################# + #Methods used in TypeCodes + ############################################# + def createAppendElement(self, namespaceURI, localName, prefix=None): + '''Create a new element (namespaceURI,name), append it + to current node, and return the newly created node. + Keyword arguments: + namespaceURI -- namespace of element to create + localName -- local name of new element + prefix -- if namespaceURI is not defined, declare prefix. defaults + to 'ns1' if left unspecified. + ''' + assert prefix is None, 'TODO: can really do this' + e = ElementTree.Element("{%s}%s" %(namespaceURI, localName)) + self._etree.append(e) + + eproxy = ElementTreeProxy(None) + eproxy._etree = e + return eproxy + + def createAppendTextNode(self, pyobj): + '''TODO: obviously mixed text content cannot be accurately + represented via this interface. Only 1 possible text node/element + ''' + self._etree.text = pyobj + + def createDocument(self, namespaceURI, localName): + self._etree = ElementTree.Element('{%s}%s' %(namespaceURI, localName)) + + def getElement(self, namespaceURI, localName): + for e in self._etree.getchildren(): + l = e.tag.strip('{').split('}') + if not namespaceURI: + if len(l) == 1 and l[0] == localName: + eproxy = ElementTreeProxy(None) + eproxy._etree = e + return eproxy + elif len(l) == 2 and l[0] == namespaceURI and l[1] == localName: + eproxy = ElementTreeProxy(None) + eproxy._etree = e + return eproxy + + raise ElementProxyException,\ + 'No such element(%s,%s)' %(namespaceURI,localName) + + def getPrefix(self, namespaceURI): + '''TODO: this is not possible w/elementTree since namespace prefix + mappings aren't done until serialization. completely abstraced out. + ''' + raise NotImplementedError, 'this func isnt going to work' + + def setAttributeNS(self, namespaceURI, localName, value): + ''' + Keyword arguments: + namespaceURI -- namespace of attribute to create, None is for + attributes in no namespace. + localName -- local name of new attribute + value -- value of new attribute + ''' + self._etree.attrib["{%s}%s" %(namespaceURI, localName)] = value + + def setAttributeType(self, namespaceURI, localName): + '''xsi:type attribute, value must be a QName + ''' + self.setAttributeNS(SCHEMA.XSI3, 'type', + ElementTree.QName('{%s}%s' %(namespaceURI,localName)) + ) + + def setNamespaceAttribute(self, prefix, namespaceURI): + '''TODO: Not sure how to force this to be used by ElementTree + Keyword arguments: + prefix -- xmlns prefix + namespaceURI -- value of prefix + ''' + self._etree.attrib["xmlns:%s" %prefix] = namespaceURI Modified: branches/zsi-element-tree/ZSI/parse.py =================================================================== --- branches/zsi-element-tree/ZSI/parse.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/ZSI/parse.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -13,7 +13,7 @@ import types from ZSI.wstools.Namespaces import SOAP, XMLNS -from ZSI.wstools.Utility import SplitQName +#from ZSI.wstools.Utility import SplitQName #_find_actor = lambda E: E.getAttributeNS(SOAP.ENV, "actor") or None #_find_mu = lambda E: E.getAttributeNS(SOAP.ENV, "mustUnderstand") @@ -103,9 +103,6 @@ # raise ParseException('Document has "' + elt.localName + \ # '" element, not Envelope', 0) if _get_element_nsuri_name(elt) != (SOAP.ENV, "Envelope"): - print "X: ", _get_element_nsuri_name(elt) != (SOAP.ENV, "Envelope") - print "A: ",_get_element_nsuri_name(elt) - print "V: ",(SOAP.ENV, "Envelope") raise ParseException('Document has "' + \ str(_get_element_nsuri_name(elt)) + \ '" element, not Envelope', 0) @@ -388,11 +385,11 @@ v = [] occurs = 0 namespaceURI,tagName = what.nspname,what.pname - for j,c_elt in [ (j, c[j]) for j in crange if c[j] ]: + for j,c_elt in [ (j, c[j]) for j in crange if c[j] is not None]: # prefix,name = SplitQName(c_elt.tagName) # nsuri = _resolve_prefix(c_elt, prefix) # if tagName == name and namespaceURI == nsuri: - if _get_element_nsuri_name(c_elt) == (nsuri, name): + if _get_element_nsuri_name(c_elt) == (namespaceURI,tagName): pyobj = what.parse(c_elt, self) else: continue Modified: branches/zsi-element-tree/test/wsdl2py/servers/EchoServer.py =================================================================== --- branches/zsi-element-tree/test/wsdl2py/servers/EchoServer.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/test/wsdl2py/servers/EchoServer.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -5,6 +5,8 @@ ########################################################################### import sys from ZSI.ServiceContainer import AsServer +from ZSI.wstools.logging import setBasicLoggerDEBUG +setBasicLoggerDEBUG() from EchoServer_server import EchoServer """ @@ -18,7 +20,7 @@ class Service(EchoServer): def soap_Echo(self, ps): response = EchoServer.soap_Echo(self, ps) - response.EchoResult = self.request.EchoIn + response.EchoResult = self.request.EchoIn or "NO ECHO??" return response Modified: branches/zsi-element-tree/test/wsdl2py/test_EchoWSAddr200403.py =================================================================== --- branches/zsi-element-tree/test/wsdl2py/test_EchoWSAddr200403.py 2007-06-04 21:56:51 UTC (rev 1387) +++ branches/zsi-element-tree/test/wsdl2py/test_EchoWSAddr200403.py 2007-06-05 04:48:41 UTC (rev 1388) @@ -5,7 +5,7 @@ ########################################################################### import os, sys, unittest from ServiceTest import main, ServiceTestCase, ServiceTestSuite -from ZSI import FaultException, TC +from ZSI import ParsedSoap, FaultException, TC from ZSI.schema import GED, GTD """ @@ -55,10 +55,27 @@ kw['wsAddressURI'] = 'http://schemas.xmlsoap.org/ws/2004/03/addressing' return kw - def test_local_Echo(self): + def Xtest_local_Echo(self): msg = self.client_module.EchoRequest() rsp = self.client_module.EchoResponse() + def test_local_EPR(self): + MSG = """ +<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"><soapenv:Header><wsa:MessageID soapenv:mustUnderstand="0">uuid:61f126b0-12ef-11dc-9fd4-a15ae8e2e52b</wsa:MessageID><wsa:To soapenv:mustUnderstand="0">http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:To><wsa:Action soapenv:mustUnderstand="0">http://counter.com/CounterPortType/createCounterResponse</wsa:Action><wsa:From soapenv:mustUnderstand="0"><wsa:Address>http://192.168.15.4:8080/wsrf/services/CounterService</wsa:Address></wsa:From><wsa:RelatesTo RelationshipType="wsa:Reply" soapenv:mustUnderstand="0">uuid:1180998026.34</wsa:RelatesTo></soapenv:Header><soapenv:Body> + <wsa:EndpointReference> + <wsa:Address>http://192.168.15.4:8080/wsrf/services/CounterService</wsa:Address> + <wsa:ReferenceProperties><CounterKey>21201606</CounterKey></wsa:ReferenceProperties> + <wsa:ReferenceParameters/> + </wsa:EndpointReference> +</soapenv:Body></soapenv:Envelope> +""" + ps = ParsedSoap(MSG) + pyobj = ps.Parse( GED('http://schemas.xmlsoap.org/ws/2004/03/addressing','EndpointReference') ) + print "PYOBJ: ", pyobj + print "\t", pyobj.Address + print "\t", pyobj.ReferenceProperties + print "\t", pyobj.ReferenceProperties.Any + def test_dispatch_Echo(self): loc = self.client_module.EchoWSAddr200403ServerLocator() port = loc.getport(**self.getPortKWArgs()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |