You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/04/04 08:36:52 UTC

[07/13] git commit: [CAMEL-6694] lookup logger in registry when single instance available

[CAMEL-6694] lookup logger in registry when single instance available


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/426fa8e3
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/426fa8e3
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/426fa8e3

Branch: refs/heads/camel-2.13.x
Commit: 426fa8e3a53fccc4671e9e3630157ce01bb9b544
Parents: fe8360f
Author: Grzegorz Grzybek <gr...@gmail.com>
Authored: Thu Apr 3 12:51:18 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Apr 4 08:39:03 2014 +0200

----------------------------------------------------------------------
 .../camel/component/log/LogComponent.java       |  19 ++-
 .../component/log/LogCustomLoggerTest.java      | 147 +++++++++++++++++++
 2 files changed, 163 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/426fa8e3/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java b/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
index b3dc3a7..5eebc25 100644
--- a/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
@@ -22,13 +22,16 @@ import java.util.Map;
 import org.apache.camel.Endpoint;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Processor;
+import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.impl.UriEndpointComponent;
 import org.apache.camel.processor.CamelLogProcessor;
 import org.apache.camel.processor.DefaultExchangeFormatter;
 import org.apache.camel.processor.ThroughputLogger;
 import org.apache.camel.spi.ExchangeFormatter;
