From 58de618b29c4c37298d038be06ec9be75aa9deee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cyrille=20Ch=C3=A9p=C3=A9lov?= Date: Fri, 1 Dec 2017 17:06:06 +0100 Subject: [PATCH] Push down looking for the Message Encoding property --- .../feature/transform/XSLTInInterceptor.java | 23 ++++++++----------- .../feature/transform/XSLTOutInterceptor.java | 18 ++++++--------- .../transform/TransformInInterceptor.java | 9 ++------ .../transform/TransformOutInterceptor.java | 9 ++------ .../org/apache/cxf/message/MessageUtils.java | 12 ++++++++++ 5 files changed, 33 insertions(+), 38 deletions(-) diff --git a/core/src/main/java/org/apache/cxf/feature/transform/XSLTInInterceptor.java b/core/src/main/java/org/apache/cxf/feature/transform/XSLTInInterceptor.java index 2dacf166c92..bb97fe34f80 100644 --- a/core/src/main/java/org/apache/cxf/feature/transform/XSLTInInterceptor.java +++ b/core/src/main/java/org/apache/cxf/feature/transform/XSLTInInterceptor.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; -import java.nio.charset.StandardCharsets; import java.util.logging.Logger; import javax.xml.stream.XMLStreamException; @@ -34,6 +33,7 @@ import org.apache.cxf.interceptor.StaxInInterceptor; import org.apache.cxf.io.CachedOutputStream; import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageUtils; import org.apache.cxf.phase.Phase; import org.apache.cxf.staxutils.StaxUtils; @@ -58,34 +58,30 @@ public void handleMessage(Message message) { return; } - String encoding = (String)message.getContextualProperty(Message.ENCODING); - if (encoding == null) { - encoding = StandardCharsets.UTF_8.name(); - } - - // 1. Try to get and transform XMLStreamReader message content XMLStreamReader xReader = message.getContent(XMLStreamReader.class); if (xReader != null) { - transformXReader(message, xReader, encoding); + transformXReader(message, xReader); } else { // 2. Try to get and transform InputStream message content InputStream is = message.getContent(InputStream.class); if (is != null) { - transformIS(message, is, encoding); + transformIS(message, is); } else { // 3. Try to get and transform Reader message content (actually used for JMS TextMessage) Reader reader = message.getContent(Reader.class); if (reader != null) { - transformReader(message, reader); // reader already encapulates encoding + transformReader(message, reader); } } } } - protected void transformXReader(Message message, XMLStreamReader xReader, String encoding) { + protected void transformXReader(Message message, XMLStreamReader xReader) { CachedOutputStream cachedOS = new CachedOutputStream(); try { + final String encoding = MessageUtils.getMessageEncoding(message); + StaxUtils.copy(xReader, cachedOS, encoding); InputStream transformedIS = XSLTUtils.transform(getXSLTTemplate(), cachedOS.getInputStream(), encoding); XMLStreamReader transformedReader = StaxUtils.createXMLStreamReader(transformedIS, encoding); @@ -108,9 +104,10 @@ protected void transformXReader(Message message, XMLStreamReader xReader, String } } - protected void transformIS(Message message, InputStream is, String encoding) { + protected void transformIS(Message message, InputStream is) { try { - InputStream transformedIS = XSLTUtils.transform(getXSLTTemplate(), is, encoding); + InputStream transformedIS = XSLTUtils.transform(getXSLTTemplate(), is, + MessageUtils.getMessageEncoding(message)); message.setContent(InputStream.class, transformedIS); } finally { try { diff --git a/core/src/main/java/org/apache/cxf/feature/transform/XSLTOutInterceptor.java b/core/src/main/java/org/apache/cxf/feature/transform/XSLTOutInterceptor.java index 18388023788..886bf033dc3 100644 --- a/core/src/main/java/org/apache/cxf/feature/transform/XSLTOutInterceptor.java +++ b/core/src/main/java/org/apache/cxf/feature/transform/XSLTOutInterceptor.java @@ -24,7 +24,6 @@ import java.io.OutputStream; import java.io.Reader; import java.io.Writer; -import java.nio.charset.StandardCharsets; import java.util.logging.Logger; import javax.xml.stream.XMLStreamException; @@ -41,6 +40,7 @@ import org.apache.cxf.io.CachedOutputStreamCallback; import org.apache.cxf.io.CachedWriter; import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageUtils; import org.apache.cxf.phase.Phase; import org.apache.cxf.staxutils.DelegatingXMLStreamWriter; import org.apache.cxf.staxutils.StaxUtils; @@ -65,25 +65,20 @@ public void handleMessage(Message message) { return; } - String encoding = (String)message.getContextualProperty(Message.ENCODING); - if (encoding == null) { - encoding = StandardCharsets.UTF_8.name(); - } - // 1. Try to get and transform XMLStreamWriter message content XMLStreamWriter xWriter = message.getContent(XMLStreamWriter.class); if (xWriter != null) { - transformXWriter(message, xWriter); // The effective output encoding depends on the encoding of the xWriter + transformXWriter(message, xWriter); } else { // 2. Try to get and transform OutputStream message content OutputStream out = message.getContent(OutputStream.class); if (out != null) { - transformOS(message, out, encoding); + transformOS(message, out); } else { // 3. Try to get and transform Writer message content (actually used for JMS TextMessage) Writer writer = message.getContent(Writer.class); if (writer != null) { - transformWriter(message, writer); // The effective output encoding depends xWriter's encoding + transformWriter(message, writer); } } } @@ -98,9 +93,10 @@ protected void transformXWriter(Message message, XMLStreamWriter xWriter) { Boolean.TRUE); } - protected void transformOS(Message message, OutputStream out, String encoding) { + protected void transformOS(Message message, OutputStream out) { CachedOutputStream wrapper = new CachedOutputStream(); - CachedOutputStreamCallback callback = new XSLTCachedOutputStreamCallback(getXSLTTemplate(), out, encoding); + CachedOutputStreamCallback callback = new XSLTCachedOutputStreamCallback(getXSLTTemplate(), out, + MessageUtils.getMessageEncoding(message)); wrapper.registerCallback(callback); message.setContent(OutputStream.class, wrapper); } diff --git a/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java b/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java index bb0fe168555..6434a4952fd 100644 --- a/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java +++ b/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java @@ -21,7 +21,6 @@ import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -76,14 +75,10 @@ public void handleMessage(Message message) { return; } - String encoding = (String)message.getContextualProperty(Message.ENCODING); - if (encoding == null) { - encoding = StandardCharsets.UTF_8.name(); - } - XMLStreamReader reader = message.getContent(XMLStreamReader.class); InputStream is = message.getContent(InputStream.class); - + + final String encoding = MessageUtils.getMessageEncoding(message); XMLStreamReader transformReader = createTransformReaderIfNeeded(reader, is, encoding); if (transformReader != null) { message.setContent(XMLStreamReader.class, transformReader); 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 ee687c9f697..d1fa499a03c 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,7 +21,6 @@ import java.io.OutputStream; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -93,14 +92,10 @@ public void handleMessage(Message message) { return; } - String encoding = (String)message.getContextualProperty(Message.ENCODING); - if (encoding == null) { - encoding = StandardCharsets.UTF_8.name(); - } - XMLStreamWriter writer = message.getContent(XMLStreamWriter.class); OutputStream out = message.getContent(OutputStream.class); - + + final String encoding = MessageUtils.getMessageEncoding(message); XMLStreamWriter transformWriter = createTransformWriterIfNeeded(writer, out, encoding); if (transformWriter != null) { message.setContent(XMLStreamWriter.class, transformWriter); diff --git a/core/src/main/java/org/apache/cxf/message/MessageUtils.java b/core/src/main/java/org/apache/cxf/message/MessageUtils.java index 75459a705fb..f56c3de9942 100644 --- a/core/src/main/java/org/apache/cxf/message/MessageUtils.java +++ b/core/src/main/java/org/apache/cxf/message/MessageUtils.java @@ -19,6 +19,7 @@ package org.apache.cxf.message; +import java.nio.charset.StandardCharsets; import java.util.logging.Logger; import org.w3c.dom.Node; @@ -188,4 +189,15 @@ public static boolean isDOMPresent(Message m) { */ } + /** + * Returns the effective encoding of the message (which defaults to UTF_8 if unspecified) + */ + public static String getMessageEncoding(Message m) { + String encoding = (String)m.getContextualProperty(Message.ENCODING); + if (encoding == null) { + encoding = StandardCharsets.UTF_8.name(); + } + return encoding; + } + }