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

Reply via email to