Hi Willem Just a quick note, you got both INFO and TRACE logging somewhere in the OsgiClassResolver. I think keeping it at TRACE only to avoid spamming the logs.
On Tue, Dec 29, 2009 at 5:59 AM, <ningji...@apache.org> wrote: > Author: ningjiang > Date: Tue Dec 29 04:59:50 2009 > New Revision: 894310 > > URL: http://svn.apache.org/viewvc?rev=894310&view=rev > Log: > CAMEL-2323 Added OsgiClassResolver > > Added: > > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > (with props) > > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > (with props) > Modified: > > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactory.java > > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java > > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelOsgiTestSupport.java > > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiAnnotationTypeConverterLoaderTest.java > > Modified: > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactory.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactory.java?rev=894310&r1=894309&r2=894310&view=diff > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactory.java > (original) > +++ > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactory.java > Tue Dec 29 04:59:50 2009 > @@ -60,6 +60,8 @@ > LOG.debug("Using OSGI resolvers"); > } > updateRegistry(context); > + LOG.debug("Using the OsgiClassResolver"); > + context.setClassResolver(new OsgiClassResolver(bundleContext)); > LOG.debug("Using OsgiFactoryFinderResolver"); > context.setFactoryFinderResolver(new OsgiFactoryFinderResolver()); > LOG.debug("Using OsgiPackageScanClassResolver"); > > Modified: > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java?rev=894310&r1=894309&r2=894310&view=diff > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java > (original) > +++ > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/CamelContextFactoryBean.java > Tue Dec 29 04:59:50 2009 > @@ -57,9 +57,11 @@ > SpringCamelContext context = super.createContext(); > if (bundleContext != null) { > if (LOG.isDebugEnabled()) { > - LOG.debug("Using OSGI resolvers"); > + LOG.debug("Using OSGi resolvers"); > } > updateRegistry(context); > + LOG.debug("Using the OsgiClassResolver"); > + context.setClassResolver(new OsgiClassResolver(bundleContext)); > LOG.debug("Using OsgiFactoryFinderResolver"); > context.setFactoryFinderResolver(new OsgiFactoryFinderResolver()); > LOG.debug("Using OsgiPackageScanClassResolver"); > > Added: > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java?rev=894310&view=auto > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > (added) > +++ > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > Tue Dec 29 04:59:50 2009 > @@ -0,0 +1,108 @@ > +/** > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +package org.apache.camel.osgi; > + > +import java.io.IOException; > +import java.io.InputStream; > +import java.net.URL; > + > +import org.apache.camel.impl.DefaultClassResolver; > +import org.apache.camel.spi.ClassResolver; > +import org.apache.camel.util.CastUtils; > +import org.apache.camel.util.ObjectHelper; > +import org.apache.commons.logging.Log; > +import org.apache.commons.logging.LogFactory; > +import org.osgi.framework.Bundle; > +import org.osgi.framework.BundleContext; > +import org.springframework.osgi.util.BundleDelegatingClassLoader; > + > +/* Using the bundle of CamelContext to load the class */ > +public class OsgiClassResolver extends DefaultClassResolver { > + private static final transient Log LOG = > LogFactory.getLog(OsgiClassResolver.class); > + > + public BundleContext bundleContext; > + > + public OsgiClassResolver(BundleContext context) { > + this.bundleContext = context; > + } > + > + public Class<?> resolveClass(String name) { > + return loadClass(name, > BundleDelegatingClassLoader.createBundleClassLoaderFor(bundleContext.getBundle())); > + } > + > + public <T> Class<T> resolveClass(String name, Class<T> type) { > + Class<T> answer = CastUtils.cast(loadClass(name, > BundleDelegatingClassLoader.createBundleClassLoaderFor(bundleContext.getBundle()))); > + return (Class<T>) answer; > + } > + > + public InputStream loadResourceAsStream(String uri) { > + ObjectHelper.notEmpty(uri, "uri"); > + URL url = loadResourceAsURL(uri); > + InputStream answer = null; > + if (url != null) { > + try { > + answer = url.openStream(); > + } catch (IOException ex) { > + LOG.error("Cannot load resource: " + uri, ex); > + } > + } > + return answer; > + } > + > + public URL loadResourceAsURL(String uri) { > + ObjectHelper.notEmpty(uri, "uri"); > + URL url = null; > + for (Bundle bundle : bundleContext.getBundles()) { > + url = bundle.getEntry(uri); > + if (url != null) { > + break; > + } > + } > + return url; > + } > + > + protected Class<?> loadClass(String name, ClassLoader loader) { > + ObjectHelper.notEmpty(name, "name"); > + Class<?> answer = null; > + // Try to use the camel context's bundle's classloader to load the > class > + if (loader != null) { > + try { > + answer = loader.loadClass(name); > + } catch (ClassNotFoundException e) { > + LOG.info("Cannot load class: " + name + " using classloader: > " + loader, e); > + if (LOG.isTraceEnabled()) { > + LOG.trace("Cannot load class: " + name + " using > classloader: " + loader, e); > + } > + } > + } > + // Load the class with bundle, if there are more than one version of > the class the first one will be load > + if (answer == null) { > + for (Bundle bundle : bundleContext.getBundles()) { > + try { > + answer = bundle.loadClass(name); > + if (answer != null) { > + break; > + } > + } catch (Exception e) { > + // do nothing here > + } > + } > + } > + return answer; > + } > + > +} > > Propchange: > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > camel/trunk/components/camel-osgi/src/main/java/org/apache/camel/osgi/OsgiClassResolver.java > ------------------------------------------------------------------------------ > svn:keywords = Rev Date > > Modified: > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelOsgiTestSupport.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelOsgiTestSupport.java?rev=894310&r1=894309&r2=894310&view=diff > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelOsgiTestSupport.java > (original) > +++ > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/CamelOsgiTestSupport.java > Tue Dec 29 04:59:50 2009 > @@ -16,6 +16,7 @@ > */ > package org.apache.camel.osgi; > > +import org.apache.camel.spi.ClassResolver; > import org.junit.After; > import org.junit.Assert; > import org.junit.Before; > @@ -26,7 +27,8 @@ > public class CamelOsgiTestSupport extends Assert { > private Activator testActivator; > private MockBundleContext bundleContext = new CamelMockBundleContext(); > - private OsgiPackageScanClassResolver resolver = new > OsgiPackageScanClassResolver(bundleContext); > + private OsgiPackageScanClassResolver packageScanClassResolver = new > OsgiPackageScanClassResolver(bundleContext); > + private ClassResolver classResolver = new > OsgiClassResolver(bundleContext); > private MockBundle bundle = new CamelMockBundle(); > > @Before > @@ -49,7 +51,11 @@ > return bundleContext; > } > > - public OsgiPackageScanClassResolver getResolver() { > - return resolver; > + public OsgiPackageScanClassResolver getPackageScanClassResolver() { > + return packageScanClassResolver; > + } > + > + public ClassResolver getClassResolver() { > + return classResolver; > } > } > > Modified: > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiAnnotationTypeConverterLoaderTest.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiAnnotationTypeConverterLoaderTest.java?rev=894310&r1=894309&r2=894310&view=diff > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiAnnotationTypeConverterLoaderTest.java > (original) > +++ > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiAnnotationTypeConverterLoaderTest.java > Tue Dec 29 04:59:50 2009 > @@ -23,7 +23,7 @@ > > @Test > public void testLoad() throws Exception { > - OsgiAnnotationTypeConverterLoader loader = new > OsgiAnnotationTypeConverterLoader(getResolver()); > + OsgiAnnotationTypeConverterLoader loader = new > OsgiAnnotationTypeConverterLoader(getPackageScanClassResolver()); > MockTypeConverterRegistry registry = new MockTypeConverterRegistry(); > loader.load(registry); > assertTrue("There should have at lest one fallback converter", > registry.getFallbackTypeConverters().size() >= 1); > > Added: > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > URL: > http://svn.apache.org/viewvc/camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java?rev=894310&view=auto > ============================================================================== > --- > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > (added) > +++ > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > Tue Dec 29 04:59:50 2009 > @@ -0,0 +1,41 @@ > +/** > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You under the Apache License, Version 2.0 > + * (the "License"); you may not use this file except in compliance with > + * the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +package org.apache.camel.osgi; > + > +import java.io.InputStream; > +import java.net.URL; > + > +import org.apache.camel.spi.ClassResolver; > +import org.junit.Test; > + > +public class OsgiClassResolverTest extends CamelOsgiTestSupport { > + > + �...@test > + public void testResolveClass() { > + ClassResolver classResolver = getClassResolver(); > + Class routeBuilder = > classResolver.resolveClass("org.apache.camel.osgi.test.MyRouteBuilder"); > + assertNotNull("The class of routeBuilder should not be null.", > routeBuilder); > + } > + > + �...@test > + public void testResolverResource() { > + ClassResolver classResolver = getClassResolver(); > + InputStream is = > classResolver.loadResourceAsStream("/META-INF/services/org/apache/camel/TypeConverter"); > + assertNotNull("The InputStream should not be null."); > + } > + > +} > > Propchange: > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > camel/trunk/components/camel-osgi/src/test/java/org/apache/camel/osgi/OsgiClassResolverTest.java > ------------------------------------------------------------------------------ > svn:keywords = Rev Date > > > -- Claus Ibsen Apache Camel Committer Author of Camel in Action: http://www.manning.com/ibsen/ Open Source Integration: http://fusesource.com Blog: http://davsclaus.blogspot.com/ Twitter: http://twitter.com/davsclaus