Author: wtam
Date: Mon Aug 17 04:11:24 2009
New Revision: 804847

URL: http://svn.apache.org/viewvc?rev=804847&view=rev
Log:
[CAMEL-1917] DefaultPackageScanClassResolver not able to scan package in jar url

Added:
    camel/trunk/camel-core/src/test/resources/package_scan_test.jar   (with 
props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/scan/DefaultPackageScanClassResolverTest.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java?rev=804847&r1=804846&r2=804847&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
 Mon Aug 17 04:11:24 2009
@@ -210,9 +210,12 @@
                     log.trace("Decoded urlPath: " + urlPath);
                 }
 
+                boolean isLocalFileSystem = "file".equals(url.getProtocol());
+
                 // If it's a file in a directory, trim the stupid file: spec
                 if (urlPath.startsWith("file:")) {
                     urlPath = urlPath.substring(5);
+                    isLocalFileSystem = true;
                 }
 
                 // osgi bundles should be skipped
@@ -238,8 +241,8 @@
                     loadImplementationsInDirectory(test, packageName, file, 
classes);
                 } else {
                     InputStream stream;
-                    if (urlPath.startsWith("http:")) {
-                        // load resources using http such as java webstart
+                    if (!isLocalFileSystem) {
+                        // load resources using http (and other protocols) 
such as java webstart 
                         log.debug("The current jar is accessed via http");
                         URL urlStream = new URL(urlPath);
                         URLConnection con = urlStream.openConnection();
@@ -276,6 +279,12 @@
         if (log.isTraceEnabled()) {
             log.trace("Getting resource URL for package: " + packageName + " 
with classloader: " + loader);
         }
+        
+        // If the URL is a jar, the URLClassloader.getResources() seems to 
require a trailing slash.  The
+        // trailing slash is harmless for other URLs  
+        if (!packageName.endsWith("/")) {
+            packageName = packageName + "/";
+        }
         return loader.getResources(packageName);
     }
 

Modified: 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/scan/DefaultPackageScanClassResolverTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/scan/DefaultPackageScanClassResolverTest.java?rev=804847&r1=804846&r2=804847&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/scan/DefaultPackageScanClassResolverTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/impl/scan/DefaultPackageScanClassResolverTest.java
 Mon Aug 17 04:11:24 2009
@@ -17,6 +17,8 @@
 package org.apache.camel.impl.scan;
 
 import java.lang.annotation.Annotation;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -120,5 +122,31 @@
         Set<Class> scanned = resolver.findImplementations(ScanTargetOne.class, 
scanPackage);
         validateMatchingSetContains(scanned,  ScanTargetTwo.class);
     }
+    
+    public void testFindByFilterPackageInJarUrl() throws Exception {
+        
+        ClassLoader savedClassLoader = null; 
+        try {
+            savedClassLoader = Thread.currentThread().getContextClassLoader();
+            URL url = getClass().getResource("/package_scan_test.jar");
+            
+            URL urls[] = {new URL("jar:" + url.toString() + "!/")};
+            URLClassLoader classLoader = new URLClassLoader(urls, 
savedClassLoader);
+
+            Thread.currentThread().setContextClassLoader(classLoader);
+
+            filter.addIncludePattern("a.*.c.*");
+            resolver.addFilter(filter);
+            Set<Class> scanned = resolver.findByFilter(filter, "a.b.c");
+            assertEquals(1, scanned.size());
+            assertEquals("class a.b.c.Test", 
scanned.iterator().next().toString());            
+        } finally {
+            if (savedClassLoader != null) {
+                Thread.currentThread().setContextClassLoader(savedClassLoader);
+            } 
+        }
+
+    }
+    
 
 }

Added: camel/trunk/camel-core/src/test/resources/package_scan_test.jar
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/package_scan_test.jar?rev=804847&view=auto
==============================================================================
Binary file - no diff available.

Propchange: camel/trunk/camel-core/src/test/resources/package_scan_test.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream


Reply via email to