Revert some of the changes to logging feature and fix the issues using existing concepts
# Conflicts: # rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java # rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java # rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/8c1459e3 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/8c1459e3 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/8c1459e3 Branch: refs/heads/3.1.x-fixes Commit: 8c1459e3399647467ae01f9f2d04b9a9e8853ea0 Parents: 868f248 Author: Daniel Kulp <[email protected]> Authored: Thu Feb 16 16:24:05 2017 -0500 Committer: Daniel Kulp <[email protected]> Committed: Thu Feb 16 17:12:21 2017 -0500 ---------------------------------------------------------------------- .../apache/cxf/ext/logging/LoggingFeature.java | 6 - .../cxf/ext/logging/LoggingInInterceptor.java | 172 ++++++------------- .../org/apache/cxf/ext/logging/WireTapIn.java | 10 +- .../java/org/apache/cxf/jaxws/ServiceImpl.java | 3 +- .../ws/addr_fromjava/WSAFromJavaTest.java | 4 +- 5 files changed, 67 insertions(+), 128 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/8c1459e3/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java ---------------------------------------------------------------------- diff --git a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java index 1e34887..6d383ee 100644 --- a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java +++ b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java @@ -49,21 +49,17 @@ public class LoggingFeature extends AbstractFeature { private LogEventSender sender; private LoggingInInterceptor in; private LoggingOutInterceptor out; - private WireTapIn wireTapIn; private PrettyLoggingFilter prettyFilter; public LoggingFeature() { this.sender = new Slf4jEventSender(); prettyFilter = new PrettyLoggingFilter(sender); - wireTapIn = new WireTapIn(); in = new LoggingInInterceptor(prettyFilter); out = new LoggingOutInterceptor(prettyFilter); } @Override protected void initializeProvider(InterceptorProvider provider, Bus bus) { - - provider.getInInterceptors().add(wireTapIn); provider.getInInterceptors().add(in); provider.getInFaultInterceptors().add(in); @@ -74,13 +70,11 @@ public class LoggingFeature extends AbstractFeature { public void setLimit(int limit) { in.setLimit(limit); out.setLimit(limit); - wireTapIn.setLimit(limit); } public void setInMemThreshold(long inMemThreshold) { in.setInMemThreshold(inMemThreshold); out.setInMemThreshold(inMemThreshold); - wireTapIn.setThreshold(inMemThreshold); } public void setSender(LogEventSender sender) { http://git-wip-us.apache.org/repos/asf/cxf/blob/8c1459e3/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java ---------------------------------------------------------------------- diff --git a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java index 0643bc2..da2afa1 100644 --- a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java +++ b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingInInterceptor.java @@ -18,25 +18,22 @@ */ package org.apache.cxf.ext.logging; -import java.io.InputStream; +import java.io.IOException; import java.io.PrintWriter; -import java.io.Reader; -import java.io.SequenceInputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Collection; import org.apache.cxf.common.injection.NoJSR250Annotations; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.ext.logging.event.DefaultLogEventMapper; -import org.apache.cxf.ext.logging.event.EventType; import org.apache.cxf.ext.logging.event.LogEvent; import org.apache.cxf.ext.logging.event.LogEventSender; import org.apache.cxf.ext.logging.event.PrintWriterEventSender; import org.apache.cxf.ext.logging.slf4j.Slf4jEventSender; -import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.interceptor.Fault; 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.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; @@ -47,144 +44,85 @@ import org.apache.cxf.phase.PhaseInterceptor; */ @NoJSR250Annotations public class LoggingInInterceptor extends AbstractLoggingInterceptor { - class SendLogEventInterceptor extends AbstractPhaseInterceptor<Message> { - SendLogEventInterceptor() { - super(Phase.PRE_INVOKE); + class LoggingInFaultInterceptor extends AbstractPhaseInterceptor<Message> { + LoggingInFaultInterceptor() { + super(Phase.RECEIVE); } @Override public void handleMessage(Message message) throws Fault { - LogEvent event = message.get(LogEvent.class); - if (event != null) { - DefaultLogEventMapper mapper = new DefaultLogEventMapper(); - mapper.setEpInfo(message, event); - event.setType(mapper.getEventType(message)); - message.remove(LogEvent.class); - sender.send(event); - } - } + } + @Override + public void handleFault(Message message) throws Fault { + LoggingInInterceptor.this.handleMessage(message); + } } + public LoggingInInterceptor() { this(new Slf4jEventSender()); } + public LoggingInInterceptor(LogEventSender sender) { + super(Phase.PRE_INVOKE, sender); + } public LoggingInInterceptor(PrintWriter writer) { this(new PrintWriterEventSender(writer)); } - public LoggingInInterceptor(LogEventSender sender) { - super(Phase.RECEIVE, sender); - } public Collection<PhaseInterceptor<? extends Message>> getAdditionalInterceptors() { - PhaseInterceptor<Message> intc = new SendLogEventInterceptor(); - java.util.Set<PhaseInterceptor<? extends Message>> ret = new java.util.HashSet<>(); - ret.add(intc); + Collection<PhaseInterceptor<? extends Message>> ret = new ArrayList<>(); + ret.add(new WireTapIn(limit, threshold)); + ret.add(new LoggingInFaultInterceptor()); return ret; } - - - public void handleFault(Message message) { - LogEvent event = message.get(LogEvent.class); - if (event != null) { - DefaultLogEventMapper mapper = new DefaultLogEventMapper(); - mapper.setEpInfo(message, event); - event.setType(EventType.FAULT_IN); - message.remove(LogEvent.class); - sender.send(event); - } - } + public void handleMessage(Message message) throws Fault { - LogEvent event = message.get(LogEvent.class); - if (event == null) { - createExchangeId(message); - event = new DefaultLogEventMapper().map(message); - if (shouldLogContent(event)) { - addContent(message, event); - } else { - event.setPayload(AbstractLoggingInterceptor.CONTENT_SUPPRESSED); - } - // at this point, we have the payload. However, we may not have the endpoint yet. Delay sending - // the event till a little bit later - message.put(LogEvent.class, event); + createExchangeId(message); + final LogEvent event = new DefaultLogEventMapper().map(message); + if (shouldLogContent(event)) { + addContent(message, event); + } else { + event.setPayload(AbstractLoggingInterceptor.CONTENT_SUPPRESSED); } + sender.send(event); } private void addContent(Message message, final LogEvent event) { - InputStream is = message.getContent(InputStream.class); - if (is != null) { - logInputStream(message, is, event); - } else { - Reader reader = message.getContent(Reader.class); - if (reader != null) { - logReader(message, reader, event); - } - } - } - - protected void logInputStream(Message message, InputStream is, LogEvent event) { - CachedOutputStream bos = new CachedOutputStream(); - if (threshold > 0) { - bos.setThreshold(threshold); - } - String encoding = event.getEncoding(); try { - // use the appropriate input stream and restore it later - InputStream bis = is instanceof DelegatingInputStream - ? ((DelegatingInputStream)is).getInputStream() : is; - - - //only copy up to the limit since that's all we need to log - //we can stream the rest - IOUtils.copyAtLeast(bis, bos, limit == -1 ? Integer.MAX_VALUE : limit); - bos.flush(); - bis = new SequenceInputStream(bos.getInputStream(), bis); - - // restore the delegating input stream or the input stream - if (is instanceof DelegatingInputStream) { - ((DelegatingInputStream)is).setInputStream(bis); - } else { - message.setContent(InputStream.class, bis); - } - - if (bos.getTempFile() != null) { - //large thing on disk... - event.setFullContentFile(bos.getTempFile()); - } - if (bos.size() > limit && limit != -1) { - event.setTruncated(true); - } - - StringBuilder builder = new StringBuilder(limit); - if (StringUtils.isEmpty(encoding)) { - bos.writeCacheTo(builder, limit); + CachedOutputStream cos = message.getContent(CachedOutputStream.class); + if (cos != null) { + handleOutputStream(event, message, cos); } else { - bos.writeCacheTo(builder, encoding, limit); + CachedWriter writer = message.getContent(CachedWriter.class); + if (writer != null) { + handleWriter(event, writer); + } } - bos.close(); - event.setPayload(builder.toString()); - } catch (Exception e) { + } catch (IOException e) { throw new Fault(e); } } - protected void logReader(Message message, Reader reader, LogEvent event) { - try { - CachedWriter writer = new CachedWriter(); - IOUtils.copyAndCloseInput(reader, writer); - message.setContent(Reader.class, writer.getReader()); - - if (writer.getTempFile() != null) { - //large thing on disk... - event.setFullContentFile(writer.getTempFile()); - } - if (writer.size() > limit && limit != -1) { - event.setTruncated(true); - } - int max = writer.size() > limit ? (int)limit : (int)writer.size(); - StringBuilder b = new StringBuilder(max); - writer.writeCacheTo(b); - event.setPayload(b.toString()); - } catch (Exception e) { - throw new Fault(e); + private void handleOutputStream(final LogEvent event, Message message, CachedOutputStream cos) throws IOException { + String encoding = (String)message.get(Message.ENCODING); + if (StringUtils.isEmpty(encoding)) { + encoding = StandardCharsets.UTF_8.name(); } + StringBuilder payload = new StringBuilder(); + cos.writeCacheTo(payload, encoding, limit); + cos.close(); + event.setPayload(payload.toString()); + boolean isTruncated = cos.size() > limit && limit != -1; + event.setTruncated(isTruncated); + event.setFullContentFile(cos.getTempFile()); + } + + private void handleWriter(final LogEvent event, CachedWriter writer) throws IOException { + boolean isTruncated = writer.size() > limit && limit != -1; + StringBuilder payload = new StringBuilder(); + writer.writeCacheTo(payload, limit); + event.setPayload(payload.toString()); + event.setTruncated(isTruncated); + event.setFullContentFile(writer.getTempFile()); } + } http://git-wip-us.apache.org/repos/asf/cxf/blob/8c1459e3/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/WireTapIn.java ---------------------------------------------------------------------- diff --git a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/WireTapIn.java b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/WireTapIn.java index e6b8508..5e117a2 100644 --- a/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/WireTapIn.java +++ b/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/WireTapIn.java @@ -33,6 +33,8 @@ import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; public class WireTapIn extends AbstractPhaseInterceptor<Message> { + private static final String WIRE_TAP_STARTED = WireTapIn.class.getName() + ".Started"; + private long threshold = -1; private int limit = AbstractLoggingInterceptor.DEFAULT_LIMIT; @@ -42,12 +44,18 @@ public class WireTapIn extends AbstractPhaseInterceptor<Message> { * * @param logMessageContent the log message content */ - public WireTapIn() { + public WireTapIn(int limit, long threshold) { super(Phase.RECEIVE); + this.limit = limit; + this.threshold = threshold; } @Override public void handleMessage(final Message message) throws Fault { + if (message.containsKey(WIRE_TAP_STARTED)) { + return; + } + message.put(WIRE_TAP_STARTED, Boolean.TRUE); try { InputStream is = message.getContent(InputStream.class); if (is != null) { http://git-wip-us.apache.org/repos/asf/cxf/blob/8c1459e3/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java index df22406..10a2a4b 100644 --- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java +++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java @@ -129,8 +129,7 @@ public class ServiceImpl extends ServiceDelegate { initialize(b, url, f); } } - - void initialize(Bus b, URL url, WebServiceFeature ... f) { + final void initialize(Bus b, URL url, WebServiceFeature ... f) { if (b == null) { b = BusFactory.getThreadDefaultBus(true); } http://git-wip-us.apache.org/repos/asf/cxf/blob/8c1459e3/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/addr_fromjava/WSAFromJavaTest.java ---------------------------------------------------------------------- diff --git a/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/addr_fromjava/WSAFromJavaTest.java b/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/addr_fromjava/WSAFromJavaTest.java index 23e9978..cf54e1c 100644 --- a/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/addr_fromjava/WSAFromJavaTest.java +++ b/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/addr_fromjava/WSAFromJavaTest.java @@ -131,8 +131,8 @@ public class WSAFromJavaTest extends AbstractWSATestBase { assert false; } - assertTrue(output.toString().indexOf("http://cxf.apache.org/input") != -1); - assertTrue(input.toString().indexOf("http://cxf.apache.org/fault3") != -1); + assertTrue(output.toString(), output.toString().indexOf("http://cxf.apache.org/input") != -1); + assertTrue(input.toString(), input.toString().indexOf("http://cxf.apache.org/fault3") != -1); } @Test
