FileDocCategorySizeDatePackage
DeserializationContext.javaAPI DocApache Axis 1.440717Sat Apr 22 18:57:28 BST 2006org.apache.axis.encoding

DeserializationContext

public class DeserializationContext extends DefaultHandler implements LexicalHandler, javax.xml.rpc.encoding.DeserializationContext
This interface describes the AXIS DeserializationContext, note that an AXIS compliant DeserializationContext must extend the org.xml.sax.helpers.DefaultHandler.

Fields Summary
protected static Log
log
private final boolean
debugEnabled
static final org.apache.axis.schema.SchemaVersion[]
schemaVersions
private org.apache.axis.utils.NSStack
namespaces
private Locator
locator
private Class
destClass
private org.apache.axis.message.SOAPHandler
topHandler
private ArrayList
pushedDownHandlers
private org.apache.axis.message.SAX2EventRecorder
recorder
private org.apache.axis.message.SOAPEnvelope
envelope
private HashMap
idMap
private LocalIDResolver
localIDs
private HashMap
fixups
static final org.apache.axis.message.SOAPHandler
nullHandler
protected org.apache.axis.MessageContext
msgContext
private boolean
doneParsing
protected InputSource
inputSource
private org.apache.axis.message.MessageElement
curElement
protected int
startOfMappingsPos
private static final Class[]
DESERIALIZER_CLASSES
private static final String
DESERIALIZER_METHOD
protected boolean
haveSeenSchemaNS
private org.apache.axis.soap.SOAPConstants
soapConstants
boolean
processingRef
private static final NullLexicalHandler
nullLexicalHandler
We only need one instance of this dummy handler to set into the parsers.
Constructors Summary
public DeserializationContext(org.apache.axis.MessageContext ctx, org.apache.axis.message.SOAPHandler initialHandler)
Construct Deserializer using MessageContext and EnvelopeBuilder handler

param
ctx is the MessageContext
param
initialHandler is the EnvelopeBuilder handler

        msgContext = ctx;

        // If high fidelity is required, record the whole damn thing.
        if (ctx == null || ctx.isHighFidelity())
            recorder = new SAX2EventRecorder();

        if (initialHandler instanceof EnvelopeBuilder) {
            envelope = ((EnvelopeBuilder)initialHandler).getEnvelope();
            envelope.setRecorder(recorder);
        }

        pushElementHandler(new EnvelopeHandler(initialHandler));
    
public DeserializationContext(InputSource is, org.apache.axis.MessageContext ctx, String messageType)
Construct Deserializer

param
is is the InputSource
param
ctx is the MessageContext
param
messageType is the MessageType to construct an EnvelopeBuilder

        msgContext = ctx;
        EnvelopeBuilder builder = new EnvelopeBuilder(messageType, ctx != null ? ctx.getSOAPConstants() : null);
        // If high fidelity is required, record the whole damn thing.
        if (ctx == null || ctx.isHighFidelity())
            recorder = new SAX2EventRecorder();

        envelope = builder.getEnvelope();
        envelope.setRecorder(recorder);

        pushElementHandler(new EnvelopeHandler(builder));

        inputSource = is;
    
public DeserializationContext(InputSource is, org.apache.axis.MessageContext ctx, String messageType, org.apache.axis.message.SOAPEnvelope env)
Construct Deserializer

param
is is the InputSource
param
ctx is the MessageContext
param
messageType is the MessageType to construct an EnvelopeBuilder
param
env is the SOAPEnvelope to construct an EnvelopeBuilder

        EnvelopeBuilder builder = new EnvelopeBuilder(env, messageType);

        msgContext = ctx;

        // If high fidelity is required, record the whole damn thing.
        if (ctx == null || ctx.isHighFidelity())
            recorder = new SAX2EventRecorder();

        envelope = builder.getEnvelope();
        envelope.setRecorder(recorder);

        pushElementHandler(new EnvelopeHandler(builder));

        inputSource = is;
    
