/** * 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.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamReader; import org.apache.cxf.staxutils.PartialXMLStreamReader; import org.apache.cxf.staxutils.StaxUtils; import org.junit.Assert; import org.junit.Test; public class InTransformReaderTest extends Assert { @Test public void testReadWithDefaultNamespace() throws Exception { InputStream is = new ByteArrayInputStream("<test xmlns=\"http://bar\"/>".getBytes()); XMLStreamReader reader = StaxUtils.createXMLStreamReader(is); reader = new InTransformReader(reader, Collections.singletonMap("{http://bar}test", "test2"), null, null, null, false); ByteArrayOutputStream bos = new ByteArrayOutputStream(); StaxUtils.copy(reader, bos); String value = bos.toString(); assertTrue("<test2 xmlns=\"\"/>".equals(value)); } @Test public void testReplaceSimpleElement() throws Exception { InputStream is = new ByteArrayInputStream( "<ns:test xmlns:ns=\"http://bar\"><ns:a>1</ns:a></ns:test>".getBytes()); XMLStreamReader reader = StaxUtils.createXMLStreamReader(is); reader = new InTransformReader(reader, null, Collections.singletonMap("{http://bar}a", "{http://bar}a=1 2 3"), null, null, false); 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 testTransformAndReplaceSimpleElement() throws Exception { InputStream is = new ByteArrayInputStream( "<ns:test xmlns:ns=\"http://bar\"><ns:a>1</ns:a></ns:test>".getBytes()); XMLStreamReader reader = StaxUtils.createXMLStreamReader(is); reader = new InTransformReader(reader, Collections.singletonMap("{http://bar}*", "{http://foo}*"), Collections.singletonMap("{http://bar}a", "{http://bar}a=1 2 3"), null, null, false); ByteArrayOutputStream bos = new ByteArrayOutputStream(); StaxUtils.copy(reader, bos); String value = bos.toString(); assertEquals( "<ns:test xmlns:ns=\"http://foo\"><ns:a>1 2 3</ns:a></ns:test>", value); } @Test public void testReadWithParentDefaultNamespace() throws Exception { InputStream is = new ByteArrayInputStream( "<test xmlns=\"http://bar\"><ns:subtest xmlns:ns=\"http://bar1\"/></test>".getBytes()); XMLStreamReader reader = StaxUtils.createXMLStreamReader(is); reader = new InTransformReader(reader, Collections.singletonMap("{http://bar1}subtest", "subtest"), null, null, null, false); ByteArrayOutputStream bos = new ByteArrayOutputStream(); StaxUtils.copy(reader, bos); String value = bos.toString(); assertEquals("<test xmlns=\"http://bar\"><subtest xmlns=\"\"/></test>", value); } // additional test cases @Test public void testReadWithComplexRequestSameNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn1.xml")); Map<String, String> inMap = new HashMap<>(); inMap.put("{http://cxf.apache.org/transform/header/element}*", "{http://cxf.apache.org/transform/header/element}*"); reader = new InTransformReader(reader, inMap, null, null, null, false); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq1.xml")); TransformTestUtils.verifyReaders(reader2, reader, true, true); } @Test public void testReadWithComplexRequestMultipleNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn2.xml")); 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}*"); reader = new InTransformReader(reader, inMap, null, null, null, false); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq2.xml")); TransformTestUtils.verifyReaders(reader2, reader, true, true); } @Test public void testReadWithComplexTransformationNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn3.xml")); 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 reader = new InTransformReader(reader, inMap, null, null, null, true); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq3.xml")); TransformTestUtils.verifyReaders(reader2, reader, true, true); } @Test public void testReadPartialWithComplexRequestSameNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn1.xml")); Map<String, String> inMap = new HashMap<>(); inMap.put("{http://cxf.apache.org/transform/header/element}*", "{http://cxf.apache.org/transform/header/element}*"); reader = new InTransformReader(reader, inMap, null, null, null, false); QName bodyTag = new QName("http://schemas.xmlsoap.org/soap/envelope/", "Body"); PartialXMLStreamReader filteredReader = new PartialXMLStreamReader(reader, bodyTag); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq1partial.xml")); TransformTestUtils.verifyReaders(reader2, filteredReader, false, true); } @Test public void testPartialReadWithComplexRequestMultipleNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn2.xml")); 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}*"); reader = new InTransformReader(reader, inMap, null, null, null, false); QName bodyTag = new QName("http://schemas.xmlsoap.org/soap/envelope/", "Body"); PartialXMLStreamReader filteredReader = new PartialXMLStreamReader(reader, bodyTag); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq2partial.xml")); TransformTestUtils.verifyReaders(reader2, filteredReader, false, true); } @Test public void testPartialReadWithComplexTransformationNamespace() throws Exception { XMLStreamReader reader = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReqIn3.xml")); 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 reader = new InTransformReader(reader, inMap, null, null, null, true); QName bodyTag = new QName("http://schemas.xmlsoap.org/soap/envelope/", "Body"); PartialXMLStreamReader filteredReader = new PartialXMLStreamReader(reader, bodyTag); XMLStreamReader reader2 = StaxUtils.createXMLStreamReader( InTransformReader.class.getResourceAsStream("../resources/complexReq3partial.xml")); TransformTestUtils.verifyReaders(reader2, filteredReader, false, 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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../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.transformInStreamAndCompare("../resources/multiNSIn1.xml", "../resources/multiNS.xml", transformElements, null, null, null, null); } @Test public void testReadNamespaceWithDuplicatePrefixes() throws Exception { Map<String, String> transformElements = new HashMap<>(); transformElements.put("{http://bar.com/foo}*", "{http://bar.com/foobar}*"); TransformTestUtils.transformInStreamAndCompare("../resources/multiNS2In1.xml", "../resources/multiNS2.xml", transformElements, null, null, null, null); } }