You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ay...@apache.org on 2012/09/13 17:17:46 UTC

svn commit: r1384365 - in /cxf/trunk/api/src: main/java/org/apache/cxf/staxutils/transform/ test/java/org/apache/cxf/staxutils/resources/ test/java/org/apache/cxf/staxutils/transform/

Author: ay
Date: Thu Sep 13 15:17:46 2012
New Revision: 1384365

URL: http://svn.apache.org/viewvc?rev=1384365&view=rev
Log:
[CXF-4503] TransformOutInterceptor may lose namespace declarations in some elements

Added:
    cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml   (with props)
    cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml   (with props)
    cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml   (with props)
    cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml   (with props)
Modified:
    cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java
    cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java
    cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
    cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java?rev=1384365&r1=1384364&r2=1384365&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/DelegatingNamespaceContext.java Thu Sep 13 15:17:46 2012
@@ -20,6 +20,8 @@ package org.apache.cxf.staxutils.transfo
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 import javax.xml.namespace.NamespaceContext;
@@ -27,32 +29,45 @@ import javax.xml.namespace.NamespaceCont
 import org.apache.cxf.helpers.CastUtils;
 
 class DelegatingNamespaceContext implements NamespaceContext {
-
-    private Map<String, String> prefixes = new HashMap<String, String>();
+    private List<Map<String, String>> prefixes;
     private NamespaceContext nc;
     private Map<String, String> nsMap;
     
     public DelegatingNamespaceContext(NamespaceContext nc, Map<String, String> nsMap) {
         this.nc = nc;
         this.nsMap = nsMap;
+        this.prefixes =  new LinkedList<Map<String, String>>();
+        this.prefixes.add(new HashMap<String, String>());
+    }
+    
+    public void down() {
+        Map<String, String> pm = new HashMap<String, String>();
+        if (prefixes.size() > 0) {
+            pm.putAll(prefixes.get(0));
+        }
+        prefixes.add(0, pm);
+    }
+    
+    public void up() {
+        prefixes.remove(0);
     }
     
     public void addPrefix(String prefix, String namespace) {
-        prefixes.put(namespace, prefix);
+        prefixes.get(0).put(namespace, prefix);
     }
     
     public String findUniquePrefix(String namespace) {
         if (namespace.length() == 0) {
             return null;
         }
-        String existingPrefix = prefixes.get(namespace);
+        String existingPrefix = prefixes.get(0).get(namespace);
         if (existingPrefix != null) {
             return existingPrefix;
         }
         
         int i = 0;
         while (true) {
-            if (!prefixes.containsValue("ps" + ++i)) {
+            if (!prefixes.get(0).containsValue("ps" + ++i)) {
                 String prefix = "ps" + i;
                 addPrefix(prefix, namespace);
                 return prefix;
@@ -61,7 +76,7 @@ class DelegatingNamespaceContext impleme
     }
     
     public String getNamespaceURI(String prefix) {
-        for (Map.Entry<String, String> entry : prefixes.entrySet()) {
+        for (Map.Entry<String, String> entry : prefixes.get(0).entrySet()) {
             if (entry.getValue().equals(prefix)) {
                 return entry.getKey();
             }
@@ -81,8 +96,8 @@ class DelegatingNamespaceContext impleme
         }
         
         String actualNs = value == null ? ns : value;
-        if (prefixes.containsKey(actualNs)) {
-            return prefixes.get(actualNs);
+        if (prefixes.get(0).containsKey(actualNs)) {
+            return prefixes.get(0).get(actualNs);
         }
         String prefix = nc.getPrefix(actualNs);
         addPrefix(prefix, actualNs);

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java?rev=1384365&r1=1384364&r2=1384365&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java Thu Sep 13 15:17:46 2012
@@ -111,6 +111,7 @@ public class InTransformReader extends D
         int event = super.next();
         if (event == XMLStreamConstants.START_ELEMENT) {
             attributesIndexed = false;
+            namespaceContext.down();
             final QName theName = super.getName();
             final ElementProperty appendProp = inAppendMap.remove(theName);
             final boolean replaceContent = appendProp != null && theName.equals(appendProp.getName());
@@ -168,6 +169,7 @@ public class InTransformReader extends D
                 LOG.fine("read EndElement " + theName + " at " + getDepth());
             }
             
+            namespaceContext.up();
             final boolean dropped = inDropSet.contains(theName);
             if (!dropped) {
                 List<ParsingEvent> pe = pushedAheadEvents.pop();

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java?rev=1384365&r1=1384364&r2=1384365&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java Thu Sep 13 15:17:46 2012
@@ -153,6 +153,7 @@ public class OutTransformWriter extends 
     @Override
     public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
         currentDepth++;
+        namespaceContext.down();
         if (matchesDropped(false)) {
             return;
         }
@@ -293,6 +294,7 @@ public class OutTransformWriter extends 
 
     @Override
     public void writeEndElement() throws XMLStreamException {
+        namespaceContext.up();
         --currentDepth;
         if (matchesDropped(false)) {
             return;

Added: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml?rev=1384365&view=auto
==============================================================================
--- cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml (added)
+++ cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml Thu Sep 13 15:17:46 2012
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<ns2:testDoubleBean xmlns:ns2="http://testbeans.com/double/v2">
+  <ns3:bean xmlns:ns3="http://testbeans.com/v3"/>
+  <ns3:beanNext xmlns:ns3="http://testbeans.com/v3"/>
+</ns2:testDoubleBean>

Propchange: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBean.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml?rev=1384365&view=auto
==============================================================================
--- cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml (added)
+++ cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml Thu Sep 13 15:17:46 2012
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<ns2:testDoubleBean xmlns:ns2="http://testbeans.com/double">
+  <ns3:bean xmlns:ns3="http://testbeans.com"/>
+  <ns3:beanNext xmlns:ns3="http://testbeans.com"/>
+</ns2:testDoubleBean>

Propchange: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn1.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml?rev=1384365&view=auto
==============================================================================
--- cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml (added)
+++ cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml Thu Sep 13 15:17:46 2012
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<ns2:testDoubleBean xmlns:ns2="http://testbeans.com/double">
+  <bean xmlns="http://testbeans.com"/>
+  <beanNext xmlns="http://testbeans.com"/>
+</ns2:testDoubleBean>
+

Propchange: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn2.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml?rev=1384365&view=auto
==============================================================================
--- cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml (added)
+++ cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml Thu Sep 13 15:17:46 2012
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  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.
+-->
+<ns2:testDoubleBean xmlns="http://testbeans.com" xmlns:ns2="http://testbeans.com/double">
+  <bean/>
+  <beanNext/>
+</ns2:testDoubleBean>

Propchange: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/resources/doubleBeanIn3.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java?rev=1384365&r1=1384364&r2=1384365&view=diff
==============================================================================
--- cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java (original)
+++ cxf/trunk/api/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java Thu Sep 13 15:17:46 2012
@@ -218,6 +218,74 @@ public class OutTransformWriterTest exte
     }
 
     @Test
+    public void testReadWithComplexTransformationNamespace2() throws Exception {
+        Map<String, String> map = new HashMap<String, String>();
+        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, "UTF-8"), 
+                                   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 testReadWithReplaceAppend() throws Exception {
         Map<String, String> transformElements = new HashMap<String, String>();
         transformElements.put("requestValue",