You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/09/06 11:41:19 UTC
svn commit: r573201 - in /activemq/camel/trunk:
camel-core/src/main/java/org/apache/camel/impl/
camel-core/src/main/java/org/apache/camel/util/
components/camel-spring/src/main/java/org/apache/camel/spring/
Author: jstrachan
Date: Thu Sep 6 02:41:18 2007
New Revision: 573201
URL: http://svn.apache.org/viewvc?rev=573201&view=rev
Log:
added better debug logging in the classloading / discovery code along with supporting multiple possible class loaders when using discovery of RouteBuilders
Modified:
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java
activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=573201&r1=573200&r2=573201&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Thu Sep 6 02:41:18 2007
@@ -299,13 +299,14 @@
public void addRoutes(RouteBuilder builder) throws Exception {
// lets now add the routes from the builder
builder.setContext(this);
+ LOG.debug("Adding routes from: " + builder);
addRoutes(builder.getRouteList());
}
public void addRouteDefinitions(Collection<RouteType> routeDefinitions) throws Exception {
this.routeDefinitions.addAll(routeDefinitions);
if (shouldStartRoutes()) {
- startRouteDefinitions(routeDefinitions);
+ startRouteDefinitions(routeDefinitions);
}
}
Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java?rev=573201&r1=573200&r2=573201&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java Thu Sep 6 02:41:18 2007
@@ -16,21 +16,22 @@
*/
package org.apache.camel.util;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.URL;
import java.net.URLDecoder;
+import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
/**
* <p>
* ResolverUtil is used to locate classes that are available in the/a class path
@@ -45,7 +46,7 @@
* the class path that contain classes within certain packages, and then to load
* those classes and check them. By default the ClassLoader returned by
* {@code Thread.currentThread().getContextClassLoader()} is used, but this can
- * be overridden by calling {@link #setClassLoader(ClassLoader)} prior to
+ * be overridden by calling {@link #setClassLoaders(Set)} prior to
* invoking any of the {@code find()} methods.
* </p>
*
@@ -152,7 +153,7 @@
* ClassLoader returned by Thread.currentThread().getContextClassLoader()
* will be used.
*/
- private ClassLoader classloader;
+ private Set<ClassLoader> classLoaders;
/**
* Provides access to the classes discovered so far. If no calls have been
@@ -164,25 +165,30 @@
return matches;
}
+
/**
- * Returns the classloader that will be used for scanning for classes. If no
+ * Returns the classloaders that will be used for scanning for classes. If no
* explicit ClassLoader has been set by the calling, the context class
* loader will be used.
- *
- * @return the ClassLoader that will be used to scan for classes
+ *
+ * @return the ClassLoader instances that will be used to scan for classes
*/
- public ClassLoader getClassLoader() {
- return classloader == null ? Thread.currentThread().getContextClassLoader() : classloader;
+ public Set<ClassLoader> getClassLoaders() {
+ if (classLoaders == null) {
+ classLoaders = new HashSet<ClassLoader>();
+ classLoaders.add(Thread.currentThread().getContextClassLoader());
+ }
+ return classLoaders;
}
/**
- * Sets an explicit ClassLoader that should be used when scanning for
+ * Sets the ClassLoader instances that should be used when scanning for
* classes. If none is set then the context classloader will be used.
- *
- * @param classloader a ClassLoader to use when scanning for classes
+ *
+ * @param classLoaders a ClassLoader to use when scanning for classes
*/
- public void setClassLoader(ClassLoader classloader) {
- this.classloader = classloader;
+ public void setClassLoaders(Set<ClassLoader> classLoaders) {
+ this.classLoaders = classLoaders;
}
/**
@@ -202,10 +208,14 @@
return;
}
+ LOG.debug("Searching for implementations of " + parent.getName() + " in packages: " + Arrays.asList(packageNames));
+
Test test = new IsA(parent);
for (String pkg : packageNames) {
find(test, pkg);
}
+
+ LOG.debug("Found: " + getClasses());
}
/**
@@ -241,7 +251,16 @@
*/
public void find(Test test, String packageName) {
packageName = packageName.replace('.', '/');
- ClassLoader loader = getClassLoader();
+
+ Set<ClassLoader> set = getClassLoaders();
+ for (ClassLoader classLoader : set) {
+ LOG.trace("Searching: " + classLoader);
+
+ find(test, packageName, classLoader);
+ }
+ }
+
+ protected void find(Test test, String packageName, ClassLoader loader) {
Enumeration<URL> urls;
try {
@@ -358,12 +377,25 @@
protected void addIfMatching(Test test, String fqn) {
try {
String externalName = fqn.substring(0, fqn.indexOf('.')).replace('/', '.');
- ClassLoader loader = getClassLoader();
- LOG.trace("Checking to see if class " + externalName + " matches criteria [" + test + "]");
-
- Class type = loader.loadClass(externalName);
- if (test.matches(type)) {
- matches.add((Class<T>)type);
+ Set<ClassLoader> set = getClassLoaders();
+ boolean found = false;
+ for (ClassLoader classLoader : set) {
+ LOG.trace("Checking to see if class " + externalName + " matches criteria [" + test + "]");
+
+ try {
+ Class type = classLoader.loadClass(externalName);
+ if (test.matches(type)) {
+ matches.add((Class<T>)type);
+ }
+ found = true;
+ break;
+ }
+ catch (ClassNotFoundException e) {
+ LOG.debug("Could not find class '" + fqn + "' in class loader: " + classLoader + ". Reason: " + e, e);
+ }
+ }
+ if (!found) {
+ LOG.warn("Could not find class '" + fqn + "' in any class loaders: " + set);
}
} catch (Throwable t) {
LOG.warn("Could not examine class '" + fqn + "' due to a " + t.getClass().getName()
Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=573201&r1=573200&r2=573201&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Thu Sep 6 02:41:18 2007
@@ -72,6 +72,14 @@
private List<RouteBuilder> additionalBuilders = new ArrayList<RouteBuilder>();
@XmlTransient
private ApplicationContext applicationContext;
+ @XmlTransient
+ private ClassLoader contextClassLoaderOnStart;
+
+ public CamelContextFactoryBean() {
+
+ // Lets keep track of the class loader for when we actually do start things up
+ contextClassLoaderOnStart = Thread.currentThread().getContextClassLoader();
+ }
public Object getObject() throws Exception {
return getContext();
@@ -86,7 +94,6 @@
}
public void afterPropertiesSet() throws Exception {
-
// lets force any lazy creation
getContext().addRouteDefinitions(routes);
@@ -215,7 +222,7 @@
*/
protected void findRouteBuiders() throws Exception, InstantiationException {
if (packages != null && packages.length > 0) {
- RouteBuilderFinder finder = new RouteBuilderFinder(getContext(), packages);
+ RouteBuilderFinder finder = new RouteBuilderFinder(getContext(), packages, contextClassLoaderOnStart);
finder.appendBuilders(additionalBuilders);
}
}
Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java?rev=573201&r1=573200&r2=573201&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java Thu Sep 6 02:41:18 2007
@@ -23,7 +23,8 @@
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.util.ResolverUtil;
-
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
/**
@@ -32,15 +33,28 @@
* @version $Revision$
*/
public class RouteBuilderFinder {
+ private static final transient Log LOG = LogFactory.getLog(RouteBuilderFinder.class);
private final SpringCamelContext camelContext;
private final String[] packages;
private ApplicationContext applicationContext;
private ResolverUtil resolver = new ResolverUtil();
- public RouteBuilderFinder(SpringCamelContext camelContext, String[] packages) {
+ public RouteBuilderFinder(SpringCamelContext camelContext, String[] packages, ClassLoader classLoader) {
this.camelContext = camelContext;
this.applicationContext = camelContext.getApplicationContext();
this.packages = packages;
+
+ // lets add all the available class loaders just in case of wierdness
+ // we could make this more strict once we've worked out all the gremlins
+ // in servicemix-camel
+ Set set = resolver.getClassLoaders();
+ set.clear();
+ set.add(classLoader);
+/*
+ set.add(classLoader);
+ set.add(applicationContext.getClassLoader());
+ set.add(getClass().getClassLoader());
+*/
}
public String[] getPackages() {
@@ -57,7 +71,6 @@
*/
public void appendBuilders(List<RouteBuilder> list) throws IllegalAccessException, InstantiationException {
resolver.findImplementations(RouteBuilder.class, packages);
- //resolver.findAnnotated(Endpoint.class, packages);
Set<Class> classes = resolver.getClasses();
for (Class aClass : classes) {
if (shouldIgnoreBean(aClass)) {