diff options
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/util')
-rw-r--r-- | src/main/java/at/gv/egiz/moazs/util/CXFMessageUtils.java | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/util/CXFMessageUtils.java b/src/main/java/at/gv/egiz/moazs/util/CXFMessageUtils.java new file mode 100644 index 0000000..07fdfb6 --- /dev/null +++ b/src/main/java/at/gv/egiz/moazs/util/CXFMessageUtils.java @@ -0,0 +1,92 @@ +package at.gv.egiz.moazs.util; + +import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.io.CachedOutputStream; +import org.apache.cxf.io.CachedWriter; +import org.apache.cxf.io.DelegatingInputStream; +import org.apache.cxf.message.Message; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.SequenceInputStream; + +@Component +public class CXFMessageUtils { + + private static final Logger LOG = LoggerFactory.getLogger(CXFMessageUtils.class); + + /** + * Copy and return content of org.apache.cxf.message.Message; Restore InputStream / Reader from + * message.getContent() after consuming it. + * @param message + * @return + * @throws IOException + */ + public byte[] copyContent(Message message) throws IOException { + + if (message.getContent(InputStream.class) != null) { + return streamMessageContentToByteArray(message); + } else if (message.getContent(Reader.class) != null) { + return readMessageContentToByteArray(message); + } else { + LOG.warn("Message Content is neither Reader nor InputStream; will return empty content."); + return new byte[0]; + } + } + + /** + * Source: Adapted from ApacheCXF 3.3.0 / LoggingInInterceptor.logInputStream() + * @param message + * @return copy of message content + * @throws IOException + */ + private byte[] streamMessageContentToByteArray(Message message) throws IOException { + + var in = message.getContent(InputStream.class); + + try (var out = new CachedOutputStream()) { + + // use the appropriate input stream and restore it later + InputStream bis = in instanceof DelegatingInputStream + ? ((DelegatingInputStream)in).getInputStream() : in; + + //only copy up to the limit since that's all we need to log + //we can stream the rest + IOUtils.copy(bis, out); + out.flush(); + bis = new SequenceInputStream(out.getInputStream(), bis); + + // restore the delegating input stream or the input stream + if (in instanceof DelegatingInputStream) { + ((DelegatingInputStream)in).setInputStream(bis); + } else { + message.setContent(InputStream.class, bis); + } + + return out.getBytes(); + } + + } + + /** + * Source: Adapted from ApacheCXF 3.3.0 / LoggingInInterceptor.logReader() + * @param message + * @return copy of message content + * @throws IOException + */ + private byte[] readMessageContentToByteArray(Message message) throws IOException { + var reader = message.getContent(Reader.class); + var writer = new CachedWriter(); + IOUtils.copyAndCloseInput(reader, writer); + message.setContent(Reader.class, writer.getReader()); + + var buffer = new StringBuilder(); + writer.writeCacheTo(buffer); + return buffer.toString().getBytes(); + } + +} |