ó
e#ñ]c           @   sÈ   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 m
 Z
 d d l m Z e j e ƒ Z d e j j j f d „  ƒ  YZ d e j j j f d „  ƒ  YZ d	 „  Z d S(
   s[   This module contains support for generating bindings from an XML stream
using a SAX parser.iÿÿÿÿN(   t   basis(   t   XMLSchema_instancet   _SAXElementStatec           B   s­   e  Z d  Z e j j ƒ  Z d Z d Z	 d „  Z
 d „  Z d Z d Z d Z d Z d Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   sô   State required to generate bindings for a specific element.

    If the document being parsed includes references to unrecognized elements,
    a DOM instance of the element and its content is created and treated as a
    wildcard element.
    c         C   s   | |  _  d S(   sæ   Record the binding to be used for this element.

        Generally ignored, except at the top level this is the only way to
        associate a binding instance created from an xsi:type description with
        a specific element.N(   t    _SAXElementState__elementBinding(   t   selft   element_binding(    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   setElementBinding5   s    c         C   s   |  j  S(   sä   The nearest enclosing complex type definition, as used for
        resolving local element/attribute names.

        @return: An instance of L{basis.complexTypeDefinition}, or C{None} if
        the element is top-level
        (   t   _SAXElementState__enclosingCTD(   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   enclosingCTD>   s    c         K   s~   t  t |  ƒ j |   d  |  _ |  j ƒ  } t | t ƒ rz | j ƒ  |  _ | j	 |  _	 |  j	 d  k	 rz | j
 d |  _
 qz n  d  S(   Ni   (   t   superR   t   __init__t   Nonet!   _SAXElementState__bindingInstancet   parentStatet
   isinstanceR   R   t   _SAXElementState__domDocumentt   _SAXElementState__domDepth(   R   t   kwt   parent_state(    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyR
   V   s    	c         C   s   | |  _  d S(   s×   Set the enclosing complex type definition for this element.

        @param enclosing_ctd: The scope for a local element.
        @type enclosing_ctd: L{basis.complexTypeDefinition}
        @return: C{self}
        N(   R   (   R   t   enclosing_ctd(    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   setEnclosingCTD`   s    c         C   s2  i t  d 6|  j ƒ  d 6} |  j | k rQ t j j j | j |  j ƒ ƒ | d <n  | d  k rf g  } n  | | | Ž  |  _	 t
 |  j	 t j j j ƒ r¬ |  j	 j |  j ƒ  ƒ n  |  j	 j |  j ƒ xi |  j j ƒ  D]X } t j j | ƒ } | j ƒ  t j j t f k rqÏ n  |  j	 j | | j | ƒ ƒ qÏ W|  j	 S(   Nt	   _from_xmlt	   _locationt   _nil(   t   Truet   locationt   _SAXElementState__XSINilTuplet   pyxbt   bindingt	   datatypest   booleant   getValueR   R   R   t   utilst   utilityt   Locatable_mixint   _setLocationt   _setNamespaceContextt"   _SAXElementState__namespaceContextt   _SAXElementState__attributest   getNamest	   namespacet   ExpandedNamet   XMLNamespacest   XSIt   _setAttribute(   R   t   new_object_factoryt   attrst   contentR   t	   attr_namet   attr_en(    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   __constructElementj   s     
(	 c         C   s   |  j  d  k	 S(   N(   R   R   (   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt	   inDOMMode‹   s    c         C   sG   |  j  s t ‚ t j j j d |  j ƒ  ƒ |  _  d |  _ |  j | ƒ S(   sé   Actions upon first encountering an element for which we cannot create a binding.

        Invoking this transitions the parser into DOM mode, creating a new DOM
        document that will represent this element including its content.t   namespace_contexti    (	   R   t   AssertionErrorR   R    t   saxdomt   Documentt   namespaceContextR   t   startDOMElement(   R   R.   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   enterDOMModeŽ   s    !	c         C   s    |  j  d 7_  t j j j ƒ  |  _ |  j ƒ  } xi | j ƒ  D][ } t j j	 | ƒ } |  j j
 t j j j d | d | d | j | ƒ d |  j ƒ  ƒ ƒ q= Wd S(   s?   Actions upon entering an element that is part of a DOM subtree.i   t   expanded_nameR4   t   valueR   N(   R   R   R    R6   t   NamedNodeMapR&   R8   R'   R(   R)   t   _addItemt   AttrR   R   (   R   R.   t   ns_ctxt   nameR1   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyR9   ˜   s    c      	   C   s  |  j  ƒ  } t j j j d | d |  j ƒ  d |  j d |  j ƒ  ƒ } xd |  j ƒ  D]V } t	 | j
 t j j ƒ rƒ | j | j
 ƒ qR | j t j j j | j
 d | ƒƒ qR W|  j d 8_ d |  j k rï |  j j | ƒ d |  _ d |  _ n  |  j ƒ  } | j |  j ƒ  | d ƒ | S(   s>   Actions upon leaving an element that is part of a DOM subtree.R4   R;   t
   attributesR   i   i    N(   R8   R   R    R6   t   Elementt   expandedNameR&   R   R/   R   t   itemt   xmlt   domt   Nodet   appendChildt   TextR   R   R   R   t   addElementContent(   R   R@   t   elementt   infoR   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   endDOMElement¡   s    9)	c         C   s{   d |  _ | |  _ | |  _ | j ƒ  r3 | |  _ nA z- t j j j |  j	 ƒ  ƒ |  j
 | | ƒ Wd t j j j ƒ  X|  j S(   s7  Actions upon entering an element that will produce a binding instance.

        The element use is recorded.  If the type is a subclass of
        L{basis.simpleTypeDefinition}, a delayed constructor is recorded so
        the binding instance can be created upon completion of the element;
        otherwise, a binding instance is created and stored.  The attributes
        are used to initialize the binding instance (now, or upon element
        end).

        @param type_class: The Python type of the binding instance
        @type type_class: subclass of L{basis._TypeBinding_mixin}
        @param new_object_factory: A callable object that creates an instance of the C{type_class}
        @param element_decl: The element use with which the binding instance is associated.  Will be C{None} for top-level elements
        @type element_decl: L{basis.element}
        @param attrs: The XML attributes associated with the element
        @type attrs: C{xml.sax.xmlreader.Attributes}
        @return: The generated binding instance, or C{None} if creation is delayed
        N(   R   t$   _SAXElementState__delayedConstructort   _SAXElementState__elementDeclR&   t   _IsSimpleTypeContentR   R(   t   NamespaceContextt   PushContextR8   t"   _SAXElementState__constructElementt
   PopContextR   (   R   t
   type_classR-   t   element_declR.   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   startBindingElement´   s    			c      	   C   s´  |  j  d k	 rý g  } xW |  j ƒ  D]I } | j s@ | j d k	 r[ t j | j | j ƒ ‚ n  | j	 | j ƒ q" Wzw y6 t j
 j j |  j ƒ  ƒ |  j |  j  |  j | ƒ Wn: t j k
 rä } | j d k rÞ |  j ƒ  | _ n  ‚  n XWd t j
 j j ƒ  XnE xB |  j ƒ  D]4 } |  j j	 | j d | j d | j d | j ƒq
W|  j ƒ  } | d k	 r|| j |  j ƒ  |  j |  j ƒ n  |  j j ƒ  d k r§|  j j |  j ƒ n  |  j j ƒ  S(   s¦   Perform any end-of-element processing.

        For simple type instances, this creates the binding instance.
        @return: The generated binding instance
        Nt   _element_declt   _maybe_elementR   (   RO   R   R/   t   maybe_elementRW   R   t   NonElementValidationErrorRE   R   t   appendR(   RR   RS   R8   RT   R&   t   ValidationErrorRU   R   R   RK   RP   t   _elementt   _setElementR   t   _postDOMValidate(   R   t   argsRM   t   eR   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   endBindingElementÔ   s4     		"N(   t   __name__t
   __module__t   __doc__R+   t   nilt   uriTupleR   R   R   R   R   R   R   RO   R&   R   R   R
   R   RT   R3   R:   R9   RN   RX   Rd   (    (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyR      s(   					
	
!		
				 t   PyXBSAXHandlerc           B   sb   e  Z d  Z e Z e j j ƒ  Z d Z
 d Z d „  Z d Z d „  Z d „  Z d „  Z d „  Z RS(   s§  A SAX handler class which generates a binding instance for a document
    through a streaming parser.

    An example of using this to parse the document held in the (unicode) text
    value C{xmlt} is::

      import pyxb.binding.saxer
      import io

      saxer = pyxb.binding.saxer.make_parser()
      handler = saxer.getContentHandler()
      saxer.parse(io.StringIO(xmlt))
      instance = handler.rootObject()

    c         C   sU   t  |  j t j ƒ sH t  |  j t j j ƒ s3 t ‚ t j	 |  j ƒ ‚ n  |  j j
 ƒ  S(   sR  Return the binding object corresponding to the top-most
        element in the document

        @return: An instance of L{basis._TypeBinding_mixin} (most usually a
        L{basis.complexTypeDefinition}.

        @raise pyxb.[UnrecognizedDOMRootNodeError: No binding could be found to
        match the top-level element in the document.(   R   t   _PyXBSAXHandler__rootObjectR    t   _TypeBinding_mixinRF   RG   RH   R5   R   t   UnrecognizedDOMRootNodeErrorRa   (   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt
   rootObject  s    	c         C   s    t  t |  ƒ j ƒ  d |  _ |  S(   sw   Reset the state of the handler in preparation for processing a new
        document.

        @return: C{self}
        N(   R	   Rj   t   resetR   Rk   (   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyRo   !  s    	c         K   s4   | j  d t ƒ t t |  ƒ j |   |  j ƒ  d S(   s  Create a parser instance for converting XML to bindings.

        @keyword element_state_constructor: Overridden with the value
        L{_SAXElementState} before invoking the L{superclass
        constructor<pyxb.utils.saxutils.BaseSAXHandler.__init__>}.
        t   element_state_constructorN(   t
   setdefaultR   R	   Rj   R
   Ro   (   R   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyR
   +  s    c         C   s  t  t |  ƒ j | | | ƒ \ } } } } | j ƒ  rC | j | ƒ S| j ƒ  d  k	 rs | j ƒ  j | ƒ \ } }	 n d  }	 | j ƒ  } | j	 | ƒ |	 d  k	 rà | d  k rà |  j
 d  k	 s¿ t ‚ |	 j ƒ  } | d  k	 sà t ‚ n  d  }
 | d  k	 r| j | ƒ } | j ƒ  }
 n  |  j | k rat j | j |  j ƒ | |  j ƒ  |
 ƒ \ } }
 | rad  } qan  |
 d  k rz| j | ƒ S| d  k	 r| } n	 |
 j } |
 d  k	 sªt ‚ t |
 t j j j ƒ rÒ| j |
 ƒ n | j | j ƒ  ƒ | j |
 | |	 | ƒ } |  j
 d  k r| |  _
 n  d  S(   N(   R	   Rj   t   startElementNSR3   R9   R   R   t   _ElementBindingDeclForNamet   elementBindingR   Rk   R5   t   elementForNamet   typeDefinitiont   _PyXBSAXHandler__XSITypeTupleR+   t   _InterpretTypeAttributeR   t   fallbackNamespaceR:   t   Factoryt
   issubclassR   R   R    t   complexTypeDefinitionR   RX   (   R   RA   t   qnameR.   t
   this_stateR   R@   t   name_enR   RW   RV   t   did_replaceR-   t   binding_object(    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyRr   7  s@    *0		c         C   s€   t  t |  ƒ j | | ƒ } | j ƒ  r6 | j ƒ  } n | j ƒ  } | d  k	 sT t ‚ |  j d  k r| | j ƒ  r| | |  _ n  d  S(   N(	   R	   Rj   t   endElementNSR3   RN   Rd   R   R5   Rk   (   R   RA   R}   R~   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyR‚   y  s    N(   Re   Rf   Rg   t   Falset   _PyXBSAXHandler__traceR+   t   typeRi   Rw   R   t   _PyXBSAXHandler__domHandlert   _PyXBSAXHandler__domDepthRn   Rk   Ro   R
   Rr   R‚   (    (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyRj   ÷   s   		
		Bc          O   s&   | j  d t ƒ t j j j |  | Ž  S(   s€   Extend L{pyxb.utils.saxutils.make_parser} to change the default
    C{content_handler_constructor} to be L{PyXBSAXHandler}.
    t   content_handler_constructor(   Rq   Rj   R   R    t   saxutilst   make_parser(   Rb   R   (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyRŠ   ”  s    (   Rg   t   loggingt   xml.domRF   t   pyxb.namespaceR   t   pyxb.utils.saxutilst   pyxb.utils.saxdomt   pyxb.utils.utilityt   pyxb.bindingR    t   pyxb.namespace.builtinR   R+   t	   getLoggerRe   t   _logR    R‰   t   SAXElementStateR   t   BaseSAXHandlerRj   RŠ   (    (    (    sG   /data/av2000/b2b/venv/lib/python2.7/site-packages/pyxb/binding/saxer.pyt   <module>   s   Ù