WIP
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8c97cad0 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8c97cad0 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8c97cad0 Branch: refs/heads/camel-hystrix Commit: 8c97cad0e837d3e1bf4d1d38113b27bd8616f679 Parents: eab6bca Author: Raul Kripalani <ra...@apache.org> Authored: Sun Feb 16 17:36:45 2014 +0000 Committer: Raul Kripalani <ra...@apache.org> Committed: Sun Feb 16 17:36:45 2014 +0000 ---------------------------------------------------------------------- .../camel/processor/CamelLogProcessor.java | 10 ++++++- .../java/org/apache/camel/util/CamelLogger.java | 30 ++++++++++++++++---- .../org/apache/camel/util/ObjectHelper.java | 27 ++++++++++++++++++ parent/pom.xml | 1 + 4 files changed, 61 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8c97cad0/camel-core/src/main/java/org/apache/camel/processor/CamelLogProcessor.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/processor/CamelLogProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/CamelLogProcessor.java index 052d1e7..521ce9c 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/CamelLogProcessor.java +++ b/camel-core/src/main/java/org/apache/camel/processor/CamelLogProcessor.java @@ -16,6 +16,8 @@ */ package org.apache.camel.processor; +import java.util.concurrent.Callable; + import org.apache.camel.AsyncCallback; import org.apache.camel.AsyncProcessor; import org.apache.camel.Exchange; @@ -24,6 +26,7 @@ import org.apache.camel.Processor; import org.apache.camel.spi.ExchangeFormatter; import org.apache.camel.util.AsyncProcessorHelper; import org.apache.camel.util.CamelLogger; +import org.apache.camel.util.ObjectHelper; /** * A {@link Processor} which just logs to a {@link CamelLogger} object which can be used @@ -39,7 +42,12 @@ public class CamelLogProcessor implements AsyncProcessor { private ExchangeFormatter formatter; public CamelLogProcessor() { - this(new CamelLogger(CamelLogProcessor.class.getName())); + this(ObjectHelper.runWithClassLoader(null, new Callable<CamelLogger>() { + @Override + public CamelLogger call() throws Exception { + return new CamelLogger(CamelLogProcessor.class.getName()); + } + })); } public CamelLogProcessor(CamelLogger log) { http://git-wip-us.apache.org/repos/asf/camel/blob/8c97cad0/camel-core/src/main/java/org/apache/camel/util/CamelLogger.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/util/CamelLogger.java b/camel-core/src/main/java/org/apache/camel/util/CamelLogger.java index 1787bd7..96773f0 100644 --- a/camel-core/src/main/java/org/apache/camel/util/CamelLogger.java +++ b/camel-core/src/main/java/org/apache/camel/util/CamelLogger.java @@ -16,6 +16,8 @@ */ package org.apache.camel.util; +import java.util.concurrent.Callable; + import org.apache.camel.LoggingLevel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +38,12 @@ public class CamelLogger { private Marker marker; public CamelLogger() { - this(LoggerFactory.getLogger(CamelLogger.class)); + this(ObjectHelper.runWithClassLoader(null, new Callable<Logger>() { + @Override + public Logger call() throws Exception { + return LoggerFactory.getLogger(CamelLogger.class); + } + })); } public CamelLogger(Logger log) { @@ -53,16 +60,27 @@ public class CamelLogger { setMarker(marker); } - public CamelLogger(String logName) { - this(LoggerFactory.getLogger(logName)); + public CamelLogger(final String logName) { + this(ObjectHelper.runWithClassLoader(null, new Callable<Logger>() { + @Override + public Logger call() throws Exception { + return LoggerFactory.getLogger(logName); + } + })); } - public CamelLogger(String logName, LoggingLevel level) { + public CamelLogger(final String logName, final LoggingLevel level) { this(logName, level, null); } - public CamelLogger(String logName, LoggingLevel level, String marker) { - this(LoggerFactory.getLogger(logName), level, marker); + public CamelLogger(final String logName, final LoggingLevel level, final String marker) { + this(ObjectHelper.runWithClassLoader(null, new Callable<Logger>() { + @Override + public Logger call() throws Exception { + return LoggerFactory.getLogger(logName); + } + }), level, marker); + } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/8c97cad0/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java index 2b0827a..97b510b 100644 --- a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java +++ b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java @@ -42,6 +42,7 @@ import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Scanner; +import java.util.concurrent.Callable; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -1528,6 +1529,32 @@ public final class ObjectHelper { return value.equals(Float.NaN) || value.equals(Double.NaN); } + /** + * Runs a piece of code with a different classloader, remembering the old classloader and + * restoring it prior to returning. If the Callable throws an exception, it will be wrapped + * in a {@link RuntimeCamelException} prior to rethrowing it. + * + * @param classLoader ClassLoader to run the logic with + * @param callable the logic to run with the supplied ClassLoader + * @return the result from running the {@link Callable} + */ + public static <T> T runWithClassLoader(final ClassLoader classLoader, final Callable<T> callable) throws RuntimeCamelException { + if (classLoader == null || callable == null) { + throw new IllegalArgumentException("Neither Classloader or Callable can be null"); + } + + final ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(classLoader); + return callable.call(); + } catch (Exception e) { + throw new RuntimeCamelException(e); + } + finally { + Thread.currentThread().setContextClassLoader(oldClassLoader); + } +} + private static final class ExceptionIterator implements Iterator<Throwable> { private List<Throwable> tree = new ArrayList<Throwable>(); private Iterator<Throwable> it; http://git-wip-us.apache.org/repos/asf/camel/blob/8c97cad0/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index cb05bb8..2517848 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -181,6 +181,7 @@ <httpcore4-version>4.3</httpcore4-version> <httpclient4-version>4.3.1</httpclient4-version> <httpclient-version>3.1</httpclient-version> + <hystrix-version>1.3.8</hystrix-version> <ibatis-bundle-version>2.3.4.726_4</ibatis-bundle-version> <ibatis-version>2.3.4.726</ibatis-version> <ical4j-version>1.0.5.2</ical4j-version>