You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by "KUMAR,PANKAJ (HP-Cupertino,ex1)" <pa...@hp.com> on 2003/04/14 10:02:12 UTC

RE: How to convert a org.w3c.dom.Element to javax.xml.soap.SOAPEl emen t?

Hi Dims,

Thanks (you never fail me !!). This one had not struck me earlier. But read
on.

BTW, I had written a small utility class to do the conversion (SOAPMessage
--> Document and Document --> SOAPMessage; assuming that there were no
attachments) for me. This class essentially wrote the SOAPMessage to a
bytestream (using writeTo() method and then parsed the bytestream to get a
Document. I used a similar technique other way round as well.

After getting your mail, I thought I will use getContent/setContent() of
SOAPPart to do the conversion. So I changed my implementation. But then ran
into a ClassCastException problem. Some digging into Axis source code
revealed that following code, in file XMLUtils.java, is causing problem:

    public static InputSource sourceToInputSource(Source source) {
		// skip
            Element domElement = (Element)((DOMSource)source).getNode();
		// skip
    }

In case the DOMSource is created with a Document, getNode() doesn't return
an Element. This is certainly a bug in Axis code.

Here is my test code (in case someone wants to reproduce the problem ):
Note: My original code is comented out.
----------------------------------------------------------------------------
-----
// File: SOAPUtility.java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;


public class SOAPUtility {
	
/***************************************************************************
*
	 * class MyByteArrayOutputStream helps in avoiding a copy of the
buffer.
	 * Method getByteArrayInputStream() can access the protected members
buf and count
	 * of the base class, thus passing the same buffer to the
ByteArrayInputStream.
	
****************************************************************************
/
	private static class MyByteArrayOutputStream extends
ByteArrayOutputStream {
		public MyByteArrayOutputStream(){
			super();
		}
		public ByteArrayInputStream getByteArrayInputStream(){
			return new ByteArrayInputStream(buf, 0, count);
		}
	}

/*
	public static Document toDocument(SOAPMessage soapMsg) throws
				ParserConfigurationException, SAXException,
SOAPException, IOException {
		MyByteArrayOutputStream baos = new
MyByteArrayOutputStream();
		soapMsg.writeTo(baos);
		ByteArrayInputStream bais = baos.getByteArrayInputStream();

      	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setNamespaceAware(true);
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse(bais);
		return doc;
	}
*/
	public static Document toDocument(SOAPMessage soapMsg) throws
				TransformerConfigurationException,
TransformerException, SOAPException, IOException {
		Source src = soapMsg.getSOAPPart().getContent();
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		DOMResult result = new DOMResult();
		transformer.transform(src, result);
		return (Document)result.getNode();
	}
/*
	public static SOAPMessage toSOAPMessage(Document doc) throws
			TransformerConfigurationException,
TransformerException,  SOAPException, IOException {
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		MyByteArrayOutputStream baos = new
MyByteArrayOutputStream();
		transformer.transform(new DOMSource(doc), new
StreamResult(baos));
		ByteArrayInputStream bais = baos.getByteArrayInputStream();

		MessageFactory mf = MessageFactory.newInstance();
		SOAPMessage soapMsg = mf.createMessage(new MimeHeaders(),
bais);
		return soapMsg;
	}
*/
	public static SOAPMessage toSOAPMessage(Document doc) throws
			TransformerConfigurationException,
TransformerException,  SOAPException, IOException {
		DOMSource src = new DOMSource(doc);

		MessageFactory mf = MessageFactory.newInstance();
		SOAPMessage soapMsg = mf.createMessage();
		soapMsg.getSOAPPart().setContent(src);
		return soapMsg;
	}

	public static void main(String[] args) throws Exception {
		Document doc = XmlUtility.readXML("soap.xml");
		System.out.println("Document read from file:");
		XmlUtility.writeXML(doc, System.out);
		System.out.println();

		SOAPMessage soapMsg = toSOAPMessage(doc);
		System.out.println("Document converted to SOAPMessage:");
		soapMsg.writeTo(System.out);
		System.out.println();

		doc = toDocument(soapMsg);
		System.out.println("SOAPMessage converted to Document:");
		XmlUtility.writeXML(doc, System.out);
		System.out.println();
	}
}
----------------------------------------------------------------------------
-----
Thanks,
Pankaj Kumar.
> -----Original Message-----
> From: Davanum Srinivas [mailto:dims@yahoo.com]
> Sent: Sunday, April 13, 2003 7:09 AM
> To: axis-user@ws.apache.org
> Subject: Re: How to convert a org.w3c.dom.Element to
> javax.xml.soap.SOAPElemen t?
> 
> 
> http://java.sun.com/webservices/docs/1.1/api/javax/xml/soap/SO
> APPart.html#setContent(javax.xml.transform.Source)
> 
> --- "KUMAR,PANKAJ (HP-Cupertino,ex1)" <pa...@hp.com> wrote:
> > Hi,
> > 
> > In my program I have a org.w3c.dom.Element object that I 
> want to make a
> > child of <Body> element within a SOAP Envelope. The classes within
> > javax.xml.soap seem to require a SOAPElement object. SO, 
> how do I convert my
> > Element object to SOAPElement? Is the only solution to 
> iterate over the
> > children of Element and build the sub-tree of SOAPElement 
> objects? This
> > seems an expensive solution to me.
> > 
> > Any ideas?
> > 
> > Thanks,
> > Pankaj Kumar.
> > homepage: http://www.pankaj-k.net
> > 
> 
> 
> =====
> Davanum Srinivas - http://webservices.apache.org/~dims/
> 
> __________________________________________________
> Do you Yahoo!?
> Yahoo! Tax Center - File online, calculators, forms, and more
> http://tax.yahoo.com
> 

RE: How to convert a org.w3c.dom.Element to javax.xml.soap.SOAPEl emen t?

Posted by Davanum Srinivas <di...@yahoo.com>.
Pankaj,

:) :) Please log a bugzilla bug (http://nagoya.apache.org/bugzilla) and one of us (committers)
will take care of it.

Thanks,
dims

--- "KUMAR,PANKAJ (HP-Cupertino,ex1)" <pa...@hp.com> wrote:
> Hi Dims,
> 
> Thanks (you never fail me !!). This one had not struck me earlier. But read
> on.
> 
> BTW, I had written a small utility class to do the conversion (SOAPMessage
> --> Document and Document --> SOAPMessage; assuming that there were no
> attachments) for me. This class essentially wrote the SOAPMessage to a
> bytestream (using writeTo() method and then parsed the bytestream to get a
> Document. I used a similar technique other way round as well.
> 
> After getting your mail, I thought I will use getContent/setContent() of
> SOAPPart to do the conversion. So I changed my implementation. But then ran
> into a ClassCastException problem. Some digging into Axis source code
> revealed that following code, in file XMLUtils.java, is causing problem:
> 
>     public static InputSource sourceToInputSource(Source source) {
> 		// skip
>             Element domElement = (Element)((DOMSource)source).getNode();
> 		// skip
>     }
> 
> In case the DOMSource is created with a Document, getNode() doesn't return
> an Element. This is certainly a bug in Axis code.
> 
> Here is my test code (in case someone wants to reproduce the problem ):
> Note: My original code is comented out.
> ----------------------------------------------------------------------------
> -----
> // File: SOAPUtility.java
> import java.io.ByteArrayInputStream;
> import java.io.ByteArrayOutputStream;
> import java.io.IOException;
> 
> import javax.xml.soap.MessageFactory;
> import javax.xml.soap.SOAPMessage;
> import javax.xml.soap.MimeHeaders;
> import javax.xml.soap.SOAPException;
> 
> import javax.xml.parsers.DocumentBuilderFactory;
> import javax.xml.parsers.DocumentBuilder;
> import javax.xml.parsers.ParserConfigurationException;
> import javax.xml.transform.TransformerFactory;
> import javax.xml.transform.Transformer;
> import javax.xml.transform.Source;
> import javax.xml.transform.dom.DOMSource;
> import javax.xml.transform.dom.DOMResult;
> import javax.xml.transform.stream.StreamResult;
> import javax.xml.transform.TransformerConfigurationException;
> import javax.xml.transform.TransformerException;
> import org.xml.sax.SAXException;
> import org.w3c.dom.Document;
> 
> 
> public class SOAPUtility {
> 	
> /***************************************************************************
> *
> 	 * class MyByteArrayOutputStream helps in avoiding a copy of the
> buffer.
> 	 * Method getByteArrayInputStream() can access the protected members
> buf and count
> 	 * of the base class, thus passing the same buffer to the
> ByteArrayInputStream.
> 	
> ****************************************************************************
> /
> 	private static class MyByteArrayOutputStream extends
> ByteArrayOutputStream {
> 		public MyByteArrayOutputStream(){
> 			super();
> 		}
> 		public ByteArrayInputStream getByteArrayInputStream(){
> 			return new ByteArrayInputStream(buf, 0, count);
> 		}
> 	}
> 
> /*
> 	public static Document toDocument(SOAPMessage soapMsg) throws
> 				ParserConfigurationException, SAXException,
> SOAPException, IOException {
> 		MyByteArrayOutputStream baos = new
> MyByteArrayOutputStream();
> 		soapMsg.writeTo(baos);
> 		ByteArrayInputStream bais = baos.getByteArrayInputStream();
> 
>       	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
> 		dbf.setNamespaceAware(true);
> 		DocumentBuilder db = dbf.newDocumentBuilder();
> 		Document doc = db.parse(bais);
> 		return doc;
> 	}
> */
> 	public static Document toDocument(SOAPMessage soapMsg) throws
> 				TransformerConfigurationException,
> TransformerException, SOAPException, IOException {
> 		Source src = soapMsg.getSOAPPart().getContent();
> 		TransformerFactory tf = TransformerFactory.newInstance();
> 		Transformer transformer = tf.newTransformer();
> 		DOMResult result = new DOMResult();
> 		transformer.transform(src, result);
> 		return (Document)result.getNode();
> 	}
> /*
> 	public static SOAPMessage toSOAPMessage(Document doc) throws
> 			TransformerConfigurationException,
> TransformerException,  SOAPException, IOException {
> 		TransformerFactory tf = TransformerFactory.newInstance();
> 		Transformer transformer = tf.newTransformer();
> 		MyByteArrayOutputStream baos = new
> MyByteArrayOutputStream();
> 		transformer.transform(new DOMSource(doc), new
> StreamResult(baos));
> 		ByteArrayInputStream bais = baos.getByteArrayInputStream();
> 
> 		MessageFactory mf = MessageFactory.newInstance();
> 		SOAPMessage soapMsg = mf.createMessage(new MimeHeaders(),
> bais);
> 		return soapMsg;
> 	}
> */
> 	public static SOAPMessage toSOAPMessage(Document doc) throws
> 			TransformerConfigurationException,
> TransformerException,  SOAPException, IOException {
> 		DOMSource src = new DOMSource(doc);
> 
> 		MessageFactory mf = MessageFactory.newInstance();
> 		SOAPMessage soapMsg = mf.createMessage();
> 		soapMsg.getSOAPPart().setContent(src);
> 		return soapMsg;
> 	}
> 
> 	public static void main(String[] args) throws Exception {
> 		Document doc = XmlUtility.readXML("soap.xml");
> 		System.out.println("Document read from file:");
> 		XmlUtility.writeXML(doc, System.out);
> 		System.out.println();
> 
> 		SOAPMessage soapMsg = toSOAPMessage(doc);
> 		System.out.println("Document converted to SOAPMessage:");
> 		soapMsg.writeTo(System.out);
> 		System.out.println();
> 
> 		doc = toDocument(soapMsg);
> 		System.out.println("SOAPMessage converted to Document:");
> 		XmlUtility.writeXML(doc, System.out);
> 		System.out.println();
> 	}
> }
> ----------------------------------------------------------------------------
> -----
> Thanks,
> Pankaj Kumar.
> > -----Original Message-----
> > From: Davanum Srinivas [mailto:dims@yahoo.com]
> > Sent: Sunday, April 13, 2003 7:09 AM
> > To: axis-user@ws.apache.org
> > Subject: Re: How to convert a org.w3c.dom.Element to
> > javax.xml.soap.SOAPElemen t?
> > 
> > 
> > http://java.sun.com/webservices/docs/1.1/api/javax/xml/soap/SO
> > APPart.html#setContent(javax.xml.transform.Source)
> > 
> > --- "KUMAR,PANKAJ (HP-Cupertino,ex1)" <pa...@hp.com> wrote:
> > > Hi,
> > > 
> > > In my program I have a org.w3c.dom.Element object that I 
> > want to make a
> > > child of <Body> element within a SOAP Envelope. The classes within
> > > javax.xml.soap seem to require a SOAPElement object. SO, 
> > how do I convert my
> > > Element object to SOAPElement? Is the only solution to 
> > iterate over the
> > > children of Element and build the sub-tree of SOAPElement 
> > objects? This
> > > seems an expensive solution to me.
> > > 
> > > Any ideas?
> > > 
> > > Thanks,
> > > Pankaj Kumar.
> > > homepage: http://www.pankaj-k.net
> > > 
> > 
> > 
> > =====
> > Davanum Srinivas - http://webservices.apache.org/~dims/
> > 
> > __________________________________________________
> > Do you Yahoo!?
> > Yahoo! Tax Center - File online, calculators, forms, and more
> > http://tax.yahoo.com
> > 


=====
Davanum Srinivas - http://webservices.apache.org/~dims/

__________________________________________________
Do you Yahoo!?
Yahoo! Tax Center - File online, calculators, forms, and more
http://tax.yahoo.com