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