/**
* 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.staxutils.transform;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Element;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.staxutils.StaxUtils;
import org.apache.cxf.staxutils.W3CDOMStreamWriter;
import org.junit.Assert;
import org.junit.Test;
public class OutTransformWriterTest extends Assert {
@Test
public void testDefaultNamespace() throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(os, StandardCharsets.UTF_8.name());
Map<String, String> outMap = new HashMap<>();
outMap.put("{http://testbeans.com}*", "{http://testbeans.com/v2}*");
OutTransformWriter transformWriter = new OutTransformWriter(writer,
outMap,
Collections.<String, String>emptyMap(),
Collections.<String>emptyList(),
false,
"http://testbeans.com/v2");
JAXBContext context = JAXBContext.newInstance(TestBean.class);
Marshaller m = context.createMarshaller();
m.marshal(new TestBean(), transformWriter);
String expected = "<?xml version='1.0' encoding='UTF-8'?>"
+ "<testBean xmlns=\"http://testbeans.com/v2\"><bean/></testBean>";
assertEquals(expected, os.toString());
}
@Test
public void testNamespaceConversion() throws Exception {
W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
JAXBContext context = JAXBContext.newInstance(TestBean.class);
Marshaller m = context.createMarshaller();
Map<String, String> outMap = new HashMap<>();
outMap.put("{http://testbeans.com}testBean", "{http://testbeans.com/v2}testBean");
outMap.put("{http://testbeans.com}bean", "{http://testbeans.com/v3}bean");
OutTransformWriter transformWriter = new OutTransformWriter(writer,
outMap,
Collections.<String, String>emptyMap(),
Collections.<String>emptyList(),
false,
"");
m.marshal(new TestBean(), transformWriter);
Element el = writer.getDocument().getDocumentElement();
assertEquals("http://testbeans.com/v2", el.getNamespaceURI());
assertFalse(StringUtils.isEmpty(el.getPrefix()));
Element el2 = DOMUtils.getFirstElement(el);
assertEquals("http://testbeans.com/v3", el2.getNamespaceURI());
assertFalse(StringUtils.isEmpty(el2.getPrefix()));
}
@Test
public void testNamespaceConversionAndDefaultNS() throws Exception {
W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
Map<String, String> outMap = new HashMap<>();
outMap.put("{http://testbeans.com}testBean", "{http://testbeans.com/v2}testBean");
outMap.put("{http://testbeans.com}bean", "{http://testbeans.com/v3}bean");
OutTransformWriter transformWriter = new OutTransformWriter(writer,
outMap,
Collections.<String, String>emptyMap(),
Collections.<String>emptyList(),
false,
"http://testbeans.com/v2");
JAXBContext context = JAXBContext.newInstance(TestBean.class);
Marshaller m = context.createMarshaller();
m.marshal(new TestBean(), transformWriter);
Element el = writer.getDocument().getDocumentElement();
assertEquals("http://testbeans.com/v2", el.getNamespaceURI());
assertTrue(StringUtils.isEmpty(el.getPrefix()));
el = DOMUtils.getFirstElement(el);
assertEquals("http://testbeans.com/v3", el.getNamespaceURI());
assertFalse(StringUtils.isEmpty(el.getPrefix()));
}
@XmlRootElement(name = "testBean", namespace = "http://testbeans.com")
public static class TestBean {
private TestBean2 bean = new TestBean2();
@XmlElement(name = "bean", namespace = "http://testbeans.com")
public void setBean(TestBean2 bean) {
this.bean = bean;
}
public TestBean2 getBean() {
return bean;
}
}
private static class TestBean2 {
}
// additional test cases
@Test
public void testReplaceSimpleElement() throws Exception {
InputStream is = new ByteArrayInputStream(
"<ns:test xmlns:ns=\"http://bar\"><ns:a>1</ns:a></ns:test>".getBytes());
ByteArrayOutputStream os = new ByteArrayOutputStream();
XMLStreamWriter writer =
new OutTransformWriter(StaxUtils.createXMLStreamWriter(os, StandardCharsets.UTF_8.name()),
null, Collections.singletonMap("{http://bar}a", "{http://bar}a=1 2 3"),
null, null, false, null);
StaxUtils.copy(new StreamSource(is), writer);
writer.flush();
XMLStreamReader reader = StaxUtils.createXMLStreamReader(new ByteArrayInputStream(os.toByteArray()));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StaxUtils.copy(reader, bos);
String value = bos.toString();
assertEquals("<ns:test xmlns:ns=\"http://bar\"><ns:a>1 2 3</ns:a></ns:test>", value);
}
@Test
public void testReadWithComplexRequestSameNamespace() throws Exception {
Map<String, String> inMap = new HashMap<>();
inMap.put("{http://cxf.apache.org/transform/header/element}*",
"{http://cxf.apache.org/transform/header/element}*");
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/complexReqIn1.xml",
inMap, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
OutTransformWriter.class.getResourceAsStream("../resources/complexReq1.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, true);
}
@Test
public void testReadWithComplexRequestMultipleNamespace() throws Exception {
Map<String, String> inMap = new HashMap<>();
inMap.put("{http://cxf.apache.org/transform/header/element}*",
"{http://cxf.apache.org/transform/header/otherelement}*");
inMap.put("{http://cxf.apache.org/transform/test}*",
"{http://cxf.apache.org/transform/othertest}*");
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/complexReqIn2.xml",
inMap, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/complexReq2.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, true);
}
@Test
public void testReadWithComplexTransformationNamespace() throws Exception {
Map<String, String> inMap = new HashMap<>();
inMap.put("{http://cxf.apache.org/transform/header/element}*",
"{http://cxf.apache.org/transform/header/otherelement}*");
inMap.put("{http://cxf.apache.org/transform/test}*",
"{http://cxf.apache.org/transform/othertest}*");
inMap.put("{http://schemas.xmlsoap.org/soap/envelope/}Envelope",
"{http://schemas.xmlsoap.org/soap/envelope/}TheEnvelope");
// set the block original reader flag to true
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/complexReqIn3.xml",
inMap, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/complexReq3.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, false);
}
@Test
public void testReadWithComplexTransformationNamespace2() throws Exception {
Map<String, String> map = new HashMap<>();
map.put("{http://testbeans.com/double}*",
"{http://testbeans.com/double/v2}*");
map.put("{http://testbeans.com}*",
"{http://testbeans.com/v3}*");
// the namespaces are prefixed in the input
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/doubleBeanIn1.xml",
map, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/doubleBean.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, false);
// the child elements with the default namespace that is declared in the elements
reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/doubleBeanIn2.xml",
map, null, null, null, false, null);
reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/doubleBean.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, false);
// the child elements with the default namespace that is declared in their parent element
reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/doubleBeanIn3.xml",
map, null, null, null, false, null);
reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/doubleBean.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, false);
// writing each child separately (as the soap header children are serialized)
ByteArrayOutputStream os = new ByteArrayOutputStream();
XMLStreamWriter writer =
new OutTransformWriter(StaxUtils.createXMLStreamWriter(os, StandardCharsets.UTF_8.name()),
map, null,
null, null, false, null);
boolean nsset = "ns3".equals(writer.getNamespaceContext().getPrefix("http://testbeans.com/double"));
writer.writeStartElement("ns3", "testDoubleBean", "http://testbeans.com/double");
if (!nsset) {
writer.writeNamespace("ns3", "http://testbeans.com/double");
}
nsset = "".equals(writer.getNamespaceContext().getPrefix("http://testbeans.com"));
writer.writeStartElement("", "bean", "http://testbeans.com");
if (!nsset) {
writer.writeNamespace("", "http://testbeans.com");
}
writer.writeEndElement();
nsset = "".equals(writer.getNamespaceContext().getPrefix("http://testbeans.com"));
writer.writeStartElement("", "beanNext", "http://testbeans.com");
if (!nsset) {
writer.writeNamespace("", "http://testbeans.com");
}
writer.writeEndElement();
writer.writeEndElement();
writer.flush();
reader = StaxUtils.createXMLStreamReader(new ByteArrayInputStream(os.toByteArray()));
reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/doubleBean.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, false);
}
@Test
public void testRemoveOneNamespace() throws Exception {
Map<String, String> inMap = new HashMap<>();
inMap.put("{http://cxf.apache.org/vgop/serviceorder/v1_0}result", "result");
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/complexReqIn5.xml",
inMap, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/complexReq5.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, true);
}
@Test
public void testRemoveOneDefaultNamespace() throws Exception {
Map<String, String> inMap = new HashMap<>();
inMap.put("{http://cxf.apache.org/hello_world_soap_http/types2}requestType", "requestType");
XMLStreamReader reader =
TransformTestUtils.createOutTransformedStreamReader("../resources/greetMe2ReqIn1.xml",
inMap, null, null, null, false, null);
XMLStreamReader reader2 =
StaxUtils.createXMLStreamReader(
InTransformReader.class.getResourceAsStream("../resources/greetMe2Req.xml"));
TransformTestUtils.verifyReaders(reader2, reader, true, true);
}
@Test
public void testReadWithReplaceAppend() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("requestValue",
"{http://cxf.apache.org/hello_world_soap_http/types}requestType");
Map<String, String> appendElements = new HashMap<>();
appendElements.put("requestValue",
"{http://cxf.apache.org/hello_world_soap_http/types}greetMe");
TransformTestUtils.transformOutStreamAndCompare("../resources/greetMeReqIn1.xml",
"../resources/greetMeReq.xml",
transformElements, appendElements, null, null, null);
}
@Test
public void testReadWithReplaceAppendDelete() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("requestValue",
"{http://cxf.apache.org/hello_world_soap_http/types}requestType");
transformElements.put("{http://cxf.apache.org/hello_world_soap_http/types}requestDate",
"");
Map<String, String> appendElements = new HashMap<>();
appendElements.put("requestValue",
"{http://cxf.apache.org/hello_world_soap_http/types}greetMe");
List<String> dropElements = new ArrayList<>();
dropElements.add("value");
Map<String, String> transformAttributes = new HashMap<>();
transformAttributes.put("num", "");
transformAttributes.put("nombre", "{http://cxf.apache.org/hello_world_soap_http/types}name");
TransformTestUtils.transformOutStreamAndCompare("../resources/greetMeReqIn2.xml",
"../resources/greetMeReq.xml",
transformElements, appendElements, dropElements,
transformAttributes, null);
}
@Test
public void testReadWithChangeNamespaces() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("*",
"{http://cxf.apache.org/hello_world_soap_http/types}*");
TransformTestUtils.transformOutStreamAndCompare("../resources/greetMeReqIn3.xml",
"../resources/greetMeReq.xml",
transformElements, null, null, null, null);
}
@Test
public void testReadWithDeleteAttributes() throws Exception {
Map<String, String> transformAttributes = new HashMap<>();
transformAttributes.put("{http://www.w3.org/2001/XMLSchema-instance}type",
"");
TransformTestUtils.transformOutStreamAndCompare("../resources/greetMeReqIn4.xml",
"../resources/greetMeReq.xml",
null, null, null, transformAttributes, null);
}
@Test
public void testReadWithAppendPreInclude1() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId",
"{http://xml.amazon.com/AWSECommerceService/2004-08-01}IdType=ASIN");
TransformTestUtils.transformOutStreamAndCompare("../resources/amazonIn1.xml",
"../resources/amazon.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPreInclude2() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId",
"{http://xml.amazon.com/AWSECommerceService/2004-08-01}IdType=ASIN");
TransformTestUtils.transformOutStreamAndCompare("../resources/amazonIn1nospace.xml",
"../resources/amazon.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPreWrap1() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("payload",
"{http://www.w3.org/2003/05/soap-envelope}Envelope");
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://apache.org/cxf/calculator/types}add",
"{http://www.w3.org/2003/05/soap-envelope}Body");
TransformTestUtils.transformOutStreamAndCompare("../resources/AddRequestIn2.xml",
"../resources/AddRequest2.xml",
transformElements, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPreWrap2() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("payload",
"{http://www.w3.org/2003/05/soap-envelope}Envelope");
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://apache.org/cxf/calculator/types}add",
"{http://www.w3.org/2003/05/soap-envelope}Body");
TransformTestUtils.transformOutStreamAndCompare("../resources/AddRequestIn2nospace.xml",
"../resources/AddRequest2.xml",
transformElements, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPostInclude1() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}Request/",
"{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId=0486411214");
TransformTestUtils.transformOutStreamAndCompare("../resources/amazonIn2.xml",
"../resources/amazon.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPostInclude2() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}Request/",
"{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId=0486411214");
TransformTestUtils.transformOutStreamAndCompare("../resources/amazonIn2nospace.xml",
"../resources/amazon.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPostWrap1() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://www.w3.org/2003/05/soap-envelope}Body/",
"{http://apache.org/cxf/calculator/types}add");
TransformTestUtils.transformOutStreamAndCompare("../resources/AddRequestIn1.xml",
"../resources/AddRequest.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPostWrap2() throws Exception {
Map<String, String> appendElements = new HashMap<>();
appendElements.put("{http://www.w3.org/2003/05/soap-envelope}Body/",
"{http://apache.org/cxf/calculator/types}add");
TransformTestUtils.transformOutStreamAndCompare("../resources/AddRequestIn1nospace.xml",
"../resources/AddRequest.xml",
null, appendElements, null, null, null);
}
@Test
public void testReadWithAppendPostWrapReplaceDrop() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("payload",
"{http://www.w3.org/2003/05/soap-envelope}Envelope");
transformElements.put("params",
"{http://apache.org/cxf/calculator/types}add");
transformElements.put("i1",
"{http://apache.org/cxf/calculator/types}arg0");
transformElements.put("i2",
"{http://apache.org/cxf/calculator/types}arg1");
transformElements.put("i3",
"");
Map<String, String> appendElements = new HashMap<>();
appendElements.put("payload/",
"{http://www.w3.org/2003/05/soap-envelope}Body");
List<String> dropElements = new ArrayList<>();
dropElements.add("param");
TransformTestUtils.transformOutStreamAndCompare("../resources/AddRequestIn3.xml",
"../resources/AddRequest3.xml",
transformElements, appendElements, dropElements, null, null);
}
@Test
public void testOldSTSTransform() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("{http://docs.oasis-open.org/ws-sx/ws-trust/200512}*",
"{http://schemas.xmlsoap.org/ws/2005/02/trust}*");
TransformTestUtils.transformOutStreamAndCompare("../resources/wstrustReqSTRCIn1.xml",
"../resources/wstrustReqSTRC.xml",
transformElements, null, null, null, null);
}
@Test
public void testPreservePrefixBindings() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("{urn:abc}*",
"{urn:a}*");
TransformTestUtils.transformOutStreamAndCompare("../resources/multiNSIn1.xml",
"../resources/multiNS.xml",
transformElements, null, null, null, null);
}
@Test
public void testReplaceDefaultNamespace() throws Exception {
InputStream is = new ByteArrayInputStream(
"<test xmlns=\"http://bar\"><a>1</a></test>".getBytes());
ByteArrayOutputStream os = new ByteArrayOutputStream();
XMLStreamWriter writer =
new OutTransformWriter(StaxUtils.createXMLStreamWriter(os, StandardCharsets.UTF_8.name()),
null, null, null, null, false, "");
StaxUtils.copy(new StreamSource(is), writer);
writer.flush();
XMLStreamReader reader = StaxUtils.createXMLStreamReader(new ByteArrayInputStream(os.toByteArray()));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
StaxUtils.copy(reader, bos);
String value = bos.toString();
assertEquals("<ps1:test xmlns:ps1=\"http://bar\"><ps1:a>1</ps1:a></ps1:test>", value);
}
@Test
public void testNamespacedAttributeDropElement() throws Exception {
Map<String, String> transformElements = new HashMap<>();
transformElements.put("{http://www.w3.org/2005/08/addressing}ReplyTo", "");
TransformTestUtils.transformOutStreamAndCompare("../resources/greetMeWSAReqIn.xml",
"../resources/greetMeWSAReq.xml",
transformElements, null, null, null, null);
}
}