Methods Summary
public voidaddObjectById(java.lang.String id, java.lang.Object obj)
Add the object associated with this id (where id is the value of an id= attribute, i.e. it does not start with #). This routine is called to associate the deserialized object with the id specified on the XML element.

param
id (id name without the #)
param
obj is the deserialized object for this id.

        // The resolver uses the href syntax as the key.
        String idStr = '#" + id;
        if ((idMap == null) || (id == null))
            return ;

        IDResolver resolver = (IDResolver)idMap.get(idStr);
        if (resolver == null)
            return ;

        resolver.addReferencedObject(idStr, obj);
        return;
    
public voidcharacters(char[] p1, int p2, int p3)

        if (!doneParsing && (recorder != null)) {
            recorder.characters(p1, p2, p3);
        }
        if (topHandler != null) {
            topHandler.characters(p1, p2, p3);
        }
    
public voidcomment(char[] ch, int start, int length)

        if (recorder != null)
            recorder.comment(ch, start, length);
    
public voiddeserializing(boolean isDeserializing)


        
        doneParsing = isDeserializing;
    
public voidendCDATA()

        if (recorder != null)
            recorder.endCDATA();
    
public voidendDTD()

        if (recorder != null)
            recorder.endDTD();
    
public voidendDocument()
endDocument is invoked at the end of the document.

        if (debugEnabled) {
            log.debug("Enter: DeserializationContext::endDocument()");
        }
        if (!doneParsing && (recorder != null))
            recorder.endDocument();

        doneParsing = true;

        if (debugEnabled) {
            log.debug("Exit: DeserializationContext::endDocument()");
        }
    
public voidendElement(java.lang.String namespace, java.lang.String localName, java.lang.String qName)
endElement is called at the end tag of an element

        if (debugEnabled) {
            log.debug("Enter: DeserializationContext::endElement(" + namespace + ", " + localName + ")");
        }

        if (!doneParsing && (recorder != null)) {
            recorder.endElement(namespace, localName, qName);
        }

        try {
            SOAPHandler handler = popElementHandler();
            handler.endElement(namespace, localName, this);

            if (topHandler != null) {
                topHandler.onEndChild(namespace, localName, this);
            } else {
                // We should be done!
            }

        } finally {
            if (curElement != null) {
                curElement = (MessageElement)curElement.getParentElement();
            }

            namespaces.pop();

            if (debugEnabled) {
                String name = curElement != null ?
                        curElement.getClass().getName() + ":" +
                        curElement.getName() : null;
                log.debug("Popped element stack to " + name);
                log.debug("Exit: DeserializationContext::endElement()");
            }
        }
    
public voidendEntity(java.lang.String name)

        if (recorder != null)
            recorder.endEntity(name);
    
public voidendPrefixMapping(java.lang.String prefix)

        if (debugEnabled) {
            log.debug("Enter: DeserializationContext::endPrefixMapping(" + prefix + ")");
        }

        if (!doneParsing && (recorder != null)) {
            recorder.endPrefixMapping(prefix);
        }

        if (topHandler != null) {
            topHandler.endPrefixMapping(prefix);
        }

        if (debugEnabled) {
            log.debug("Exit: DeserializationContext::endPrefixMapping()");
        }
    
public org.apache.axis.message.MessageElementgetCurElement()
Get current MessageElement

        return curElement;
    
public java.util.ArrayListgetCurrentNSMappings()
Get the Namespace Mappings. Returns null if none are present.

        return namespaces.cloneFrame();
    
public intgetCurrentRecordPos()
Get the current position in the record.

        if (recorder == null) return -1;
        return recorder.getLength() - 1;
    
public final DeserializergetDeserializer(java.lang.Class cls, javax.xml.namespace.QName xmlType)
Get a Deserializer which can turn a given xml type into a given Java type

        if (xmlType == null)
            return null;

        DeserializerFactory dserF = null;
        Deserializer dser = null;
        try {
            dserF = (DeserializerFactory) getTypeMapping().
                    getDeserializer(cls, xmlType);
        } catch (JAXRPCException e) {
            log.error(Messages.getMessage("noFactory00", xmlType.toString()));
        }
        if (dserF != null) {
            try {
                dser = (Deserializer) dserF.getDeserializerAs(Constants.AXIS_SAX);
            } catch (JAXRPCException e) {
                log.error(Messages.getMessage("noDeser00", xmlType.toString()));
            }
        }
        return dser;
    
public DeserializergetDeserializerForClass(java.lang.Class cls)
Convenience method to get the Deserializer for a specific java class from its meta data.

param
cls is the Class used to find the deserializer
return
Deserializer

        if (cls == null) {
           cls = destClass;
        }
        if (cls == null) {
            return null;
        }
//        if (cls.isArray()) {
//            cls = cls.getComponentType();
//        }
        if (javax.xml.rpc.holders.Holder.class.isAssignableFrom(cls)) {
            try {
                cls = cls.getField("value").getType();
            } catch (Exception e) {
            }
        }

        Deserializer dser = null;

        QName type = getTypeMapping().getTypeQName(cls);
        dser = getDeserializer(cls, type);
        if (dser != null)
            return dser;

        try {
            Method method = 
                MethodCache.getInstance().getMethod(cls,
                                                    DESERIALIZER_METHOD, 
                                                    DESERIALIZER_CLASSES);     
            if (method != null) {
                TypeDesc typedesc = TypeDesc.getTypeDescForClass(cls);
                if (typedesc != null) {
                    dser = (Deserializer) method.invoke(null,
                        new Object[] {getEncodingStyle(), cls, typedesc.getXmlType()});
                }
            }
        } catch (Exception e) {
            log.error(Messages.getMessage("noDeser00", cls.getName()));
        }
        return dser;
    
public final DeserializergetDeserializerForType(javax.xml.namespace.QName xmlType)
Convenience method to get the Deserializer for a specific xmlType.

param
xmlType is QName for a type to deserialize
return
Deserializer

        return getDeserializer(null, xmlType);
    
public java.lang.ClassgetDestinationClass()
Allows the destination class to be retrieved so that downstream deserializers like ArrayDeserializer can pick it up when deserializing its components using getDeserializerForClass

return
the Class of the component to be deserialized

        return destClass;
    
public org.xml.sax.LocatorgetDocumentLocator()

        return locator;
    
public org.apache.axis.message.MessageElementgetElementByID(java.lang.String id)
Get the MessageElement for the indicated id (where id is the #value of an href) If the MessageElement has not been processed, the MessageElement will be returned. If the MessageElement has been processed, the actual object value is stored with the id and this routine will return null.

param
id is the value of an href attribute
return
MessageElement or null

        if((idMap !=  null)) {
            IDResolver resolver = (IDResolver)idMap.get(id);
            if(resolver != null) {
                Object ret = resolver.getReferencedObject(id);
                if (ret instanceof MessageElement)
                    return (MessageElement)ret;
            }
        }

        return null;
    
public java.lang.StringgetEncodingStyle()
Returns this context's encoding style. If we've got a message context then we'll get the style from that; otherwise we'll return a default.

return
a String value

        return msgContext == null ?
                Use.ENCODED.getEncoding() : msgContext.getEncodingStyle();
    
public org.apache.axis.message.SOAPEnvelopegetEnvelope()
Get Envelope

        return envelope;
    
public org.apache.axis.MessageContextgetMessageContext()
Get MessageContext

        return msgContext;
    
public java.lang.StringgetNamespaceURI(java.lang.String prefix)
Get the Namespace for a particular prefix

        String result = namespaces.getNamespaceURI(prefix);
        if (result != null)
            return result;

        if (curElement != null)
            return curElement.getNamespaceURI(prefix);

        return null;
    
public java.lang.ObjectgetObjectByRef(java.lang.String href)
Gets the MessageElement or actual Object value associated with the href value. The return of a MessageElement indicates that the referenced element has not been processed. If it is not a MessageElement, the Object is the actual deserialized value. In addition, this method is invoked to get Object values via Attachments.

param
href is the value of an href attribute (or an Attachment id)
return
MessageElement other Object or null

        Object ret= null;
        if(href != null){
            if((idMap !=  null)){
                IDResolver resolver = (IDResolver)idMap.get(href);
                if(resolver != null)
                   ret = resolver.getReferencedObject(href);
            }
            if( null == ret && !href.startsWith("#")){
                //Could this be an attachment?
                Message msg= null;
                if(null != (msg=msgContext.getCurrentMessage())){
                    Attachments attch= null;
                    if( null != (attch= msg.getAttachmentsImpl())){
                        try{
                        ret= attch.getAttachmentByReference(href);
                        }catch(AxisFault e){
                            throw new RuntimeException(e.toString() + JavaUtils.stackToString(e));
                        }
                    }
                }
            }
        }

        return ret;
    
public javax.xml.namespace.QNamegetQNameFromString(java.lang.String qNameStr)
Construct a QName from a string of the form :

param
qNameStr is the prefixed name from the xml text
return
QName

        if (qNameStr == null)
            return null;

        // OK, this is a QName, so look up the prefix in our current mappings.
        int i = qNameStr.indexOf(':");
        String nsURI;
        if (i == -1) {
            nsURI = getNamespaceURI("");
        } else {
            nsURI = getNamespaceURI(qNameStr.substring(0, i));
        }

        return new QName(nsURI, qNameStr.substring(i + 1));
    
public org.apache.axis.message.SAX2EventRecordergetRecorder()
Get Event Recorder

        return recorder;
    
public org.apache.axis.soap.SOAPConstantsgetSOAPConstants()
returns the soap constants.


             
      
        if (soapConstants != null)
            return soapConstants;
        if (msgContext != null) {
            soapConstants = msgContext.getSOAPConstants();
            return soapConstants;
        } else {
            return Constants.DEFAULT_SOAP_VERSION;
        }
    
public intgetStartOfMappingsPos()
Get the start of the mapping position

        if (startOfMappingsPos == -1) {
            return getCurrentRecordPos() + 1;
        }

        return startOfMappingsPos;
    
public javax.xml.namespace.QNamegetTypeFromAttributes(java.lang.String namespace, java.lang.String localName, org.xml.sax.Attributes attrs)
Create a QName for the type of the element defined by localName and namespace with the specified attributes.

param
namespace of the element
param
localName is the local name of the element
param
attrs are the attributes on the element

        QName typeQName = getTypeFromXSITypeAttr(namespace, localName, attrs);
        if ( (typeQName == null) && Constants.isSOAP_ENC(namespace) ) {

            // If the element is a SOAP-ENC element, the name of the element is the type.
            // If the default type mapping accepts SOAP 1.2, then use then set
            // the typeQName to the SOAP-ENC type.
            // Else if the default type mapping accepts SOAP 1.1, then
            // convert the SOAP-ENC type to the appropriate XSD Schema Type.
            if (namespace.equals(Constants.URI_SOAP12_ENC)) {
                typeQName = new QName(namespace, localName);
            } else if (localName.equals(Constants.SOAP_ARRAY.getLocalPart())) {
                typeQName = Constants.SOAP_ARRAY;
            } else if (localName.equals(Constants.SOAP_STRING.getLocalPart())) {
                typeQName = Constants.SOAP_STRING;
            } else if (localName.equals(Constants.SOAP_BOOLEAN.getLocalPart())) {
                typeQName = Constants.SOAP_BOOLEAN;
            } else if (localName.equals(Constants.SOAP_DOUBLE.getLocalPart())) {
                typeQName = Constants.SOAP_DOUBLE;
            } else if (localName.equals(Constants.SOAP_FLOAT.getLocalPart())) {
                typeQName = Constants.SOAP_FLOAT;
            } else if (localName.equals(Constants.SOAP_INT.getLocalPart())) {
                typeQName = Constants.SOAP_INT;
            } else if (localName.equals(Constants.SOAP_LONG.getLocalPart())) {
                typeQName = Constants.SOAP_LONG;
            } else if (localName.equals(Constants.SOAP_SHORT.getLocalPart())) {
                typeQName = Constants.SOAP_SHORT;
            } else if (localName.equals(Constants.SOAP_BYTE.getLocalPart())) {
                typeQName = Constants.SOAP_BYTE;
            }
        }

        // If we still have no luck, check to see if there's an arrayType
        // (itemType for SOAP 1.2) attribute, in which case this is almost
        // certainly an array.

        if (typeQName == null && attrs != null) {
            String encURI = getSOAPConstants().getEncodingURI();
            String itemType = getSOAPConstants().getAttrItemType();
            for (int i = 0; i < attrs.getLength(); i++) {
                if (encURI.equals(attrs.getURI(i)) &&
                        itemType.equals(attrs.getLocalName(i))) {
                    return new QName(encURI, "Array");
                }
            }
        }

        return typeQName;
    
public javax.xml.namespace.QNamegetTypeFromXSITypeAttr(java.lang.String namespace, java.lang.String localName, org.xml.sax.Attributes attrs)
Create a QName for the type of the element defined by localName and namespace from the XSI type.

param
namespace of the element
param
localName is the local name of the element
param
attrs are the attributes on the element

        // Check for type
        String type = Constants.getValue(attrs, Constants.URIS_SCHEMA_XSI,
                                         "type");
        if (type != null) {
            // Return the type attribute value converted to a QName
            return getQNameFromString(type);
        }
        return null;
    
public TypeMappinggetTypeMapping()
Get the TypeMapping for this DeserializationContext

        if (msgContext == null || msgContext.getTypeMappingRegistry() == null) {
            return (TypeMapping) new org.apache.axis.encoding.TypeMappingRegistryImpl().getTypeMapping(
                    null);
        }
        TypeMappingRegistry tmr = msgContext.getTypeMappingRegistry();
        return (TypeMapping) tmr.getTypeMapping(getEncodingStyle());
    
public TypeMappingRegistrygetTypeMappingRegistry()
Get the TypeMappingRegistry we're using.

return
TypeMapping or null

        return msgContext.getTypeMappingRegistry();
    
public booleanhasElementsByID()
Return true if any ids are being tracked by this DeserializationContext

return
true if any ides are being tracked by this DeserializationContext

        return idMap == null ? false : idMap.size() > 0;
    
public voidignorableWhitespace(char[] p1, int p2, int p3)

        if (!doneParsing && (recorder != null)) {
            recorder.ignorableWhitespace(p1, p2, p3);
        }
        if (topHandler != null) {
            topHandler.ignorableWhitespace(p1, p2, p3);
        }
    
public booleanisDoneParsing()
Return if done parsing document.

return doneParsing;
public booleanisNil(org.xml.sax.Attributes attrs)
Convenenience method that returns true if the value is nil (due to the xsi:nil) attribute.

param
attrs are the element attributes.
return
true if xsi:nil is true

        return JavaUtils.isTrueExplicitly(
                    Constants.getValue(attrs, Constants.QNAMES_NIL),
                    false);
    
public booleanisProcessingRef()

        return processingRef;
    
public voidparse()
Create a parser and parse the inputSource

        if (inputSource != null) {
            SAXParser parser = XMLUtils.getSAXParser();
            try {
                parser.setProperty("http://xml.org/sax/properties/lexical-handler", this);
                parser.parse(inputSource, this);

                try {
                    // cleanup - so that the parser can be reused.
                    parser.setProperty("http://xml.org/sax/properties/lexical-handler", nullLexicalHandler);
                } catch (Exception e){
                    // Ignore.
                }

                // only release the parser for reuse if there wasn't an
                // error.  While parsers should be reusable, don't trust
                // parsers that died to clean up appropriately.
                XMLUtils.releaseSAXParser(parser);
            } catch (IOException e) {
                throw new SAXException(e);
            }
            inputSource = null;
        }
    
public org.apache.axis.message.SOAPHandlerpopElementHandler()

        SOAPHandler result = topHandler;

        int size = pushedDownHandlers.size();
        if (size > 0) {
            topHandler = (SOAPHandler) pushedDownHandlers.remove(size-1);
        } else {
            topHandler = null;
        }

        if (debugEnabled) {
            if (result == null) {
                log.debug(Messages.getMessage("popHandler00", "(null)"));
            } else {
                log.debug(Messages.getMessage("popHandler00", "" + result));
            }
        }

        return result;
    
public voidprocessingInstruction(java.lang.String p1, java.lang.String p2)

        // must throw an error since SOAP 1.1 doesn't allow
        // processing instructions anywhere in the message
        throw new SAXException(Messages.getMessage("noInstructions00"));
    
public voidpushElementHandler(org.apache.axis.message.SOAPHandler handler)
Management of sub-handlers (deserializers)

        if (debugEnabled) {
            log.debug(Messages.getMessage("pushHandler00", "" + handler));
        }

        if (topHandler != null) pushedDownHandlers.add(topHandler);
        topHandler = handler;
    
public voidpushNewElement(org.apache.axis.message.MessageElement elem)
Push the MessageElement into the recorder

        if (debugEnabled) {
            log.debug("Pushing element " + elem.getName());
        }

        if (!doneParsing && (recorder != null)) {
            recorder.newElement(elem);
        }

        try {
            if(curElement != null)
                elem.setParentElement(curElement);
        } catch (Exception e) {
            /*
             * The only checked exception that may be thrown from setParent
             * occurs if the parent already has an explicit object value,
             * which should never occur during deserialization.
             */
            log.fatal(Messages.getMessage("exception00"), e);
        }
        curElement = elem;

        if (elem.getRecorder() != recorder)
            recorder = elem.getRecorder();
    
public voidregisterElementByID(java.lang.String id, org.apache.axis.message.MessageElement elem)
Register the MessageElement with this id (where id is id= form without the #) This routine is called when the MessageElement with an id is read. If there is a Deserializer in our fixup list (described above), the 'fixup' deserializer is given to the MessageElement. When the MessageElement is completed, the 'fixup' deserializer is informed and it can set its targets.

param
id (id name without the #)
param
elem is the MessageElement

        if (localIDs == null)
            localIDs = new LocalIDResolver();

        String absID = '#" + id;

        localIDs.addReferencedObject(absID, elem);

        registerResolverForID(absID, localIDs);

        if (fixups != null) {
            Deserializer dser = (Deserializer)fixups.get(absID);
            if (dser != null) {
                elem.setFixupDeserializer(dser);
            }
        }
    
public voidregisterFixup(java.lang.String href, Deserializer dser)
During deserialization, an element with an href=#id may be encountered before the element defining id=id is read. In these cases, the getObjectByRef method above will return null. The deserializer is placed in a table keyed by href (a fixup table). After the element id is processed, the deserializer is informed of the value so that it can update its target(s) with the value.

param
href (#id syntax)
param
dser is the deserializer of the element

        if (fixups == null)
            fixups = new HashMap();

        Deserializer prev = (Deserializer) fixups.put(href, dser);

        // There could already be a deserializer in the fixup list
        // for this href.  If so, the easiest way to get all of the
        // targets updated is to move the previous deserializers
        // targets to dser.
        if (prev != null && prev != dser) {
            dser.moveValueTargets(prev);
            if (dser.getDefaultType() == null) {
                dser.setDefaultType(prev.getDefaultType());
            }
        }
    
public voidregisterResolverForID(java.lang.String id, org.apache.axis.message.IDResolver resolver)
Each id can have its own kind of resolver. This registers a resolver for the id.

        if ((id == null) || (resolver == null)) {
            // ??? Throw nullPointerException?
            return;
        }

        if (idMap == null)
            idMap = new HashMap();

        idMap.put(id, resolver);
    
public voidreplaceElementHandler(org.apache.axis.message.SOAPHandler handler)
Replace the handler at the top of the stack. This is only used when we have a placeholder Deserializer for a referenced object which doesn't know its type until we hit the referent.

        topHandler = handler;
    
public org.xml.sax.InputSourceresolveEntity(java.lang.String publicId, java.lang.String systemId)

        return XMLUtils.getEmptyInputSource();
    
public voidsetCurElement(org.apache.axis.message.MessageElement el)
Set current MessageElement

        curElement = el;
        if (curElement != null && curElement.getRecorder() != recorder) {
            recorder = curElement.getRecorder();
        }
    
public voidsetDestinationClass(java.lang.Class destClass)
Allows the destination class to be set so that downstream deserializers like ArrayDeserializer can pick it up when deserializing its components using getDeserializerForClass

param
destClass is the Class of the component to be deserialized

        this.destClass = destClass;
    
public voidsetDocumentLocator(org.xml.sax.Locator locator)

        if (!doneParsing && (recorder != null)) {
            recorder.setDocumentLocator(locator);
        }
        this.locator = locator;
    
public voidsetProcessingRef(boolean ref)

        
        processingRef = ref;
    
public voidsetRecorder(org.apache.axis.message.SAX2EventRecorder recorder)
Set Event Recorder

        this.recorder = recorder;
    
public voidskippedEntity(java.lang.String p1)

        if (!doneParsing && (recorder != null)) {
            recorder.skippedEntity(p1);
        }
        topHandler.skippedEntity(p1);
    
public voidstartCDATA()

        if (recorder != null)
            recorder.startCDATA();
    
public voidstartDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)

        /* It is possible for a malicious user to send us bad stuff in
           the <!DOCTYPE ../> tag that will cause a denial of service
           Example:
           <?xml version="1.0" ?>
            <!DOCTYPE foobar [
                <!ENTITY x0 "hello">
                <!ENTITY x1 "&x0;&x0;">
                <!ENTITY x2 "&x1;&x1;">
                  ...
                <!ENTITY x99 "&x98;&x98;">
                <!ENTITY x100 "&x99;&x99;">
            ]>
        */
        throw new SAXException(Messages.getMessage("noInstructions00"));
        /* if (recorder != null)
            recorder.startDTD(name, publicId, systemId);
        */
    
public voidstartDocument()
SAX event handlers

        // Should never receive this in the midst of a parse.
        if (!doneParsing && (recorder != null))
            recorder.startDocument();
    
public voidstartElement(java.lang.String namespace, java.lang.String localName, java.lang.String qName, org.xml.sax.Attributes attributes)
startElement is called when an element is read. This is the big work-horse. This guy also handles monitoring the recording depth if we're recording (so we know when to stop).

        if (debugEnabled) {
            log.debug("Enter: DeserializationContext::startElement(" + namespace + ", " + localName + ")");
        }

        if (attributes == null || attributes.getLength() == 0) {
            attributes = NullAttributes.singleton;
        } else {
            attributes = new AttributesImpl(attributes);

            SOAPConstants soapConstants = getSOAPConstants();
            if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
                if (attributes.getValue(soapConstants.getAttrHref()) != null &&
                    attributes.getValue(Constants.ATTR_ID) != null) {

                    AxisFault fault = new AxisFault(Constants.FAULT_SOAP12_SENDER,
                        null, Messages.getMessage("noIDandHREFonSameElement"), null, null, null);

                    throw new SAXException(fault);

                }
            }

        }

        SOAPHandler nextHandler = null;

        String prefix = "";
        int idx = qName.indexOf(':");
        if (idx > 0) {
            prefix = qName.substring(0, idx);
        }

        if (topHandler != null) {
            nextHandler = topHandler.onStartChild(namespace,
                                                       localName,
                                                       prefix,
                                                       attributes,
                                                       this);
        }

        if (nextHandler == null) {
            nextHandler = new SOAPHandler();
        }

        pushElementHandler(nextHandler);

        nextHandler.startElement(namespace, localName, prefix,
                                 attributes, this);

        if (!doneParsing && (recorder != null)) {
            recorder.startElement(namespace, localName, qName,
                                  attributes);
            if (!doneParsing) {
                curElement.setContentsIndex(recorder.getLength());
            }
        }

        if (startOfMappingsPos != -1) {
            startOfMappingsPos = -1;
        } else {
            // Push an empty frame if there are no mappings
            namespaces.push();
        }

        if (debugEnabled) {
            log.debug("Exit: DeserializationContext::startElement()");
        }
    
public voidstartEntity(java.lang.String name)

        if (recorder != null)
            recorder.startEntity(name);
    
public voidstartPrefixMapping(java.lang.String prefix, java.lang.String uri)
Record the current set of prefix mappings in the nsMappings table. !!! We probably want to have this mapping be associated with the MessageElements, since they may potentially need access to them long after the end of the prefix mapping here. (example: when we need to record a long string of events scanning forward in the document to find an element with a particular ID.)

        if (debugEnabled) {
            log.debug("Enter: DeserializationContext::startPrefixMapping(" + prefix + ", " + uri + ")");
        }

        if (!doneParsing && (recorder != null)) {
            recorder.startPrefixMapping(prefix, uri);
        }

        if (startOfMappingsPos == -1) {
            namespaces.push();
            startOfMappingsPos = getCurrentRecordPos();
        }

        if (prefix != null) {
            namespaces.add(uri, prefix);
        } else {
            namespaces.add(uri, "");
        }

        if (!haveSeenSchemaNS && msgContext != null) {
            // If we haven't yet seen a schema namespace, check if this
            // is one.  If so, set the SchemaVersion appropriately.
            // Hopefully the schema def is on the outermost element so we
            // get this over with quickly.
            for (int i = 0; !haveSeenSchemaNS && i < schemaVersions.length;
                 i++) {
                SchemaVersion schemaVersion = schemaVersions[i];
                if (uri.equals(schemaVersion.getXsdURI()) ||
                        uri.equals(schemaVersion.getXsiURI())) {
                    msgContext.setSchemaVersion(schemaVersion);
                    haveSeenSchemaNS = true;
                }
            }
        }

        if (topHandler != null) {
            topHandler.startPrefixMapping(prefix, uri);
        }

        if (debugEnabled) {
            log.debug("Exit: DeserializationContext::startPrefixMapping()");
        }