Skip to content

Commit

Permalink
Push down looking for the Message Encoding property
Browse files Browse the repository at this point in the history
  • Loading branch information
Cyrille Chépélov committed Dec 1, 2017
1 parent f58b886 commit 58de618
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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);
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);
}
}
}
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@


import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@


import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions core/src/main/java/org/apache/cxf/message/MessageUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.apache.cxf.message;

import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;

import org.w3c.dom.Node;
Expand Down Expand Up @@ -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;
}

}

0 comments on commit 58de618

Please sign in to comment.