+import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.CamelLogger;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <a href="http://camel.apache.org/log.html">Log Component</a>
@@ -37,22 +40,32 @@ import org.slf4j.Logger;
  * @version 
  */
 public class LogComponent extends UriEndpointComponent {
+    private static final Logger LOG = LoggerFactory.getLogger(LogComponent.class);
 
     private ExchangeFormatter exchangeFormatter;
 
     public LogComponent() {
         super(LogEndpoint.class);
     }
-    
+
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
         LoggingLevel level = getLoggingLevel(parameters);
         Logger providedLogger = getLogger(parameters);
 
+        if (providedLogger == null) {
+            // try to look up the logger in registry
+            Map<String, Logger> availableLoggers = getCamelContext().getRegistry().findByTypeWithName(Logger.class);
+            if (availableLoggers.size() == 1) {
+                providedLogger = availableLoggers.values().iterator().next();
+            } else if (availableLoggers.size() > 1) {
+                LOG.info("More than one {} instance found in the registry. Falling back to creating logger from URI {}.", Logger.class.getName(), uri);
+            }
+        }
         LogEndpoint endpoint = new LogEndpoint(uri, this);
         endpoint.setLevel(level.name());
         setProperties(endpoint, parameters);
 
-        CamelLogger camelLogger = null; 
+        CamelLogger camelLogger = null;
         if (providedLogger == null) {
             camelLogger = new CamelLogger(remaining, level, endpoint.getMarker());
         } else {
@@ -66,7 +79,7 @@ public class LogComponent extends UriEndpointComponent {
             Long groupDelay = endpoint.getGroupDelay();
             logger = new ThroughputLogger(camelLogger, this.getCamelContext(), endpoint.getGroupInterval(), groupDelay, groupActiveOnly);
         } else {
-            // first, try to use the user-specified formatter (or the one picked up from the Registry and transferred to 
+            // 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) {

http://git-wip-us.apache.org/repos/asf/camel/blob/426fa8e3/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java b/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java
new file mode 100644
index 0000000..7114f53
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/log/LogCustomLoggerTest.java
@@ -0,0 +1,147 @@
+/**
+ * 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.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ResolveEndpointFailedException;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.impl.PropertyPlaceholderDelegateRegistry;
+import org.apache.camel.impl.SimpleRegistry;
+import org.apache.log4j.*;
+import org.apache.log4j.spi.LoggingEvent;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import java.io.StringWriter;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Custom Logger test.
+ */
+public class LogCustomLoggerTest extends ContextTestSupport {
+
+    // to capture the logs
+    private static StringWriter sw1;
+    // to capture the warnings from LogComponent
+    private static StringWriter sw2;
+
+    private static class CapturingAppender extends AppenderSkeleton {
+        private StringWriter sw;
+
+        private CapturingAppender(StringWriter sw) {
+            this.sw = sw;
+        }
+
+        @Override
+        protected void append(LoggingEvent event) {
+            this.sw.append(event.getLoggerName());
+        }
+
+        @Override
+        public void close() {
+        }
+
+        @Override
+        public boolean requiresLayout() {
+            return false;
+        }
+    }
+
+    @Before @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        sw1 = new StringWriter();
+        sw2 = new StringWriter();
+        Logger.getLogger(LogCustomLoggerTest.class).removeAllAppenders();
+        Logger.getLogger(LogCustomLoggerTest.class).addAppender(new CapturingAppender(sw1));
+        Logger.getLogger(LogCustomLoggerTest.class).setLevel(Level.TRACE);
+        Logger.getLogger("provided.logger1.name").removeAllAppenders();
+        Logger.getLogger("provided.logger1.name").addAppender(new CapturingAppender(sw1));
+        Logger.getLogger("provided.logger1.name").setLevel(Level.TRACE);
+        Logger.getLogger("provided.logger2.name").removeAllAppenders();
+        Logger.getLogger("provided.logger2.name").addAppender(new CapturingAppender(sw1));
+        Logger.getLogger("provided.logger2.name").setLevel(Level.TRACE);
+        Logger.getLogger("irrelevant.logger.name").removeAllAppenders();
+        Logger.getLogger("irrelevant.logger.name").addAppender(new CapturingAppender(sw1));
+        Logger.getLogger("irrelevant.logger.name").setLevel(Level.TRACE);
+        Logger.getLogger(LogComponent.class).removeAllAppenders();
+        Logger.getLogger(LogComponent.class).addAppender(new CapturingAppender(sw2));
+        Logger.getLogger(LogComponent.class).setLevel(Level.TRACE);
+    }
+
+    @Test
+    public void testFallbackLogger() throws Exception {
+        String endpointUri = "log:" + LogCustomLoggerTest.class.getCanonicalName();
+        template.requestBody(endpointUri, "hello");
+        assertThat(sw1.toString(), equalTo(LogCustomLoggerTest.class.getCanonicalName()));
+    }
+
+    @Test
+    public void testEndpointURIParametrizedLogger() throws Exception {
+        getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name"));
+        getRegistry().put("logger2", LoggerFactory.getLogger("provided.logger2.name"));
+        template.requestBody("log:irrelevant.logger.name?logger=#logger2", "hello");
+        assertThat(sw1.toString(), equalTo("provided.logger2.name"));
+    }
+
+    @Test
+    public void testEndpointURIParametrizedNotResolvableLogger() {
+        getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name"));
+        try {
+            template.requestBody("log:irrelevant.logger.name?logger=#logger2", "hello");
+        } catch (ResolveEndpointFailedException e) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testDefaultRegistryLogger() throws Exception {
+        getRegistry().put("logger", LoggerFactory.getLogger("provided.logger1.name"));
+        template.requestBody("log:irrelevant.logger.name", "hello");
+        assertThat(sw1.toString(), equalTo("provided.logger1.name"));
+    }
+
+    @Test
+    public void testTwoRegistryLoggers() throws Exception {
+        getRegistry().put("logger1", LoggerFactory.getLogger("provided.logger1.name"));
+        getRegistry().put("logger2", LoggerFactory.getLogger("provided.logger2.name"));
+        template.requestBody("log:irrelevant.logger.name", "hello");
+        assertThat(sw1.toString(), equalTo("irrelevant.logger.name"));
+        assertThat(sw2.toString(), equalTo(LogComponent.class.getName()));
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        return new DefaultCamelContext(new SimpleRegistry());
+    }
+
+    private SimpleRegistry getRegistry() {
+        SimpleRegistry registry = null;
+        if (context.getRegistry() instanceof PropertyPlaceholderDelegateRegistry) {
+            registry = (SimpleRegistry) ((PropertyPlaceholderDelegateRegistry) context.getRegistry()).getRegistry();
+        } else {
+            fail("Could not determine Registry type");
+        }
+        return registry;
+    }
+
+}