Author: ningjiang Date: Tue Jan 13 01:05:08 2009 New Revision: 734076 URL: http://svn.apache.org/viewvc?rev=734076&view=rev Log: Merged revisions 734064 via svnmerge from https://svn.apache.org/repos/asf/activemq/camel/trunk
........ r734064 | ningjiang | 2009-01-13 15:37:28 +0800 (Tue, 13 Jan 2009) | 1 line CAMEL-1240 Moved the ResloverUti OSGI relates code into camel-osgi ........ Added: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiResolverUtilTest.java - copied unchanged from r734064, activemq/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiResolverUtilTest.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/ (props changed) - copied from r734064, activemq/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/ activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/MyRouteBuilder.java - copied unchanged from r734064, activemq/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/MyRouteBuilder.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/MyTypeConverter.java - copied unchanged from r734064, activemq/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/MyTypeConverter.java Removed: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/converter/ Modified: activemq/camel/branches/camel-1.x/ (props changed) activemq/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiResolverUtil.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/ActivatorTest.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelMockBundle.java activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/resources/META-INF/services/org/apache/camel/TypeConverter activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java Propchange: activemq/camel/branches/camel-1.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 13 01:05:08 2009 @@ -1 +1 @@ -/activemq/camel/trunk:732943,733749,734053,734057-734058 +/activemq/camel/trunk:732943,733749,734053,734057-734058,734064 Propchange: activemq/camel/branches/camel-1.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: activemq/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java (original) +++ activemq/camel/branches/camel-1.x/camel-core/src/main/java/org/apache/camel/util/ResolverUtil.java Tue Jan 13 01:05:08 2009 @@ -285,48 +285,13 @@ Set<ClassLoader> set = getClassLoaders(); - ClassLoader osgiClassLoader = getOsgiClassLoader(set); - - if (osgiClassLoader != null) { - // if we have an osgi bundle loader use this one only - LOG.debug("Using only osgi bundle classloader"); - find(test, packageName, osgiClassLoader, true); - } else { - LOG.debug("Using only regular classloaders"); - for (ClassLoader classLoader : set) { - if (!isOsgiClassloader(classLoader)) { - find(test, packageName, classLoader, false); - } - } - } - } - - /** - * Gets the osgi classloader if any in the given set - */ - private static ClassLoader getOsgiClassLoader(Set<ClassLoader> set) { - for (ClassLoader loader : set) { - if (isOsgiClassloader(loader)) { - return loader; - } + LOG.debug("Using only regular classloaders"); + for (ClassLoader classLoader : set) { + find(test, packageName, classLoader); } - return null; } - /** - * Is it an osgi classloader - */ - private static boolean isOsgiClassloader(ClassLoader loader) { - try { - Method mth = loader.getClass().getMethod("getBundle", new Class[]{}); - if (mth != null) { - return true; - } - } catch (NoSuchMethodException e) { - // ignore its not an osgi loader - } - return false; - } + /** * Tries to find the reosurce in the package using the class loader. @@ -335,30 +300,13 @@ * * @param test what to find * @param packageName the package to search in - * @param loader the class loader - * @param osgi true if its a osgi bundle loader, false if regular classloader + * @param loader the class loader */ - protected void find(Test test, String packageName, ClassLoader loader, boolean osgi) { + protected void find(Test test, String packageName, ClassLoader loader) { if (LOG.isTraceEnabled()) { LOG.trace("Searching for: " + test + " in package: " + packageName + " using classloader: " - + loader.getClass().getName() + " osgi bundle classloader: " + osgi); - } - - if (osgi) { - try { - Method mth = loader.getClass().getMethod("getBundle", new Class[]{}); - if (mth != null) { - if (LOG.isDebugEnabled()) { - LOG.debug("Loading from osgi buindle using classloader: " + loader); - } - loadImplementationsInBundle(test, packageName, loader, mth); - return; - } - } catch (NoSuchMethodException e) { - LOG.warn("It's not an osgi bundle classloader: " + loader); - return; - } - } + + loader.getClass().getName()); + } Enumeration<URL> urls; try { @@ -454,44 +402,7 @@ return loader.getResources(packageName); } - private void loadImplementationsInBundle(Test test, String packageName, ClassLoader loader, Method mth) { - // Use an inner class to avoid a NoClassDefFoundError when used in a non-osgi env - Set<String> urls = OsgiUtil.getImplementationsInBundle(test, packageName, loader, mth); - if (urls != null) { - for (String url : urls) { - // substring to avoid leading slashes - addIfMatching(test, url); - } - } - } - - private static final class OsgiUtil { - private OsgiUtil() { - // Helper class - } - static Set<String> getImplementationsInBundle(Test test, String packageName, ClassLoader loader, Method mth) { - try { - org.osgi.framework.Bundle bundle = (org.osgi.framework.Bundle) mth.invoke(loader); - org.osgi.framework.Bundle[] bundles = bundle.getBundleContext().getBundles(); - Set<String> urls = new HashSet<String>(); - for (org.osgi.framework.Bundle bd : bundles) { - if (LOG.isTraceEnabled()) { - LOG.trace("Searching in bundle:" + bd); - } - Enumeration<URL> paths = bd.findEntries("/" + packageName, "*.class", true); - while (paths != null && paths.hasMoreElements()) { - URL path = paths.nextElement(); - urls.add(path.getPath().substring(1)); - } - } - return urls; - } catch (Throwable t) { - LOG.error("Could not search osgi bundles for classes matching criteria: " + test - + "due to an Exception: " + t.getMessage()); - return null; - } - } - } + /** Modified: activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java Tue Jan 13 01:05:08 2009 @@ -26,8 +26,10 @@ import org.apache.camel.impl.converter.AnnotationTypeConverterLoader; import org.apache.camel.impl.converter.DefaultTypeConverter; import org.apache.camel.impl.converter.TypeConverterLoader; +import org.apache.camel.spring.RouteBuilderFinder; import org.apache.camel.spring.SpringCamelContext; import org.apache.camel.util.FactoryFinder; +import org.apache.camel.util.ResolverUtil; import org.osgi.framework.BundleContext; import org.springframework.osgi.context.BundleContextAware; @@ -56,6 +58,18 @@ } return context; + } + + /** + * The factory method for create the ResolverUtil + * @return a new instance of ResolverUtil + */ + protected ResolverUtil createResolverUtil() { + if (bundleContext != null) { + return new OsgiResolverUtil(bundleContext); + } else { + return new ResolverUtil(); + } } protected void addOsgiAnnotationTypeConverterLoader(SpringCamelContext context, BundleContext bundleContext) { Modified: activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiResolverUtil.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiResolverUtil.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiResolverUtil.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiResolverUtil.java Tue Jan 13 01:05:08 2009 @@ -16,9 +16,14 @@ */ package org.apache.camel.osgi; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashSet; import java.util.Set; import org.apache.camel.util.ResolverUtil; +import org.apache.camel.util.ResolverUtil.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.springframework.osgi.util.BundleDelegatingClassLoader; @@ -43,5 +48,123 @@ classLoaders.add(osgiLoader); return classLoaders; } + + /** + * Scans for classes starting at the package provided and descending into + * subpackages. Each class is offered up to the Test as it is discovered, + * and if the Test returns true the class is retained. Accumulated classes + * can be fetched by calling {...@link #getClasses()}. + * + * @param test an instance of {...@link Test} that will be used to filter + * classes + * @param packageName the name of the package from which to start scanning + * for classes, e.g. {...@code net.sourceforge.stripes} + */ + public void find(Test test, String packageName) { + packageName = packageName.replace('.', '/'); + + Set<ClassLoader> set = getClassLoaders(); + + ClassLoader osgiClassLoader = getOsgiClassLoader(set); + + if (osgiClassLoader != null) { + // if we have an osgi bundle loader use this one only + LOG.debug("Using only osgi bundle classloader"); + findInOsgiClassLoader(test, packageName, osgiClassLoader); + } else { + LOG.debug("Using only regular classloaders"); + for (ClassLoader classLoader : set) { + if (!isOsgiClassloader(classLoader)) { + find(test, packageName, classLoader); + } + } + } + } + + + private void findInOsgiClassLoader(Test test, String packageName, ClassLoader osgiClassLoader) { + try { + Method mth = osgiClassLoader.getClass().getMethod("getBundle", new Class[]{}); + if (mth != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Loading from osgi buindle using classloader: " + osgiClassLoader); + } + loadImplementationsInBundle(test, packageName, osgiClassLoader, mth); + return; + } + } catch (NoSuchMethodException e) { + LOG.warn("It's not an osgi bundle classloader: " + osgiClassLoader); + return; + } + + } + + /** + * Gets the osgi classloader if any in the given set + */ + private static ClassLoader getOsgiClassLoader(Set<ClassLoader> set) { + for (ClassLoader loader : set) { + if (isOsgiClassloader(loader)) { + return loader; + } + } + return null; + } + + /** + * Is it an osgi classloader + */ + private static boolean isOsgiClassloader(ClassLoader loader) { + try { + Method mth = loader.getClass().getMethod("getBundle", new Class[]{}); + if (mth != null) { + return true; + } + } catch (NoSuchMethodException e) { + // ignore its not an osgi loader + } + return false; + } + + private void loadImplementationsInBundle(Test test, String packageName, ClassLoader loader, Method mth) { + // Use an inner class to avoid a NoClassDefFoundError when used in a non-osgi env + Set<String> urls = OsgiUtil.getImplementationsInBundle(test, packageName, loader, mth); + if (urls != null) { + for (String url : urls) { + // substring to avoid leading slashes + addIfMatching(test, url); + } + } + } + + private static final class OsgiUtil { + private OsgiUtil() { + // Helper class + } + static Set<String> getImplementationsInBundle(Test test, String packageName, ClassLoader loader, Method mth) { + try { + org.osgi.framework.Bundle bundle = (org.osgi.framework.Bundle) mth.invoke(loader); + org.osgi.framework.Bundle[] bundles = bundle.getBundleContext().getBundles(); + Set<String> urls = new HashSet<String>(); + for (org.osgi.framework.Bundle bd : bundles) { + if (LOG.isTraceEnabled()) { + LOG.trace("Searching in bundle:" + bd); + } + Enumeration<URL> paths = bd.findEntries("/" + packageName, "*.class", true); + while (paths != null && paths.hasMoreElements()) { + URL path = paths.nextElement(); + String pathString = path.getPath(); + pathString.indexOf(packageName); + urls.add(pathString.substring(pathString.indexOf(packageName))); + } + } + return urls; + } catch (Throwable t) { + LOG.error("Could not search osgi bundles for classes matching criteria: " + test + + "due to an Exception: " + t.getMessage()); + return null; + } + } + } } Modified: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/ActivatorTest.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/ActivatorTest.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/ActivatorTest.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/ActivatorTest.java Tue Jan 13 01:05:08 2009 @@ -51,7 +51,7 @@ String[] packages = Activator.findTypeConverterPackageNames(); assertEquals("We should find three converter package here", 3, packages.length); - assertTrue("Here should contains org.apache.camel.osgi.coverter", containsPackageName("org.apache.camel.osgi.coverter", packages)); + assertTrue("Here should contains org.apache.camel.osgi.test", containsPackageName("org.apache.camel.osgi.test", packages)); } } Modified: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelMockBundle.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelMockBundle.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelMockBundle.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelMockBundle.java Tue Jan 13 01:05:08 2009 @@ -74,6 +74,18 @@ } return result; - + } + + public Enumeration findEntries(String path, String filePattern, boolean recurse) { + if (path.equals("/org/apache/camel/osgi/test") && filePattern.equals("*.class")) { + List<URL> urls = new ArrayList<URL>(); + URL url = getClass().getClassLoader().getResource("org/apache/camel/osgi/test/MyTypeConverter.class"); + urls.add(url); + url = getClass().getClassLoader().getResource("org/apache/camel/osgi/test/MyRouteBuilder.class"); + urls.add(url); + return new ListEnumeration(urls); + } else { + return super.findEntries(path, filePattern, recurse); + } } } Propchange: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/java/org/apache/camel/osgi/test/ ------------------------------------------------------------------------------ svn:mergeinfo = Modified: activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/resources/META-INF/services/org/apache/camel/TypeConverter URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/resources/META-INF/services/org/apache/camel/TypeConverter?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/resources/META-INF/services/org/apache/camel/TypeConverter (original) +++ activemq/camel/branches/camel-1.x/components/camel-osgi/src/test/resources/META-INF/services/org/apache/camel/TypeConverter Tue Jan 13 01:05:08 2009 @@ -15,4 +15,4 @@ # limitations under the License. # -org.apache.camel.osgi.coverter \ No newline at end of file +org.apache.camel.osgi.test \ No newline at end of file Modified: activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Tue Jan 13 01:05:08 2009 @@ -49,6 +49,7 @@ import org.apache.camel.processor.interceptor.Tracer; import org.apache.camel.spi.LifecycleStrategy; import org.apache.camel.spi.Registry; +import org.apache.camel.util.ResolverUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; @@ -139,6 +140,14 @@ public boolean isSingleton() { return true; } + + public ClassLoader getContextClassLoaderOnStart() { + return contextClassLoaderOnStart; + } + + public List<Routes> getAdditionalBuilders() { + return additionalBuilders; + } public void afterPropertiesSet() throws Exception { // TODO there should be a neater way to do this! @@ -253,7 +262,7 @@ if (LOG.isDebugEnabled()) { LOG.debug("Found JAXB created routes: " + getRoutes()); } - findRouteBuiders(); + findRouteBuilders(); installRoutes(); } @@ -534,12 +543,20 @@ * Strategy method to try find {...@link RouteBuilder} instances on the * classpath */ - protected void findRouteBuiders() throws Exception, InstantiationException { - if (packages != null && packages.length > 0) { - RouteBuilderFinder finder = new RouteBuilderFinder(getContext(), packages, contextClassLoaderOnStart, getBeanPostProcessor()); - finder.appendBuilders(additionalBuilders); + protected void findRouteBuilders() throws Exception, InstantiationException { + if (getPackages() != null && getPackages().length > 0) { + RouteBuilderFinder finder = new RouteBuilderFinder(getContext(), getPackages(), getContextClassLoaderOnStart(), getBeanPostProcessor(), createResolverUtil()); + finder.appendBuilders(getAdditionalBuilders()); } } + + /** + * The factory method for create the ResolverUtil + * @return a new instance of ResolverUtil + */ + protected ResolverUtil createResolverUtil() { + return new ResolverUtil(); + } public void setDataFormats(DataFormatsType dataFormats) { this.dataFormats = dataFormats; Modified: activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java URL: http://svn.apache.org/viewvc/activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java?rev=734076&r1=734075&r2=734076&view=diff ============================================================================== --- activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java (original) +++ activemq/camel/branches/camel-1.x/components/camel-spring/src/main/java/org/apache/camel/spring/RouteBuilderFinder.java Tue Jan 13 01:05:08 2009 @@ -38,16 +38,16 @@ 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(); + private ResolverUtil resolver; + private ApplicationContext applicationContext; private BeanPostProcessor beanPostProcessor; - public RouteBuilderFinder(SpringCamelContext camelContext, String[] packages, ClassLoader classLoader, BeanPostProcessor postProcessor) { + public RouteBuilderFinder(SpringCamelContext camelContext, String[] packages, ClassLoader classLoader, BeanPostProcessor postProcessor, ResolverUtil resolverUtil) { this.camelContext = camelContext; this.applicationContext = camelContext.getApplicationContext(); this.packages = packages; this.beanPostProcessor = postProcessor; - + this.resolver = resolverUtil; // lets add all the available class loaders just in case of weirdness // we could make this more strict once we've worked out all the gremlins // in servicemix-camel @@ -60,8 +60,7 @@ set.add(getClass().getClassLoader()); */ } - - + public String[] getPackages() { return packages; }