Methods Summary |
---|
public void | addObjectById(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.
// 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 void | characters(char[] p1, int p2, int p3)
if (!doneParsing && (recorder != null)) {
recorder.characters(p1, p2, p3);
}
if (topHandler != null) {
topHandler.characters(p1, p2, p3);
}
|
public void | comment(char[] ch, int start, int length)
if (recorder != null)
recorder.comment(ch, start, length);
|
public void | deserializing(boolean isDeserializing)
doneParsing = isDeserializing;
|
public void | endCDATA()
if (recorder != null)
recorder.endCDATA();
|
public void | endDTD()
if (recorder != null)
recorder.endDTD();
|
public void | endDocument()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 void | endElement(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 void | endEntity(java.lang.String name)
if (recorder != null)
recorder.endEntity(name);
|
public void | endPrefixMapping(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.MessageElement | getCurElement()Get current MessageElement
return curElement;
|
public java.util.ArrayList | getCurrentNSMappings()Get the Namespace Mappings. Returns null if none are present.
return namespaces.cloneFrame();
|
public int | getCurrentRecordPos()Get the current position in the record.
if (recorder == null) return -1;
return recorder.getLength() - 1;
|
public final Deserializer | getDeserializer(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 Deserializer | getDeserializerForClass(java.lang.Class cls)Convenience method to get the Deserializer for a specific
java class from its meta data.
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 Deserializer | getDeserializerForType(javax.xml.namespace.QName xmlType)Convenience method to get the Deserializer for a specific
xmlType.
return getDeserializer(null, xmlType);
|
public java.lang.Class | getDestinationClass()Allows the destination class to be retrieved so that downstream
deserializers like ArrayDeserializer can pick it up when
deserializing its components using getDeserializerForClass
return destClass;
|
public org.xml.sax.Locator | getDocumentLocator()
return locator;
|
public org.apache.axis.message.MessageElement | getElementByID(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.
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.String | getEncodingStyle()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 msgContext == null ?
Use.ENCODED.getEncoding() : msgContext.getEncodingStyle();
|
public org.apache.axis.message.SOAPEnvelope | getEnvelope()Get Envelope
return envelope;
|
public org.apache.axis.MessageContext | getMessageContext()Get MessageContext
return msgContext;
|
public java.lang.String | getNamespaceURI(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.Object | getObjectByRef(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.
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.QName | getQNameFromString(java.lang.String qNameStr)Construct a QName from a string of the form :
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.SAX2EventRecorder | getRecorder()Get Event Recorder
return recorder;
|
public org.apache.axis.soap.SOAPConstants | getSOAPConstants()returns the soap constants.
if (soapConstants != null)
return soapConstants;
if (msgContext != null) {
soapConstants = msgContext.getSOAPConstants();
return soapConstants;
} else {
return Constants.DEFAULT_SOAP_VERSION;
}
|
public int | getStartOfMappingsPos()Get the start of the mapping position
if (startOfMappingsPos == -1) {
return getCurrentRecordPos() + 1;
}
return startOfMappingsPos;
|
public javax.xml.namespace.QName | getTypeFromAttributes(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.
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.QName | getTypeFromXSITypeAttr(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.
// 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 TypeMapping | getTypeMapping()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 TypeMappingRegistry | getTypeMappingRegistry()Get the TypeMappingRegistry we're using.
return msgContext.getTypeMappingRegistry();
|
public boolean | hasElementsByID()Return true if any ids are being tracked by this DeserializationContext
return idMap == null ? false : idMap.size() > 0;
|
public void | ignorableWhitespace(char[] p1, int p2, int p3)
if (!doneParsing && (recorder != null)) {
recorder.ignorableWhitespace(p1, p2, p3);
}
if (topHandler != null) {
topHandler.ignorableWhitespace(p1, p2, p3);
}
|
public boolean | isDoneParsing()Return if done parsing document.return doneParsing;
|
public boolean | isNil(org.xml.sax.Attributes attrs)Convenenience method that returns true if the value is nil
(due to the xsi:nil) attribute.
return JavaUtils.isTrueExplicitly(
Constants.getValue(attrs, Constants.QNAMES_NIL),
false);
|
public boolean | isProcessingRef()
return processingRef;
|
public void | parse()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.SOAPHandler | popElementHandler()
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 void | processingInstruction(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 void | pushElementHandler(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 void | pushNewElement(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 void | registerElementByID(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.
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 void | registerFixup(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.
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 void | registerResolverForID(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 void | replaceElementHandler(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.InputSource | resolveEntity(java.lang.String publicId, java.lang.String systemId)
return XMLUtils.getEmptyInputSource();
|
public void | setCurElement(org.apache.axis.message.MessageElement el)Set current MessageElement
curElement = el;
if (curElement != null && curElement.getRecorder() != recorder) {
recorder = curElement.getRecorder();
}
|
public void | setDestinationClass(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
this.destClass = destClass;
|
public void | setDocumentLocator(org.xml.sax.Locator locator)
if (!doneParsing && (recorder != null)) {
recorder.setDocumentLocator(locator);
}
this.locator = locator;
|
public void | setProcessingRef(boolean ref)
processingRef = ref;
|
public void | setRecorder(org.apache.axis.message.SAX2EventRecorder recorder)Set Event Recorder
this.recorder = recorder;
|
public void | skippedEntity(java.lang.String p1)
if (!doneParsing && (recorder != null)) {
recorder.skippedEntity(p1);
}
topHandler.skippedEntity(p1);
|
public void | startCDATA()
if (recorder != null)
recorder.startCDATA();
|
public void | startDTD(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 void | startDocument()SAX event handlers
// Should never receive this in the midst of a parse.
if (!doneParsing && (recorder != null))
recorder.startDocument();
|
public void | startElement(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 void | startEntity(java.lang.String name)
if (recorder != null)
recorder.startEntity(name);
|
public void | startPrefixMapping(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()");
}
|