/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.binding.soap.saaj; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.dom.DOMSource; import org.w3c.dom.Document; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.helpers.DOMUtils.NullResolver; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.ExchangeImpl; import org.apache.cxf.message.MessageImpl; import org.apache.cxf.staxutils.StaxUtils; import org.junit.Assert; import org.junit.Test; public class ParseBodyTest extends Assert { static final String[] DATA = { "<SOAP-ENV:Body xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <foo>\n <bar/>\n </foo>\n</SOAP-ENV:Body>", "<SOAP-ENV:Body xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<foo>\n <bar/>\n </foo>\n</SOAP-ENV:Body>", "<SOAP-ENV:Body xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<foo>\n <bar/>\n </foo></SOAP-ENV:Body>"}; private XMLStreamReader xmlReader; private MessageFactory factory; private SOAPMessage soapMessage; private void prepare(int n) throws Exception { String data = DATA[n]; //System.out.println("Original[" + n + "]: " + data); xmlReader = StaxUtils.createXMLStreamReader(new ByteArrayInputStream(data.getBytes("utf-8"))); //reader should be on the start element for the assertEquals(XMLStreamReader.START_ELEMENT, xmlReader.next()); assertEquals("Body", xmlReader.getLocalName()); factory = MessageFactory.newInstance(); soapMessage = factory.createMessage(); } @Test public void testUsingStaxUtilsCopyWithSAAJWriterData0() throws Exception { testUsingStaxUtilsCopyWithSAAJWriter(0); } @Test public void testUsingStaxUtilsCopyWithSAAJWriterData1() throws Exception { testUsingStaxUtilsCopyWithSAAJWriter(1); } @Test public void testUsingStaxUtilsCopyWithSAAJWriterData2() throws Exception { testUsingStaxUtilsCopyWithSAAJWriter(2); } @Test public void testReadSOAPFault() throws Exception { InputStream inStream = getClass().getResourceAsStream("soap12-fault.xml"); Document doc = StaxUtils.read(inStream); SoapMessage msg = new SoapMessage(new MessageImpl()); Exchange ex = new ExchangeImpl(); ex.setInMessage(msg); SOAPMessage saajMsg = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); SOAPPart part = saajMsg.getSOAPPart(); SAAJStreamWriter writer = new SAAJStreamWriter(part); StaxUtils.copy(doc, writer); //Source s = new StaxSource(StaxUtils.createXMLStreamReader(doc)); //part.setContent(s); saajMsg.saveChanges(); msg.setContent(SOAPMessage.class, saajMsg); doc = part; // System.out.println("OUTPUT: " + StaxUtils.toString(doc)); byte[] docbytes = getMessageBytes(doc); // System.out.println("OUTPUT: " + new String(docbytes)); XMLStreamReader reader = StaxUtils.createXMLStreamReader(new ByteArrayInputStream(docbytes)); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); dbf.setIgnoringComments(false); dbf.setIgnoringElementContentWhitespace(true); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); db.setEntityResolver(new NullResolver()); doc = StaxUtils.read(db, reader, false); } private void testUsingStaxUtilsCopyWithSAAJWriter(int n) throws Exception { prepare(n); StaxUtils.copy(xmlReader, new SAAJStreamWriter(soapMessage.getSOAPPart(), soapMessage.getSOAPPart() .getEnvelope().getBody()), true, true); DOMSource bodySource = new DOMSource(soapMessage.getSOAPPart().getEnvelope().getBody()); xmlReader = StaxUtils.createXMLStreamReader(bodySource); ByteArrayOutputStream buf = new ByteArrayOutputStream(); StaxUtils.copy(xmlReader, buf); String result = buf.toString(); //System.out.println("UsingStaxUtilsCopyWithSAAJWriter: " + result); assertEquals(DATA[n], result); } private byte[] getMessageBytes(Document doc) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); XMLStreamWriter byteArrayWriter = StaxUtils.createXMLStreamWriter(outputStream); StaxUtils.writeDocument(doc, byteArrayWriter, false); byteArrayWriter.flush(); return outputStream.toByteArray(); } }