You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2020/03/12 12:40:51 UTC

[cxf] 01/02: CXF-8234 - Add the encoding to the TransformOutInterceptor XMLStreamWriter

This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 36111759cd4534a395750eb5b17ebfec3c60287d
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Wed Mar 11 14:18:54 2020 +0000

    CXF-8234 - Add the encoding to the TransformOutInterceptor XMLStreamWriter
---
 .../transform/TransformOutInterceptor.java         | 23 +++++++++++++++++-
 .../cxf/staxutils/transform/TransformUtils.java    | 27 ++++++++++++++++++++--
 .../org/apache/cxf/systest/jaxrs/BookStore.java    |  5 ++--
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java b/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
index 505c3d1..ba3a242 100644
--- a/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
+++ b/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
@@ -21,6 +21,7 @@ package org.apache.cxf.interceptor.transform;
 
 
 import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
 
@@ -28,10 +29,12 @@ import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.cxf.interceptor.StaxOutEndingInterceptor;
 import org.apache.cxf.interceptor.StaxOutInterceptor;
+import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 import org.apache.cxf.staxutils.transform.TransformUtils;
 
 import static org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION;
@@ -109,14 +112,32 @@ public class TransformOutInterceptor extends AbstractPhaseInterceptor<Message> {
         }
     }
 
+    private String getEncoding(Message message) {
+        Exchange ex = message.getExchange();
+        String encoding = (String)message.get(Message.ENCODING);
+        if (encoding == null && ex.getInMessage() != null) {
+            encoding = (String) ex.getInMessage().get(Message.ENCODING);
+            message.put(Message.ENCODING, encoding);
+        }
+
+        if (encoding == null) {
+            encoding = StandardCharsets.UTF_8.name();
+            message.put(Message.ENCODING, encoding);
+        }
+        return encoding;
+    }
+
     protected XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer, OutputStream os) {
+        Message m = PhaseInterceptorChain.getCurrentMessage();
+        String encoding = getEncoding(m);
         return TransformUtils.createTransformWriterIfNeeded(writer, os,
                                                       outElementsMap,
                                                       outDropElements,
                                                       outAppendMap,
                                                       outAttributesMap,
                                                       attributesToElements,
-                                                      defaultNamespace);
+                                                      defaultNamespace,
+                                                      encoding);
     }
 
     public void setOutTransformElements(Map<String, String> outElements) {
diff --git a/core/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java b/core/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
index 04a146f..e2c856b 100644
--- a/core/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
+++ b/core/src/main/java/org/apache/cxf/staxutils/transform/TransformUtils.java
@@ -43,7 +43,16 @@ public final class TransformUtils {
     }
 
     public static XMLStreamWriter createNewWriterIfNeeded(XMLStreamWriter writer, OutputStream os) {
-        return writer == null ? StaxUtils.createXMLStreamWriter(os) : writer;
+        return createNewWriterIfNeeded(writer, os, null);
+    }
+
+    public static XMLStreamWriter createNewWriterIfNeeded(XMLStreamWriter writer, OutputStream os, String encoding) {
+        if (writer != null) {
+            return writer;
+        } else if (encoding != null) {
+            return StaxUtils.createXMLStreamWriter(os, encoding);
+        }
+        return StaxUtils.createXMLStreamWriter(os);
     }
 
     public static XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer,
@@ -70,9 +79,23 @@ public final class TransformUtils {
                                                                 Map<String, String> outAttributesMap,
                                                                 boolean attributesToElements,
                                                                 String defaultNamespace) {
+        return createTransformWriterIfNeeded(writer, os, outElementsMap, outDropElements,
+                                             outAppendMap, outAttributesMap, attributesToElements,
+                                             defaultNamespace, null);
+    }
+
+    public static XMLStreamWriter createTransformWriterIfNeeded(XMLStreamWriter writer,
+                                                                OutputStream os,
+                                                                Map<String, String> outElementsMap,
+                                                                List<String> outDropElements,
+                                                                Map<String, String> outAppendMap,
+                                                                Map<String, String> outAttributesMap,
+                                                                boolean attributesToElements,
+                                                                String defaultNamespace,
+                                                                String encoding) {
         if (outElementsMap != null || outDropElements != null
             || outAppendMap != null || attributesToElements) {
-            writer = new OutTransformWriter(createNewWriterIfNeeded(writer, os), outElementsMap, outAppendMap,
+            writer = new OutTransformWriter(createNewWriterIfNeeded(writer, os, encoding), outElementsMap, outAppendMap,
                                             outDropElements, outAttributesMap, attributesToElements, defaultNamespace);
         }
         return writer;
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
index 17898b9..6418293 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
@@ -1509,7 +1509,8 @@ public class BookStore {
         String ct1 = httpHeaders.getMediaType().toString();
         String ct2 = httpHeaders.getRequestHeader("Content-Type").get(0);
         String ct3 = httpHeaders.getRequestHeaders().getFirst("Content-Type");
-        if (!("application/xml".equals(ct1) && ct1.equals(ct2) && ct1.equals(ct3))) {
+        if (!(ct1.startsWith("application/xml") && ct2.startsWith("application/xml")
+            && ct3.startsWith("application/xml"))) {
             throw new RuntimeException("Unexpected content type");
         }
 
@@ -1704,7 +1705,7 @@ public class BookStore {
         return Response.accepted(name).build();
     }
 
-    
+
     @POST
     @Path("/empty202")
     @Consumes("text/plain")