Hi Claus,

My bad, thanks for point that out.
I will commit a quick fix for it.

Willem

Claus Ibsen wrote:
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







Reply via email to