You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/08/16 14:52:29 UTC

svn commit: r1158246 - in /cxf/trunk: common/common/src/main/java/org/apache/cxf/staxutils/transform/ common/common/src/test/java/org/apache/cxf/staxutils/transform/ rt/core/src/main/java/org/apache/cxf/interceptor/transform/ rt/frontend/jaxrs/src/main...

Author: sergeyb
Date: Tue Aug 16 12:52:29 2011
New Revision: 1158246

URL: http://svn.apache.org/viewvc?rev=1158246&view=rev
Log:
[CXF-3745] Support for default namespaces in OutTransformWriter

Added:
    cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java   (with props)
Modified:
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java?rev=1158246&r1=1158245&r2=1158246&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/OutTransformWriter.java Tue Aug 16 12:52:29 2011
@@ -34,6 +34,7 @@ import org.apache.cxf.helpers.XMLUtils;
 import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
 
 public class OutTransformWriter extends DelegatingXMLStreamWriter {
+    private String defaultNamespace;
     private QNamesMap elementsMap;
     private Map<QName, QName> appendMap = new HashMap<QName, QName>(5);
     private Map<String, String> nsMap = new HashMap<String, String>(5);
@@ -51,7 +52,8 @@ public class OutTransformWriter extends 
                               Map<String, String> outMap,
                               Map<String, String> append,
                               List<String> dropEls,
-                              boolean attributesToElements) {
+                              boolean attributesToElements,
+                              String defaultNamespace) {
         super(writer);
         elementsMap = new QNamesMap(outMap == null ? 0 : outMap.size());
         TransformUtils.convertToQNamesMap(outMap, elementsMap, nsMap);
@@ -60,6 +62,7 @@ public class OutTransformWriter extends 
         this.attributesToElements = attributesToElements;
         namespaceContext = new DelegatingNamespaceContext(
             writer.getNamespaceContext(), nsMap);
+        this.defaultNamespace = defaultNamespace;
     }
 
     @Override
@@ -67,14 +70,27 @@ public class OutTransformWriter extends 
         if (matchesDropped()) {
             return;
         }
-        if (writtenUris.contains(uri)) {
-            return;
-        }
         String value = nsMap.get(uri);
         if (value != null && value.length() == 0) {
             return;
         }
-        super.writeNamespace(prefix, value != null ? value : uri);
+        
+        uri = value != null ? value : uri;
+        
+        if (writtenUris.contains(uri)) {
+            return;
+        }
+        
+        if (defaultNamespace != null && defaultNamespace.equals(uri)) {
+            super.writeDefaultNamespace(uri);
+        } else {
+            if (prefix.length() == 0) {
+                prefix = namespaceContext.findUniquePrefix(uri);
+            }
+            super.writeNamespace(prefix, uri);
+        }
+        writtenUris.add(uri);
+        
     }
     
     @Override
@@ -88,8 +104,7 @@ public class OutTransformWriter extends 
             String theprefix = uri.equals(appendQName.getNamespaceURI()) ? prefix : "";
             write(new QName(appendQName.getNamespaceURI(), appendQName.getLocalPart(), theprefix));
             if (theprefix.length() > 0) {
-                super.writeNamespace(theprefix, uri);
-                writtenUris.add(uri);
+                this.writeNamespace(theprefix, uri);
             }
             appendedElements.add(appendQName);
             appendedIndexes.add(currentDepth - 1);
@@ -139,6 +154,10 @@ public class OutTransformWriter extends 
             }
             
         }
