IndexOutOfBoundsException when transforming into SAAJ SOAPBo
poutsma Jul 11, 2006 10:45 AMHi,
The following piece of code throws an IndexOutOfBoundsException in org.jboss.ws.soap.NodeImpl.getFirstChild:
import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPMessage; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class SaajIssue { public static void main(String[] args) throws Exception { MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element root = document.createElementNS("http://test.com", "root"); document.appendChild(root); Element child = document.createElementNS("http://test.com", "child"); root.appendChild(child); SOAPBody body = soapMessage.getSOAPBody(); transformer.transform(new DOMSource(document), new DOMResult(body)); // Next line throws an IndexOutOfBoundsException transformer.transform(new DOMSource(body), new StreamResult(System.out)); } }
This is the stacktrace:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:546) at java.util.ArrayList.get(ArrayList.java:321) at org.jboss.ws.soap.NodeImpl.getFirstChild(NodeImpl.java:311) at org.jboss.ws.soap.SOAPContentElement.getFirstChild(SOAPContentElement.java:746) at org.apache.xml.serializer.TreeWalker.traverse(TreeWalker.java:145) at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:389) at SaajIssue.main(SaajIssue.java:36)
After some investigation, it appears that the root element is imported correctly, but the child element is not. To be more precise: it is imported into the internal domNode of NodeImpl, but not the soapChildren list.
SUN's reference implementation of SAAJ does not throw this exception, so it appears this is a bug in the JBoss SAAJ implementation. Am I correct?
Thanks,
Arjen Poutsma