You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by gd...@locus.apache.org on 2000/09/05 05:48:17 UTC
cvs commit: xml-soap/java/src/org/apache/soap/encoding/soapenc QNameSerializer.java
gdaniels 00/09/04 20:48:17
Added: java/src/org/apache/soap/encoding/soapenc
QNameSerializer.java
Log:
Add support for serializing/deserializing QNames. I couldn't find a reference
for a standard way to do this, so I write a given QName as:
<elementName [nsdecl] xsi:type="xsd:QName">ns:localPart</elementName>
(where [nsdecl] is an optional declaration of the "ns" prefix if the namespaceURI
of the QName doesn't already have a prefix in scope)
Revision Changes Path
1.1 xml-soap/java/src/org/apache/soap/encoding/soapenc/QNameSerializer.java
Index: QNameSerializer.java
===================================================================
package org.apache.soap.encoding.soapenc;
import org.apache.soap.Constants;
import org.apache.soap.util.Bean;
import org.apache.soap.util.xml.*;
import org.w3c.dom.*;
import java.io.*;
/** A QNameSerializer serializes a QName as follows:
* <elementName xmlns:ns="QNameURIPart">ns:QNameLocalPart</elementName>
*/
public class QNameSerializer implements Serializer, Deserializer
{
public void marshall(String inScopeEncStyle, Class javaType, Object src,
Object context, Writer sink, NSStack nsStack,
XMLJavaMappingRegistry xjmr)
throws IllegalArgumentException, IOException
{
sink.write('<' + context.toString());
QName qName = (QName)src;
// Make sure our namespace has a valid prefix in this doc.
String prefix = nsStack.getPrefixFromURI(qName.getNamespaceURI(), sink);
QName elementType = xjmr.queryElementType(javaType,
Constants.NS_URI_SOAP_ENC);
String xsiNSPrefix =
nsStack.getPrefixFromURI(Constants.NS_URI_SCHEMA_XSI, sink);
String elementTypeNSPrefix =
nsStack.getPrefixFromURI(elementType.getNamespaceURI(), sink);
sink.write(' ' + xsiNSPrefix + ':' + Constants.ATTR_TYPE + "=\"" +
elementTypeNSPrefix + ':' +
elementType.getLocalPart() + '\"');
sink.write('>' + prefix + ':' + qName.getLocalPart());
sink.write("</" + context.toString() + '>');
}
public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src,
XMLJavaMappingRegistry xjmr)
throws IllegalArgumentException
{
Element root = (Element)src;
String value = DOMUtils.getChildCharacterData(root);
int idx = value.indexOf(":");
if (idx <= 0)
throw new IllegalArgumentException("No NamespaceURI while deserializing QName");
String prefix = value.substring(0,idx);
String uri = DOMUtils.getNamespaceURIFromPrefix(src, prefix);
QName qName = new QName(uri, value.substring(idx + 1));
System.err.println(">> Unpacked QName '" + qName + "'");
return new Bean(QName.class, qName);
}
}