Author: davsclaus Date: Fri Sep 11 08:30:41 2009 New Revision: 813717 URL: http://svn.apache.org/viewvc?rev=813717&view=rev Log: CAMEL-1995: Streams are by default not logged to avoid causing the stream to be read and then later not possible to read it again. There is a flag to control this behavior on camel context properties. Fixed CS.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyStreamsTest.java - copied, changed from r813675, camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyMaxCharsTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=813717&r1=813716&r2=813717&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Fri Sep 11 08:30:41 2009 @@ -81,6 +81,7 @@ String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint"; String LOG_DEBUG_BODY_MAX_CHARS = "CamelLogDebugBodyMaxChars"; + String LOG_DEBUG_BODY_STREAMS = "CamelLogDebugStreams"; String LOOP_INDEX = "CamelLoopIndex"; String LOOP_SIZE = "CamelLoopSize"; Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java?rev=813717&r1=813716&r2=813717&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageHelper.java Fri Sep 11 08:30:41 2009 @@ -16,9 +16,17 @@ */ package org.apache.camel.util; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import javax.xml.transform.stream.StreamSource; + import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.StreamCache; +import org.apache.camel.converter.jaxp.BytesSource; +import org.apache.camel.converter.jaxp.StringSource; /** * Some helper methods when working with {...@link org.apache.camel.Message}. @@ -123,6 +131,34 @@ * @return the logging message */ public static String extractBodyForLogging(Message message) { + Object obj = message.getBody(); + if (obj == null) { + return "Message: [Body is null]"; + } + + // do not log streams by default + boolean streams = false; + if (message.getExchange() != null) { + String property = message.getExchange().getContext().getProperties().get(Exchange.LOG_DEBUG_BODY_STREAMS); + if (property != null) { + streams = message.getExchange().getContext().getTypeConverter().convertTo(Boolean.class, property); + } + } + + if (obj instanceof StringSource || obj instanceof BytesSource) { + // these two are okay + } else if (!streams && obj instanceof StreamSource) { + return "Message: [Body is instance of java.xml.transform.StreamSource]"; + } else if (!streams && obj instanceof InputStream) { + return "Message: [Body is instance of java.io.InputStream]"; + } else if (!streams && obj instanceof OutputStream) { + return "Message: [Body is instance of java.io.OutputStream]"; + } else if (!streams && obj instanceof Reader) { + return "Message: [Body is instance of java.io.Reader]"; + } else if (!streams && obj instanceof Writer) { + return "Message: [Body is instance of java.io.Writer]"; + } + // default to 1000 chars int length = 1000; @@ -133,11 +169,6 @@ } } - Object obj = message.getBody(); - if (obj == null) { - return "Message: [Body is null]"; - } - String body = obj.toString(); if (body == null) { return "Message: [Body is null]"; @@ -150,4 +181,5 @@ return "Message: " + body; } + } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java?rev=813717&r1=813716&r2=813717&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java Fri Sep 11 08:30:41 2009 @@ -44,7 +44,7 @@ assertEquals("CBA", stopOrder); } - private class MyService implements Service { + private final class MyService implements Service { private String name; private boolean fail; Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyStreamsTest.java (from r813675, camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyMaxCharsTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyStreamsTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyStreamsTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyMaxCharsTest.java&r1=813675&r2=813717&rev=813717&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyMaxCharsTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/LogDebugBodyStreamsTest.java Fri Sep 11 08:30:41 2009 @@ -16,30 +16,41 @@ */ package org.apache.camel.impl; +import java.io.ByteArrayInputStream; +import java.io.InputStream; + import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.converter.jaxp.StringSource; /** * @version $Revision$ */ -public class LogDebugBodyMaxCharsTest extends ContextTestSupport { +public class LogDebugBodyStreamsTest extends ContextTestSupport { - @Override - protected void setUp() throws Exception { - super.setUp(); - context.getProperties().put(Exchange.LOG_DEBUG_BODY_MAX_CHARS, "20"); + public void testLogBodyStreamStringSourceDisabled() throws Exception { + context.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "false"); + + StringSource body = new StringSource("<?xml version=\"1.0\"?><person><name>Claus</name></person>"); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + + template.sendBody("direct:start", body); + + assertMockEndpointsSatisfied(); + + // should be logged anyway + String msg = mock.getReceivedExchanges().get(0).getIn().toString(); + assertEquals("Message: StringSource[<?xml version=\"1.0\"?><person><name>Claus</name></person>]", msg); } - public void testLogBodyMaxLengthTest() throws Exception { - // create a big body - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < 1000; i++) { - int value = i % 10; - sb.append(value); - } - String body = sb.toString(); + public void testLogBodyStreamStringSourceDisabledByDefault() throws Exception { + context.getProperties().remove(Exchange.LOG_DEBUG_BODY_STREAMS); + + StringSource body = new StringSource("<?xml version=\"1.0\"?><person><name>Claus</name></person>"); MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(1); @@ -48,28 +59,78 @@ assertMockEndpointsSatisfied(); - // should be clipped after 20 chars + // should be logged anyway String msg = mock.getReceivedExchanges().get(0).getIn().toString(); - assertEquals("Message: 01234567890123456789... [Body clipped after 20 chars, total length is 1000]", msg); + assertEquals("Message: StringSource[<?xml version=\"1.0\"?><person><name>Claus</name></person>]", msg); + } + + public void testLogBodyStreamStringSourceEnabled() throws Exception { + context.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "true"); + + StringSource body = new StringSource("<?xml version=\"1.0\"?><person><name>Claus</name></person>"); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); - // but body and clipped should not be the same - assertNotSame("clipped log and real body should not be the same", msg, mock.getReceivedExchanges().get(0).getIn().getBody(String.class)); + template.sendBody("direct:start", body); + + assertMockEndpointsSatisfied(); + + // should be logged anyway + String msg = mock.getReceivedExchanges().get(0).getIn().toString(); + assertEquals("Message: StringSource[<?xml version=\"1.0\"?><person><name>Claus</name></person>]", msg); } - public void tesNotClipped() throws Exception { + public void testLogBodyStreamDisabled() throws Exception { + context.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "false"); + + InputStream body = new ByteArrayInputStream("Hello World".getBytes()); + MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(1); - template.sendBody("direct:start", "1234567890"); + template.sendBody("direct:start", body); + + assertMockEndpointsSatisfied(); + + // should NOT be logged + String msg = mock.getReceivedExchanges().get(0).getIn().toString(); + assertEquals("Message: [Body is instance of java.io.InputStream]", msg); + } + + public void testLogBodyStreamDisabledByDefault() throws Exception { + context.getProperties().remove(Exchange.LOG_DEBUG_BODY_STREAMS); + + InputStream body = new ByteArrayInputStream("Hello World".getBytes()); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + + template.sendBody("direct:start", body); assertMockEndpointsSatisfied(); - // should be clipped after 20 chars + // should NOT be logged String msg = mock.getReceivedExchanges().get(0).getIn().toString(); - assertEquals("Message: 01234567890", msg); + assertEquals("Message: [Body is instance of java.io.InputStream]", msg); + } + + public void testLogBodyStreamEnabled() throws Exception { + context.getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "true"); + + InputStream body = new ByteArrayInputStream("Hello World".getBytes()); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + + template.sendBody("direct:start", body); - // but body and clipped should not be the same - assertNotSame("clipped log and real body should not be the same", msg, mock.getReceivedExchanges().get(0).getIn().getBody(String.class)); + assertMockEndpointsSatisfied(); + + // should be logged + String msg = mock.getReceivedExchanges().get(0).getIn().toString(); + assertNotSame("Message: [Body is instance of java.io.InputStream]", msg); + assertIsInstanceOf(InputStream.class, mock.getReceivedExchanges().get(0).getIn().getBody()); } @Override @@ -81,4 +142,4 @@ } }; } -} +} \ No newline at end of file Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java?rev=813717&r1=813716&r2=813717&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java Fri Sep 11 08:30:41 2009 @@ -82,7 +82,7 @@ assertEquals("Failure to stop service: B due to Fail B", event.toString()); } - private class MyService implements Service { + private final class MyService implements Service { private String name; private boolean fail;