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);
  	}  
  }