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)) {