+        if (defaultNamespace != null && defaultNamespace.equals(name.getNamespaceURI())) {
+            prefix = "";
+        }
+        
         super.writeStartElement(prefix, name.getLocalPart(), name.getNamespaceURI());
         if (writeNs) {
             this.writeNamespace(prefix, name.getNamespaceURI());

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java?rev=1158246&r1=1158245&r2=1158246&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java Tue Aug 16 12:52:29 2011
@@ -49,12 +49,13 @@ public final class TransformUtils {
                                                                 Map<String, String> outElementsMap,
                                                                 List<String> outDropElements,
                                                                 Map<String, String> outAppendMap,
-                                                                boolean attributesToElements) {
+                                                                boolean attributesToElements,
+                                                                String defaultNamespace) {
         if (outElementsMap != null || outDropElements != null 
             || outAppendMap != null || attributesToElements) {
             writer = createNewWriterIfNeeded(writer, os);
             writer = new OutTransformWriter(writer, outElementsMap, outAppendMap,
-                                            outDropElements, attributesToElements);
+                                            outDropElements, attributesToElements, defaultNamespace);
         }
         return writer;
     }

Added: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java?rev=1158246&view=auto
==============================================================================
--- cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java (added)
+++ cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java Tue Aug 16 12:52:29 2011
@@ -0,0 +1,126 @@
+/**
+ * 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.ByteArrayOutputStream;
+import java.util.Collections;
+import java.util.HashMap;
+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.XMLStreamWriter;
+
+import org.apache.cxf.staxutils.StaxUtils;
+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, "UTF-8");
+        
+        Map<String, String> outMap = new HashMap<String, String>();
+        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 {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(os, "UTF-8");
+        
+        Map<String, String> outMap = new HashMap<String, String>();
+        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,
+                                                                    null);
+        JAXBContext context = JAXBContext.newInstance(TestBean.class);
+        Marshaller m = context.createMarshaller();
+        m.marshal(new TestBean(), transformWriter);
+        
+        String expected = "<?xml version='1.0' encoding='UTF-8'?>"
+            + "<ps1:testBean xmlns:ps1=\"http://testbeans.com/v2\""
+            + " xmlns:ps2=\"http://testbeans.com/v3\"><ps2:bean/></ps1:testBean>";
+        assertEquals(expected, os.toString());
+        
+    }
+    
+    @Test
+    public void testNamespaceConversionAndDefaultNS() throws Exception {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(os, "UTF-8");
+        
+        Map<String, String> outMap = new HashMap<String, String>();
+        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);
+        
+        String expected = "<?xml version='1.0' encoding='UTF-8'?>"
+            + "<testBean xmlns=\"http://testbeans.com/v2\""
+            + " xmlns:ps2=\"http://testbeans.com/v3\"><ps2:bean/></testBean>";
+        assertEquals(expected, os.toString());
+    }
+ 
+    @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 {
+    }
+}

Propchange: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/OutTransformWriterTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java?rev=1158246&r1=1158245&r2=1158246&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java Tue Aug 16 12:52:29 2011
@@ -50,6 +50,7 @@ public class TransformOutInterceptor ext
     private List<String> outDropElements;
     private boolean attributesToElements;
     private String contextPropertyName;
+    private String defaultNamespace;
     
     public TransformOutInterceptor() {
         this(Phase.PRE_STREAM);
@@ -106,7 +107,8 @@ public class TransformOutInterceptor ext
                                                       outElementsMap,
                                                       outDropElements,
                                                       outAppendMap,
-                                                      attributesToElements);
+                                                      attributesToElements,
+                                                      defaultNamespace);
     }
     
     public void setOutTransformElements(Map<String, String> outElements) {
@@ -132,5 +134,9 @@ public class TransformOutInterceptor ext
     public void setContextPropertyName(String propertyName) {
         contextPropertyName = propertyName;
     }
+
+    public void setDefaultNamespace(String defaultNamespace) {
+        this.defaultNamespace = defaultNamespace;
+    }
     
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=1158246&r1=1158245&r2=1158246&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Tue Aug 16 12:52:29 2011
@@ -589,7 +589,8 @@ public abstract class AbstractJAXBProvid
                                                       outElementsMap,
                                                       outDropElements,
                                                       outAppendMap,
-                                                      attributesToElements);
+                                                      attributesToElements,
+                                                      null);
     }
     
     protected XMLStreamReader createTransformReaderIfNeeded(XMLStreamReader reader, InputStream is) {