Author: raulk Date: Thu Mar 28 00:49:36 2013 New Revision: 1461910 URL: http://svn.apache.org/r1461910 Log: CAMEL-5698 Allow to set a custom LogFormatter in the Log component
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/log/LogCustomFormatterTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java?rev=1461910&r1=1461909&r2=1461910&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java Thu Mar 28 00:49:36 2013 @@ -25,6 +25,7 @@ import org.apache.camel.Processor; import org.apache.camel.impl.DefaultComponent; import org.apache.camel.processor.CamelLogProcessor; import org.apache.camel.processor.ThroughputLogger; +import org.apache.camel.spi.ExchangeFormatter; import org.apache.camel.util.CamelLogger; /** @@ -35,6 +36,8 @@ import org.apache.camel.util.CamelLogger */ public class LogComponent extends DefaultComponent { + private ExchangeFormatter exchangeFormatter; + protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { LoggingLevel level = getLoggingLevel(parameters); String marker = getAndRemoveParameter(parameters, "marker", String.class); @@ -50,10 +53,19 @@ public class LogComponent extends Defaul Long groupDelay = getAndRemoveParameter(parameters, "groupDelay", Long.class); logger = new ThroughputLogger(camelLogger, this.getCamelContext(), groupInterval, groupDelay, groupActiveOnly); } else { - LogFormatter formatter = new LogFormatter(); - setProperties(formatter, parameters); - - logger = new CamelLogProcessor(camelLogger, formatter); + // first, try to use the user-specified formatter (or the one picked up from the Registry and transferred to + // the property by a previous endpoint initialisation); if null, try to pick it up from the Registry now + ExchangeFormatter localFormatter = exchangeFormatter; + if (localFormatter == null) { + localFormatter = getCamelContext().getRegistry().lookupByNameAndType("logFormatter", ExchangeFormatter.class); + exchangeFormatter = localFormatter; + } + // if no formatter is available in the Registry, create a local one of the default type, for a single use + if (localFormatter == null) { + localFormatter = new LogFormatter(); + setProperties(localFormatter, parameters); + } + logger = new CamelLogProcessor(camelLogger, localFormatter); } LogEndpoint endpoint = new LogEndpoint(uri, this); @@ -69,4 +81,18 @@ public class LogComponent extends Defaul return LoggingLevel.valueOf(levelText.toUpperCase(Locale.ENGLISH)); } + public ExchangeFormatter getExchangeFormatter() { + return exchangeFormatter; + } + + /** + * Sets a custom {@link ExchangeFormatter} to convert the Exchange to a String suitable for logging. + * <p /> + * If not specified, we default to {@link LogFormatter}. + * @param exchangeFormatter + */ + public void setExchangeFormatter(ExchangeFormatter exchangeFormatter) { + this.exchangeFormatter = exchangeFormatter; + } + } Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/log/LogCustomFormatterTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/log/LogCustomFormatterTest.java?rev=1461910&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/log/LogCustomFormatterTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/log/LogCustomFormatterTest.java Thu Mar 28 00:49:36 2013 @@ -0,0 +1,142 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.log; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry; +import org.apache.camel.spi.ExchangeFormatter; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.SimpleLayout; +import org.junit.Before; +import org.junit.Test; + +/** + * Custom Exchange Formatter test. + */ +public class LogCustomFormatterTest extends ContextTestSupport { + + private TestExchangeFormatter exchangeFormatter; + + @Before @Override + public void setUp() throws Exception { + super.setUp(); + // we add an appender explicitly to avoid getting a NOPLogger which permit logging; + // otherwise the ExchangeFormatter wouldn't get called + Logger.getLogger(LogCustomFormatterTest.class).removeAllAppenders(); + Logger.getLogger(LogCustomFormatterTest.class).addAppender(new ConsoleAppender(new SimpleLayout())); + Logger.getLogger(LogCustomFormatterTest.class).setLevel(Level.TRACE); + } + + @Test + public void testCustomFormatterInComponent() throws Exception { + context.stop(); + + LogComponent log = new LogComponent(); + exchangeFormatter = new TestExchangeFormatter(); + log.setExchangeFormatter(exchangeFormatter); + context.addComponent("log", log); + + context.start(); + + String endpointUri = "log:" + LogCustomFormatterTest.class.getCanonicalName(); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + + assertEquals(4, exchangeFormatter.getCounter()); + } + + @Test + public void testCustomFormatterInRegistry() throws Exception { + context.stop(); + + exchangeFormatter = new TestExchangeFormatter(); + JndiRegistry registry = getRegistryAsJndi(); + registry.bind("logFormatter", exchangeFormatter); + + context.start(); + + String endpointUri = "log:" + LogCustomFormatterTest.class.getCanonicalName(); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + + assertEquals(4, exchangeFormatter.getCounter()); + } + + @Test + public void testFormatterNotPickedUpWithDifferentKey() throws Exception { + context.stop(); + + exchangeFormatter = new TestExchangeFormatter(); + JndiRegistry registry = getRegistryAsJndi(); + registry.bind("anotherFormatter", exchangeFormatter); + + context.start(); + + String endpointUri = "log:" + LogCustomFormatterTest.class.getCanonicalName(); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri, "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + template.requestBody(endpointUri + "2", "Hello World"); + + assertEquals(0, exchangeFormatter.getCounter()); + } + + private JndiRegistry getRegistryAsJndi() { + JndiRegistry registry = null; + if (context.getRegistry() instanceof PropertyPlaceholderDelegateRegistry) { + registry = (JndiRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry(); + } else if (context.getRegistry() instanceof JndiRegistry) { + registry = (JndiRegistry) context.getRegistry(); + } else { + fail("Could not determine Registry type"); + } + return registry; + } + + public static class TestExchangeFormatter implements ExchangeFormatter { + private int counter = 0; + private boolean addTen = false; + + @Override + public String format(Exchange exchange) { + counter += addTen ? 10 : 1; + return exchange.toString(); + } + + public int getCounter() { + return counter; + } + + public boolean isAddTen() { + return addTen; + } + + public void setAddTen(boolean addTen) { + this.addTen = addTen; + } + + } + +}