You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2010/06/04 19:16:31 UTC
svn commit: r951497 [1/2] - in /camel/trunk: apache-camel/ camel-core/
camel-core/src/main/java/org/apache/camel/impl/converter/
camel-core/src/main/java/org/apache/camel/impl/osgi/
camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/ camel-cor...
Author: gnodet
Date: Fri Jun 4 17:16:29 2010
New Revision: 951497
URL: http://svn.apache.org/viewvc?rev=951497&view=rev
Log:
CAMEL-2693, CAMEL-2792: OSGi improvements
Added:
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/AbstractTracked.java
- copied, changed from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/AbstractTracked.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTracker.java
- copied, changed from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTracker.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTrackerCustomizer.java
- copied, changed from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTrackerCustomizer.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintComponentResolver.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintDataFormatResolver.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintLanguageResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDataFormatResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
camel/trunk/components/camel-core-osgi/src/test/
camel/trunk/components/camel-core-osgi/src/test/java/
camel/trunk/components/camel-core-osgi/src/test/java/org/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/
- copied from r950897, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/core/osgi/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MockTypeConverterRegistry.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyRouteBuilder.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyService.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyTypeConverter.java
camel/trunk/components/camel-core-osgi/src/test/resources/
camel/trunk/components/camel-core-osgi/src/test/resources/META-INF/
- copied from r951300, camel/trunk/components/camel-spring/src/test/resources/META-INF/
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/osgi/Activator.java
Removed:
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/Activator.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiAnnotationTypeConverterLoader.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ActivatorTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiAnnotationTypeConverterLoaderTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/core/osgi/
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/osgi/test/MockTypeConverterRegistry.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/osgi/test/MyRouteBuilder.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/osgi/test/MyService.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/osgi/test/MyTypeConverter.java
Modified:
camel/trunk/apache-camel/pom.xml
camel/trunk/camel-core/pom.xml
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
camel/trunk/components/camel-blueprint/pom.xml
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
camel/trunk/components/camel-core-osgi/pom.xml
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinder.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinderResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiLanguageResolver.java
camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolver.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundle.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelOsgiTestSupport.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiClassResolverTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiComponentResolverTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiFactoryFinderTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiLanguageResolverTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolverTest.java
camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
camel/trunk/components/camel-core-xml/pom.xml
camel/trunk/components/camel-spring/pom.xml
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/osgi/OsgiSpringCamelContext.java
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
camel/trunk/examples/camel-example-guice-jms/pom.xml
camel/trunk/examples/camel-example-osgi/pom.xml
camel/trunk/examples/camel-example-spring-javaconfig/pom.xml
camel/trunk/parent/pom.xml
camel/trunk/tests/camel-itest-osgi/pom.xml
camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/OSGiIntegrationTestSupport.java
Modified: camel/trunk/apache-camel/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/pom.xml?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/apache-camel/pom.xml (original)
+++ camel/trunk/apache-camel/pom.xml Fri Jun 4 17:16:29 2010
@@ -452,7 +452,7 @@
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.felix</groupId>
+ <groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<optional>true</optional>
</dependency>
Modified: camel/trunk/camel-core/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/pom.xml?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/camel-core/pom.xml (original)
+++ camel/trunk/camel-core/pom.xml Fri Jun 4 17:16:29 2010
@@ -50,6 +50,9 @@
<camel.osgi.dynamic>
org.apache.camel.spring.util;${camel.osgi.import.strict.version},org.apache.camel.processor.interceptor.jpa;${camel.osgi.import.strict.version}
</camel.osgi.dynamic>
+ <camel.osgi.activator>
+ org.apache.camel.impl.osgi.Activator
+ </camel.osgi.activator>
</properties>
<dependencies>
@@ -89,6 +92,15 @@
</exclusions>
</dependency>
+ <!-- osgi support -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.1.0</version>
+ <scope>provided</scope>
+ <optional>true</optional>
+ </dependency>
+
<!-- testing -->
<dependency>
<groupId>junit</groupId>
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java Fri Jun 4 17:16:29 2010
@@ -52,8 +52,8 @@ public class AnnotationTypeConverterLoad
public static final String META_INF_SERVICES = "META-INF/services/org/apache/camel/TypeConverter";
private static final transient Log LOG = LogFactory.getLog(AnnotationTypeConverterLoader.class);
protected PackageScanClassResolver resolver;
- private Set<Class<?>> visitedClasses = new HashSet<Class<?>>();
- private Set<URL> visitedURLs = new HashSet<URL>();
+ protected Set<Class<?>> visitedClasses = new HashSet<Class<?>>();
+ protected Set<URL> visitedURLs = new HashSet<URL>();
public AnnotationTypeConverterLoader(PackageScanClassResolver resolver) {
this.resolver = resolver;
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java?rev=951497&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java Fri Jun 4 17:16:29 2010
@@ -0,0 +1,456 @@
+/**
+ * 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.impl.osgi;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.Converter;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.impl.converter.AnnotationTypeConverterLoader;
+import org.apache.camel.impl.converter.TypeConverterLoader;
+import org.apache.camel.impl.osgi.tracker.BundleTracker;
+import org.apache.camel.impl.osgi.tracker.BundleTrackerCustomizer;
+import org.apache.camel.impl.scan.AnnotatedWithPackageScanFilter;
+import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+import org.apache.camel.spi.PackageScanFilter;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.util.IOHelper;
+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.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.ServiceRegistration;
+
+public class Activator implements BundleActivator, BundleTrackerCustomizer {
+
+ public static final String META_INF_COMPONENT = "META-INF/services/org/apache/camel/component/";
+ public static final String META_INF_LANGUAGE = "META-INF/services/org/apache/camel/language/";
+ public static final String META_INF_LANGUAGE_RESOLVER = "META-INF/services/org/apache/camel/language/resolver/";
+ public static final String META_INF_DATAFORMAT = "META-INF/services/org/apache/camel/dataformat/";
+ public static final String META_INF_TYPE_CONVERTER = "META-INF/services/org/apache/camel/TypeConverter";
+ public static final String META_INF_FALLBACK_TYPE_CONVERTER = "META-INF/services/org/apache/camel/FallbackTypeConverter";
+
+ private static final transient Log LOG = LogFactory.getLog(Activator.class);
+
+ private BundleTracker tracker;
+ private Map<Long, List<BaseService>> resolvers = new ConcurrentHashMap<Long, List<BaseService>>();
+
+ public void start(BundleContext context) throws Exception {
+ LOG.info("Camel activator starting");
+ tracker = new BundleTracker(context, Bundle.ACTIVE, this);
+ tracker.open();
+ LOG.info("Camel activator started");
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ LOG.info("Camel activator stopping");
+ tracker.close();
+ LOG.info("Camel activator stopped");
+ }
+
+ public Object addingBundle(Bundle bundle, BundleEvent event) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bundle started: " + bundle.getSymbolicName());
+ }
+ List<BaseService> r = new ArrayList<BaseService>();
+ registerComponents(bundle, r);
+ registerLanguages(bundle, r);
+ registerDataFormats(bundle, r);
+ registerTypeConverterLoader(bundle, r);
+ for (BaseService service : r) {
+ service.register();
+ }
+ resolvers.put(bundle.getBundleId(), r);
+ return bundle;
+ }
+
+ public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
+ }
+
+ public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Bundle stopped: " + bundle.getSymbolicName());
+ List<BaseService> r = resolvers.remove(bundle.getBundleId());
+ if (r != null) {
+ for (BaseService service : r) {
+ service.unregister();
+ }
+ }
+ }
+ }
+
+ protected void registerComponents(Bundle bundle, List<BaseService> resolvers) {
+ if (checkCompat(bundle, Component.class)) {
+ Map<String, String> components = new HashMap<String, String>();
+ for (Enumeration e = bundle.getEntryPaths(META_INF_COMPONENT); e != null && e.hasMoreElements();) {
+ String path = (String) e.nextElement();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found entry: " + path + " in bundle " + bundle.getSymbolicName());
+ }
+ String name = path.substring(path.lastIndexOf("/") + 1);
+ components.put(name, path);
+ }
+ if (!components.isEmpty()) {
+ resolvers.add(new BundleComponentResolver(bundle, components));
+ }
+ }
+ }
+
+ protected void registerLanguages(Bundle bundle, List<BaseService> resolvers) {
+ if (checkCompat(bundle, Language.class)) {
+ Map<String, String> languages = new HashMap<String, String>();
+ for (Enumeration e = bundle.getEntryPaths(META_INF_LANGUAGE); e != null && e.hasMoreElements();) {
+ String path = (String) e.nextElement();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found entry: " + path + " in bundle " + bundle.getSymbolicName());
+ }
+ String name = path.substring(path.lastIndexOf("/") + 1);
+ languages.put(name, path);
+ }
+ if (!languages.isEmpty()) {
+ resolvers.add(new BundleLanguageResolver(bundle, languages));
+ }
+ for (Enumeration e = bundle.getEntryPaths(META_INF_LANGUAGE_RESOLVER); e != null && e.hasMoreElements();) {
+ String path = (String) e.nextElement();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found entry: " + path + " in bundle " + bundle.getSymbolicName());
+ }
+ String name = path.substring(path.lastIndexOf("/") + 1);
+ resolvers.add(new BundleMetaLanguageResolver(bundle, name, path));
+ }
+ }
+ }
+
+ protected void registerDataFormats(Bundle bundle, List<BaseService> resolvers) {
+ if (checkCompat(bundle, DataFormat.class)) {
+ Map<String, String> dataformats = new HashMap<String, String>();
+ for (Enumeration e = bundle.getEntryPaths(META_INF_DATAFORMAT); e != null && e.hasMoreElements();) {
+ String path = (String) e.nextElement();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found entry: " + path + " in bundle " + bundle.getSymbolicName());
+ }
+ String name = path.substring(path.lastIndexOf("/") + 1);
+ dataformats.put(name, path);
+ }
+ if (!dataformats.isEmpty()) {
+ resolvers.add(new BundleDataFormatResolver(bundle, dataformats));
+ }
+ }
+ }
+
+ protected void registerTypeConverterLoader(Bundle bundle, List<BaseService> resolvers) {
+ if (checkCompat(bundle, TypeConverter.class)) {
+ URL url1 = bundle.getEntry(META_INF_TYPE_CONVERTER);
+ URL url2 = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
+ if (url1 != null || url2 != null) {
+ resolvers.add(new BundleTypeConverterLoader(bundle));
+ }
+ }
+ }
+
+ protected static class BundleComponentResolver extends BaseResolver<Component> implements ComponentResolver {
+
+ private final Map<String, String> components;
+
+ public BundleComponentResolver(Bundle bundle, Map<String, String> components) {
+ super(bundle, Component.class);
+ this.components = components;
+ }
+
+ public Component resolveComponent(String name, CamelContext context) throws Exception {
+ return createInstance(name, components.get(name), context);
+ }
+
+ public void register() {
+ doRegister(ComponentResolver.class, "component", components.keySet());
+ }
+ }
+
+ protected static class BundleLanguageResolver extends BaseResolver<Language> implements LanguageResolver {
+
+ private final Map<String, String> languages;
+
+ public BundleLanguageResolver(Bundle bundle, Map<String, String> languages) {
+ super(bundle, Language.class);
+ this.languages = languages;
+ }
+
+ public Language resolveLanguage(String name, CamelContext context) {
+ return createInstance(name, languages.get(name), context);
+ }
+
+ public void register() {
+ doRegister(LanguageResolver.class, "language", languages.keySet());
+ }
+ }
+
+ protected static class BundleMetaLanguageResolver extends BaseResolver<LanguageResolver> implements LanguageResolver {
+
+ private final String name;
+ private final String path;
+
+ public BundleMetaLanguageResolver(Bundle bundle, String name, String path) {
+ super(bundle, LanguageResolver.class);
+ this.name = name;
+ this.path = path;
+ }
+
+ public Language resolveLanguage(String name, CamelContext context) {
+ LanguageResolver resolver = createInstance(this.name, path, context);
+ return resolver.resolveLanguage(name, context);
+ }
+
+ public void register() {
+ doRegister(LanguageResolver.class, "resolver", name);
+ }
+ }
+
+ protected static class BundleDataFormatResolver extends BaseResolver<DataFormat> implements DataFormatResolver {
+
+ private final Map<String, String> dataformats;
+
+ public BundleDataFormatResolver(Bundle bundle, Map<String, String> dataformats) {
+ super(bundle, DataFormat.class);
+ this.dataformats = dataformats;
+ }
+
+ public DataFormat resolveDataFormat(String name, CamelContext context) {
+ return createInstance(name, dataformats.get(name), context);
+ }
+
+ public DataFormatDefinition resolveDataFormatDefinition(String name, CamelContext context) {
+ return null;
+ }
+
+ public void register() {
+ doRegister(DataFormatResolver.class, "dataformat", dataformats.keySet());
+ }
+ }
+
+ protected static class BundleTypeConverterLoader extends BaseResolver<TypeConverter> implements TypeConverterLoader {
+
+ private final AnnotationTypeConverterLoader loader = new Loader();
+
+ public BundleTypeConverterLoader(Bundle bundle) {
+ super(bundle, TypeConverter.class);
+ }
+
+ public void load(TypeConverterRegistry registry) throws Exception {
+ loader.load(registry);
+ }
+
+ public void register() {
+ doRegister(TypeConverterLoader.class);
+ }
+
+ class Loader extends AnnotationTypeConverterLoader {
+ Loader() {
+ super(null);
+ }
+ public void load(TypeConverterRegistry registry) throws Exception {
+ PackageScanFilter test = new AnnotatedWithPackageScanFilter(Converter.class, true);
+ Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
+ Set<String> packages = getConverterPackages(bundle.getEntry(META_INF_TYPE_CONVERTER));
+ for (String pkg : packages) {
+ Enumeration<URL> e = bundle.findEntries("/" + pkg.replace('.', '/'), "*.class", true);
+ while (e.hasMoreElements()) {
+ String path = e.nextElement().getPath();
+ String externalName = path.substring(path.charAt(0) == '/' ? 1 : 0, path.indexOf('.')).replace('/', '.');
+ try {
+ Class clazz = bundle.loadClass(externalName);
+ if (test.matches(clazz)) {
+ classes.add(bundle.loadClass(externalName));
+ }
+ } catch (Throwable t) {
+ // Ignore
+ }
+ }
+ }
+ LOG.info("Found " + classes.size() + " @Converter classes to load");
+ for (Class type : classes) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Loading converter class: " + ObjectHelper.name(type));
+ }
+ loadConverterMethods(registry, type);
+ }
+ URL fallbackUrl = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
+ if (fallbackUrl != null) {
+ TypeConverter tc = createInstance("FallbackTypeConverter", fallbackUrl, registry.getInjector());
+ registry.addFallbackTypeConverter(tc, false);
+ }
+ // Clear info
+ visitedClasses.clear();
+ visitedURLs.clear();
+ }
+ }
+
+ }
+
+ protected static abstract class BaseResolver<T> extends BaseService {
+
+ private final Class<T> type;
+
+ public BaseResolver(Bundle bundle, Class<T> type) {
+ super(bundle);
+ this.type = type;
+ }
+
+ protected T createInstance(String name, String path, CamelContext context) {
+ if (path == null) {
+ return null;
+ }
+ URL url = bundle.getEntry(path);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("The entry " + name + "'s url is" + url);
+ }
+ return createInstance(name, url, context.getInjector());
+ }
+
+ protected T createInstance(String name, URL url, Injector injector) {
+ try {
+ Properties properties = loadProperties(url);
+ String classname = (String) properties.get("class");
+ Class<T> type = bundle.loadClass(classname);
+ if (!this.type.isAssignableFrom(type)) {
+ throw new IllegalArgumentException("Type is not a " + this.type.getName() + " implementation. Found: " + type.getName());
+ }
+ return injector.newInstance(type);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Invalid URI, no " + this.type.getName() + " registered for scheme : " + name, e);
+ }
+ }
+
+ }
+
+ protected static abstract class BaseService {
+
+ protected final Bundle bundle;
+ private ServiceRegistration reg;
+
+ protected BaseService(Bundle bundle) {
+ this.bundle = bundle;
+ }
+
+ public abstract void register();
+
+ protected void doRegister(Class type, String key, Collection<String> value) {
+ doRegister(type, key, value.toArray(new String[value.size()]));
+ }
+
+ protected void doRegister(Class type, String key, Object value) {
+ Hashtable<String, Object> props = new Hashtable<String, Object>();
+ props.put(key, value);
+ doRegister(type, props);
+ }
+
+ protected void doRegister(Class type) {
+ doRegister(type, null);
+ }
+
+ protected void doRegister(Class type, Dictionary props) {
+ reg = bundle.getBundleContext().registerService(type.getName(), this, props);
+ }
+
+ public void unregister() {
+ reg.unregister();
+ }
+ }
+
+ protected static Properties loadProperties(URL url) {
+ Properties properties = new Properties();
+ BufferedInputStream reader = null;
+ try {
+ reader = new BufferedInputStream(url.openStream());
+ properties.load(reader);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch (Exception ignore) {
+ }
+ }
+ return properties;
+ }
+
+ protected static boolean checkCompat(Bundle bundle, Class clazz) {
+ // Check bundle compatibility
+ try {
+ if (bundle.loadClass(clazz.getName()) != clazz) {
+ return false;
+ }
+ } catch (Throwable t) {
+ return false;
+ }
+ return true;
+ }
+
+ protected static Set<String> getConverterPackages(URL resource) {
+ Set<String> packages = new HashSet<String>();
+ if (resource != null) {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(resource.openStream()));
+ while (true) {
+ String line = reader.readLine();
+ if (line == null) {
+ break;
+ }
+ line = line.trim();
+ if (line.startsWith("#") || line.length() == 0) {
+ continue;
+ }
+ StringTokenizer iter = new StringTokenizer(line, ",");
+ while (iter.hasMoreTokens()) {
+ String name = iter.nextToken().trim();
+ if (name.length() > 0) {
+ packages.add(name);
+ }
+ }
+ }
+ } catch (Exception ignore) {
+ // Do nothing here
+ } finally {
+ if (reader != null) {
+ IOHelper.close(reader, null, LOG);
+ }
+ }
+ }
+ return packages;
+ }
+
+}
+
Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/AbstractTracked.java (from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/AbstractTracked.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/AbstractTracked.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/AbstractTracked.java&p1=camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/AbstractTracked.java&r1=950897&r2=951497&rev=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/AbstractTracked.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/AbstractTracked.java Fri Jun 4 17:16:29 2010
@@ -31,7 +31,7 @@
* limitations under the License.
*/
-package org.apache.camel.core.osgi.tracker;
+package org.apache.camel.impl.osgi.tracker;
import java.util.ArrayList;
import java.util.HashMap;
Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTracker.java (from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTracker.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTracker.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTracker.java&p1=camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTracker.java&r1=950897&r2=951497&rev=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTracker.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTracker.java Fri Jun 4 17:16:29 2010
@@ -31,7 +31,7 @@
* limitations under the License.
*/
-package org.apache.camel.core.osgi.tracker;
+package org.apache.camel.impl.osgi.tracker;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTrackerCustomizer.java (from r950897, camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTrackerCustomizer.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTrackerCustomizer.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTrackerCustomizer.java&p1=camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTrackerCustomizer.java&r1=950897&r2=951497&rev=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/tracker/BundleTrackerCustomizer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/osgi/tracker/BundleTrackerCustomizer.java Fri Jun 4 17:16:29 2010
@@ -31,7 +31,7 @@
* limitations under the License.
*/
-package org.apache.camel.core.osgi.tracker;
+package org.apache.camel.impl.osgi.tracker;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Fri Jun 4 17:16:29 2010
@@ -664,6 +664,38 @@ public final class ObjectHelper {
// must clean the name so its pure java name, eg removing \n or whatever people can do in the Spring XML
name = normalizeClassName(name);
+ // Try simple type first
+ Class<?> clazz = loadSimpleType(name);
+ if (clazz == null) {
+ // try context class loader
+ clazz = doLoadClass(name, Thread.currentThread().getContextClassLoader());
+ }
+ if (clazz == null) {
+ // then the provided loader
+ clazz = doLoadClass(name, loader);
+ }
+ if (clazz == null) {
+ // and fallback to the loader the loaded the ObjectHelper class
+ clazz = doLoadClass(name, ObjectHelper.class.getClassLoader());
+ }
+
+ if (clazz == null) {
+ if (needToWarn) {
+ LOG.warn("Cannot find class: " + name);
+ }
+ }
+
+ return clazz;
+ }
+
+
+ /**
+ * Load a simple type
+ *
+ * @param name the name of the class to load
+ * @return the class or <tt>null</tt> if it could not be loaded
+ */
+ public static Class<?> loadSimpleType(String name) {
// special for byte[] as its common to use
if ("java.lang.byte[]".equals(name) || "byte[]".equals(name)) {
return byte[].class;
@@ -681,7 +713,7 @@ public final class ObjectHelper {
} else if ("java.lang.Short".equals(name) || "Short".equals(name)) {
return Short.class;
} else if ("short".equals(name)) {
- return long.class;
+ return short.class;
} else if ("java.lang.Byte".equals(name) || "Byte".equals(name)) {
return Byte.class;
} else if ("byte".equals(name)) {
@@ -689,33 +721,14 @@ public final class ObjectHelper {
} else if ("java.lang.Float".equals(name) || "Float".equals(name)) {
return Float.class;
} else if ("float".equals(name)) {
- return byte.class;
+ return float.class;
} else if ("java.lang.Double".equals(name) || "Double".equals(name)) {
return Double.class;
} else if ("double".equals(name)) {
- return byte.class;
- }
-
- // try context class loader first
- Class<?> clazz = doLoadClass(name, Thread.currentThread().getContextClassLoader());
- if (clazz == null) {
- // then the provided loader
- clazz = doLoadClass(name, loader);
+ return double.class;
}
- if (clazz == null) {
- // and fallback to the loader the loaded the ObjectHelper class
- clazz = doLoadClass(name, ObjectHelper.class.getClassLoader());
- }
-
- if (clazz == null) {
- if (needToWarn) {
- LOG.warn("Cannot find class: " + name);
- }
- }
-
- return clazz;
+ return null;
}
-
/**
* Loads the given class with the provided classloader (may be null).
* Will ignore any class not found and return null.
Modified: camel/trunk/components/camel-blueprint/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/pom.xml?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/pom.xml (original)
+++ camel/trunk/components/camel-blueprint/pom.xml Fri Jun 4 17:16:29 2010
@@ -44,9 +44,6 @@
org.apache.camel.core.osgi*,
org.apache.camel.core.xml*
</camel.osgi.private.pkg>
- <camel.osgi.activator>
- org.apache.camel.core.osgi.Activator
- </camel.osgi.activator>
</properties>
<dependencies>
@@ -63,7 +60,7 @@
<artifactId>camel-core-osgi</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.felix</groupId>
+ <groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<scope>provided</scope>
</dependency>
@@ -75,6 +72,10 @@
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
<!-- for testing -->
<dependency>
@@ -89,11 +90,6 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>test</scope>
Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java Fri Jun 4 17:16:29 2010
@@ -16,14 +16,58 @@
*/
package org.apache.camel.blueprint;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.core.osgi.CompositeRegistry;
+import org.apache.camel.core.osgi.OsgiCamelContextHelper;
+import org.apache.camel.core.osgi.OsgiClassResolver;
+import org.apache.camel.core.osgi.OsgiFactoryFinderResolver;
+import org.apache.camel.core.osgi.OsgiPackageScanClassResolver;
+import org.apache.camel.core.osgi.OsgiServiceRegistry;
+import org.apache.camel.core.osgi.OsgiTypeConverter;
import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Registry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
public class BlueprintCamelContext extends DefaultCamelContext {
private static final transient Log LOG = LogFactory.getLog(BlueprintCamelContext.class);
+ private BundleContext bundleContext;
+ private BlueprintContainer blueprintContainer;
+
+ public BlueprintCamelContext() {
+ }
+
+ public BlueprintCamelContext(BundleContext bundleContext, BlueprintContainer blueprintContainer) {
+ this.bundleContext = bundleContext;
+ this.blueprintContainer = blueprintContainer;
+ setClassResolver(new OsgiClassResolver(bundleContext));
+ setFactoryFinderResolver(new OsgiFactoryFinderResolver(bundleContext));
+ setPackageScanClassResolver(new OsgiPackageScanClassResolver(bundleContext));
+ setComponentResolver(new BlueprintComponentResolver(bundleContext));
+ setLanguageResolver(new BlueprintLanguageResolver(bundleContext));
+ setDataFormatResolver(new BlueprintDataFormatResolver(bundleContext));
+ }
+
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public BlueprintContainer getBlueprintContainer() {
+ return blueprintContainer;
+ }
+
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
public void init() throws Exception {
maybeStart();
}
@@ -43,4 +87,15 @@ public class BlueprintCamelContext exten
stop();
}
+ @Override
+ protected TypeConverter createTypeConverter() {
+ return new OsgiTypeConverter(bundleContext, getInjector());
+ }
+
+ @Override
+ protected Registry createRegistry() {
+ Registry reg = new BlueprintContainerRegistry(getBlueprintContainer());
+ return OsgiCamelContextHelper.wrapRegistry(this, reg, bundleContext);
+ }
+
}
Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintComponentResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintComponentResolver.java?rev=951497&view=auto
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintComponentResolver.java (added)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintComponentResolver.java Fri Jun 4 17:16:29 2010
@@ -0,0 +1,51 @@
+/**
+ * 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.blueprint;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.core.osgi.OsgiComponentResolver;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+
+public class BlueprintComponentResolver extends OsgiComponentResolver {
+
+ private static final transient Log LOG = LogFactory.getLog(BlueprintComponentResolver.class);
+
+ public BlueprintComponentResolver(BundleContext bundleContext) {
+ super(bundleContext);
+ }
+
+ @Override
+ public Component resolveComponent(String name, CamelContext context) throws Exception {
+ try {
+ Object bean = context.getRegistry().lookup(".camelBlueprint.componentResolver." + name);
+ if (bean instanceof ComponentResolver) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found component resolver: " + name + " in registry: " + bean);
+ }
+ return ((ComponentResolver) bean).resolveComponent(name, context);
+ }
+ } catch (Exception e) {
+ LOG.debug("Ignored error looking up bean: " + name + ". Error: " + e);
+ }
+ return super.resolveComponent(name, context);
+ }
+
+}
Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java?rev=951497&view=auto
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java (added)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerRegistry.java Fri Jun 4 17:16:29 2010
@@ -0,0 +1,45 @@
+/**
+ * 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.blueprint;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.camel.spi.Registry;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class BlueprintContainerRegistry implements Registry {
+
+ private final BlueprintContainer blueprintContainer;
+
+ public BlueprintContainerRegistry(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
+ public Object lookup(String name) {
+ return blueprintContainer.getComponentInstance(name);
+ }
+
+ public <T> T lookup(String name, Class<T> type) {
+ return null;
+ }
+
+ public <T> Map<String, T> lookupByType(Class<T> type) {
+ return Collections.emptyMap();
+ }
+
+}
Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintDataFormatResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintDataFormatResolver.java?rev=951497&view=auto
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintDataFormatResolver.java (added)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintDataFormatResolver.java Fri Jun 4 17:16:29 2010
@@ -0,0 +1,51 @@
+/**
+ * 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.blueprint;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.core.osgi.OsgiDataFormatResolver;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+
+public class BlueprintDataFormatResolver extends OsgiDataFormatResolver {
+
+ private static final transient Log LOG = LogFactory.getLog(BlueprintDataFormatResolver.class);
+
+ public BlueprintDataFormatResolver(BundleContext bundleContext) {
+ super(bundleContext);
+ }
+
+ @Override
+ public DataFormat resolveDataFormat(String name, CamelContext context) {
+ try {
+ Object bean = context.getRegistry().lookup(".camelBlueprint.dataformatResolver." + name);
+ if (bean instanceof DataFormatResolver) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found dataformat resolver: " + name + " in registry: " + bean);
+ }
+ return ((DataFormatResolver) bean).resolveDataFormat(name, context);
+ }
+ } catch (Exception e) {
+ LOG.debug("Ignored error looking up bean: " + name + ". Error: " + e);
+ }
+ return super.resolveDataFormat(name, context);
+ }
+
+}
Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintLanguageResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintLanguageResolver.java?rev=951497&view=auto
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintLanguageResolver.java (added)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintLanguageResolver.java Fri Jun 4 17:16:29 2010
@@ -0,0 +1,51 @@
+/**
+ * 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.blueprint;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.core.osgi.OsgiLanguageResolver;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+
+public class BlueprintLanguageResolver extends OsgiLanguageResolver {
+
+ private static final transient Log LOG = LogFactory.getLog(BlueprintLanguageResolver.class);
+
+ public BlueprintLanguageResolver(BundleContext bundleContext) {
+ super(bundleContext);
+ }
+
+ @Override
+ public Language resolveLanguage(String name, CamelContext context) {
+ try {
+ Object bean = context.getRegistry().lookup(".camelBlueprint.languageResolver." + name);
+ if (bean instanceof LanguageResolver) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Found language resolver: " + name + " in registry: " + bean);
+ }
+ return ((LanguageResolver) bean).resolveLanguage(name, context);
+ }
+ } catch (Exception e) {
+ LOG.debug("Ignored error looking up bean: " + name + ". Error: " + e);
+ }
+ return super.resolveLanguage(name, context);
+ }
+
+}
Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java Fri Jun 4 17:16:29 2010
@@ -18,7 +18,6 @@ package org.apache.camel.blueprint;
import java.util.ArrayList;
import java.util.List;
-
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@@ -31,36 +30,16 @@ import org.apache.camel.RoutesBuilder;
import org.apache.camel.ShutdownRoute;
import org.apache.camel.ShutdownRunningTask;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.core.osgi.OsgiAnnotationTypeConverterLoader;
-import org.apache.camel.core.osgi.OsgiCamelContextHelper;
-import org.apache.camel.core.osgi.OsgiClassResolver;
-import org.apache.camel.core.osgi.OsgiComponentResolver;
-import org.apache.camel.core.osgi.OsgiFactoryFinderResolver;
-import org.apache.camel.core.osgi.OsgiLanguageResolver;
-import org.apache.camel.core.osgi.OsgiPackageScanClassResolver;
-import org.apache.camel.core.osgi.OsgiServiceRegistry;
import org.apache.camel.core.xml.AbstractCamelContextFactoryBean;
import org.apache.camel.core.xml.CamelJMXAgentDefinition;
import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition;
import org.apache.camel.core.xml.CamelProxyFactoryDefinition;
import org.apache.camel.core.xml.CamelServiceExporterDefinition;
-import org.apache.camel.model.InterceptDefinition;
-import org.apache.camel.model.InterceptFromDefinition;
-import org.apache.camel.model.InterceptSendToEndpointDefinition;
-import org.apache.camel.model.OnCompletionDefinition;
-import org.apache.camel.model.OnExceptionDefinition;
-import org.apache.camel.model.PackageScanDefinition;
-import org.apache.camel.model.RouteBuilderDefinition;
-import org.apache.camel.model.RouteContextRefDefinition;
-import org.apache.camel.model.RouteDefinition;
-import org.apache.camel.model.ThreadPoolProfileDefinition;
+import org.apache.camel.model.*;
import org.apache.camel.model.config.PropertiesDefinition;
import org.apache.camel.model.dataformat.DataFormatsDefinition;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.blueprint.container.BlueprintContainer;
/**
* A bean to create and initialize a {@link BlueprintCamelContext}
@@ -143,6 +122,10 @@ public class CamelContextFactoryBean ext
// private ApplicationContext applicationContext;
// @XmlTransient
// private BeanPostProcessor beanPostProcessor;
+ @XmlTransient
+ private BlueprintContainer blueprintContainer;
+ @XmlTransient
+ private BundleContext bundleContext;
public Class getObjectType() {
@@ -157,33 +140,16 @@ public class CamelContextFactoryBean ext
return context;
}
- protected BlueprintCamelContext createContext() {
- BlueprintCamelContext ctx = new BlueprintCamelContext();
- ctx.setName(getId());
-
- // Adding discovery to this from camel-osgi
-
- BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
-
- OsgiServiceRegistry registry = new OsgiServiceRegistry(bundleContext);
- ctx.setRegistry(registry);
-
- OsgiCamelContextHelper.updateRegistry(ctx, bundleContext);
-
- ctx.setClassResolver(new OsgiClassResolver(bundleContext));
- ctx.setFactoryFinderResolver(new OsgiFactoryFinderResolver());
- ctx.setPackageScanClassResolver(new OsgiPackageScanClassResolver(bundleContext));
- ctx.setComponentResolver(new OsgiComponentResolver());
- ctx.setLanguageResolver(new OsgiLanguageResolver());
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
- OsgiAnnotationTypeConverterLoader typeConverterLoader = new OsgiAnnotationTypeConverterLoader(new OsgiPackageScanClassResolver(bundleContext));
- try {
- typeConverterLoader.load(ctx.getTypeConverterRegistry());
- } catch (Exception e) {
- throw ObjectHelper.wrapRuntimeCamelException(e);
- }
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
- return ctx;
+ protected BlueprintCamelContext createContext() {
+ return new BlueprintCamelContext(bundleContext, blueprintContainer);
}
@Override
Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java Fri Jun 4 17:16:29 2010
@@ -17,31 +17,44 @@
package org.apache.camel.blueprint.handler;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
-
import javax.xml.bind.Binder;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
import org.apache.aries.blueprint.NamespaceHandler;
import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.PassThroughMetadata;
import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
+import org.apache.aries.blueprint.mutable.MutableReferenceMetadata;
import org.apache.camel.blueprint.BlueprintCamelContext;
import org.apache.camel.blueprint.CamelContextFactoryBean;
import org.apache.camel.core.xml.AbstractCamelContextFactoryBean;
+import org.apache.camel.model.*;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.camel.spi.LanguageResolver;
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.osgi.service.blueprint.container.BlueprintContainer;
import org.osgi.service.blueprint.container.ComponentDefinitionException;
import org.osgi.service.blueprint.reflect.ComponentMetadata;
import org.osgi.service.blueprint.reflect.Metadata;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
public class CamelNamespaceHandler implements NamespaceHandler {
@@ -52,6 +65,8 @@ public class CamelNamespaceHandler imple
private JAXBContext jaxbContext;
+ private static final transient Log LOG = LogFactory.getLog(CamelNamespaceHandler.class);
+
public static void renameNamespaceRecursive(Node node) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
Document doc = node.getOwnerDocument();
@@ -98,15 +113,121 @@ public class CamelNamespaceHandler imple
throw new ComponentDefinitionException("Expected an instance of " + CamelContextFactoryBean.class);
}
+ CamelContextFactoryBean ccfb = (CamelContextFactoryBean) value;
+ try {
+ PassThroughMetadata ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintContainer");
+ ccfb.setBlueprintContainer((BlueprintContainer) ptm.getObject());
+ ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintBundleContext");
+ ccfb.setBundleContext((BundleContext) ptm.getObject());
+ ccfb.afterPropertiesSet();
+ } catch (Exception e) {
+ throw new ComponentDefinitionException("Unable to initialize camel context factory", e);
+ }
+
+ Set<String> components = new HashSet<String>();
+ Set<String> languages = new HashSet<String>();
+ Set<String> dataformats = new HashSet<String>();
+ Set<String> dependsOn = new HashSet<String>();
+ for (RouteDefinition rd : ccfb.getContext().getRouteDefinitions()) {
+ findInputComponents(rd.getInputs(), components, languages, dataformats);
+ findOutputComponents(rd.getOutputs(), components, languages, dataformats);
+ }
+ try {
+ for (String component : components) {
+ ComponentMetadata cm = context.getComponentDefinitionRegistry().getComponentDefinition(".camelBlueprint.componentResolver." + component);
+ if (cm == null) {
+ MutableReferenceMetadata svc = context.createMetadata(MutableReferenceMetadata.class);
+ svc.setId(".camelBlueprint.componentResolver." + component);
+ svc.setFilter("(component=" + component + ")");
+ try {
+ // Try to set the runtime interface (only with aries blueprint > 0.1
+ svc.getClass().getMethod("setRuntimeInterface", Class.class).invoke(svc, ComponentResolver.class);
+ } catch (Throwable t) {
+ // Check if the bundle can see the class
+ try {
+ PassThroughMetadata ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintBundle");
+ Bundle b = (Bundle) ptm.getObject();
+ if (b.loadClass(ComponentResolver.class.getName()) != ComponentResolver.class) {
+ throw new UnsupportedOperationException();
+ }
+ svc.setInterface(ComponentResolver.class.getName());
+ } catch (Throwable t2) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ context.getComponentDefinitionRegistry().registerComponentDefinition(svc);
+ dependsOn.add(svc.getId());
+ }
+ }
+ for (String language : languages) {
+ ComponentMetadata cm = context.getComponentDefinitionRegistry().getComponentDefinition(".camelBlueprint.languageResolver." + language);
+ if (cm == null) {
+ MutableReferenceMetadata svc = context.createMetadata(MutableReferenceMetadata.class);
+ svc.setId(".camelBlueprint.languageResolver." + language);
+ svc.setFilter("(language=" + language + ")");
+ try {
+ // Try to set the runtime interface (only with aries blueprint > 0.1
+ svc.getClass().getMethod("setRuntimeInterface", Class.class).invoke(svc, LanguageResolver.class);
+ } catch (Throwable t) {
+ // Check if the bundle can see the class
+ try {
+ PassThroughMetadata ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintBundle");
+ Bundle b = (Bundle) ptm.getObject();
+ if (b.loadClass(LanguageResolver.class.getName()) != LanguageResolver.class) {
+ throw new UnsupportedOperationException();
+ }
+ svc.setInterface(LanguageResolver.class.getName());
+ } catch (Throwable t2) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ context.getComponentDefinitionRegistry().registerComponentDefinition(svc);
+ dependsOn.add(svc.getId());
+ }
+ }
+ for (String dataformat : dataformats) {
+ ComponentMetadata cm = context.getComponentDefinitionRegistry().getComponentDefinition(".camelBlueprint.dataformatResolver." + dataformat);
+ if (cm == null) {
+ MutableReferenceMetadata svc = context.createMetadata(MutableReferenceMetadata.class);
+ svc.setId(".camelBlueprint.dataformatResolver." + dataformat);
+ svc.setFilter("(dataformat=" + dataformat + ")");
+ try {
+ // Try to set the runtime interface (only with aries blueprint > 0.1
+ svc.getClass().getMethod("setRuntimeInterface", Class.class).invoke(svc, DataFormatResolver.class);
+ } catch (Throwable t) {
+ // Check if the bundle can see the class
+ try {
+ PassThroughMetadata ptm = (PassThroughMetadata) context.getComponentDefinitionRegistry().getComponentDefinition("blueprintBundle");
+ Bundle b = (Bundle) ptm.getObject();
+ if (b.loadClass(DataFormatResolver.class.getName()) != DataFormatResolver.class) {
+ throw new UnsupportedOperationException();
+ }
+ svc.setInterface(DataFormatResolver.class.getName());
+ } catch (Throwable t2) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ context.getComponentDefinitionRegistry().registerComponentDefinition(svc);
+ dependsOn.add(svc.getId());
+ }
+ }
+ } catch (UnsupportedOperationException e) {
+ LOG.warn("Unable to add dependencies on to camel components OSGi services. " +
+ "The Apache Aries blueprint implementation used it too old and the blueprint bundle can not see the org.apache.camel.spi package.");
+ components.clear();
+ languages.clear();
+ dataformats.clear();
+ }
+
MutablePassThroughMetadata factory = context.createMetadata(MutablePassThroughMetadata.class);
- factory.setId(".camelBlueprint.passThrough." + contextId);
+ factory.setId(".camelBlueprint.passThrough." + contextId);
factory.setObject(new PassThroughCallable<Object>(value));
+ factory.setDependsOn(new ArrayList<String>(components));
MutableBeanMetadata factory2 = context.createMetadata(MutableBeanMetadata.class);
factory2.setId(".camelBlueprint.factory." + contextId);
factory2.setFactoryComponent(factory);
factory2.setFactoryMethod("call");
- factory2.setInitMethod("afterPropertiesSet");
factory2.setDestroyMethod("destroy");
MutableBeanMetadata ctx = context.createMetadata(MutableBeanMetadata.class);
@@ -121,6 +242,97 @@ public class CamelNamespaceHandler imple
return null;
}
+ private void findInputComponents(List<FromDefinition> defs, Set<String> components, Set<String> languages, Set<String> dataformats) {
+ if (defs != null) {
+ for (FromDefinition def : defs) {
+ findUriComponent(def.getUri(), components);
+ }
+ }
+ }
+
+ private void findOutputComponents(List<ProcessorDefinition> defs, Set<String> components, Set<String> languages, Set<String> dataformats) {
+ if (defs != null) {
+ for (ProcessorDefinition def : defs) {
+ if (def instanceof SendDefinition) {
+ findUriComponent(((SendDefinition) def).getUri(), components);
+ }
+ if (def instanceof MarshalDefinition) {
+ findDataFormat(((MarshalDefinition) def).getDataFormatType(), dataformats);
+ }
+ if (def instanceof UnmarshalDefinition) {
+ findDataFormat(((UnmarshalDefinition) def).getDataFormatType(), dataformats);
+ }
+ if (def instanceof ExpressionNode) {
+ findLanguage(((ExpressionNode) def).getExpression(), languages);
+ }
+ if (def instanceof ResequenceDefinition) {
+ findLanguage(((ResequenceDefinition) def).getExpressions(), languages);
+ }
+ if (def instanceof AggregateDefinition) {
+ findLanguage(((AggregateDefinition) def).getExpression(), languages);
+ findLanguage(((AggregateDefinition) def).getCorrelationExpression(), languages);
+ findLanguage(((AggregateDefinition) def).getCompletionPredicate(), languages);
+ findLanguage(((AggregateDefinition) def).getCompletionTimeoutExpression(), languages);
+ findLanguage(((AggregateDefinition) def).getCompletionSizeExpression(), languages);
+ }
+ if (def instanceof CatchDefinition) {
+ findLanguage(((CatchDefinition) def).getHandled(), languages);
+ }
+ if (def instanceof OnExceptionDefinition) {
+ findLanguage(((OnExceptionDefinition) def).getRetryUntil(), languages);
+ findLanguage(((OnExceptionDefinition) def).getHandled(), languages);
+ findLanguage(((OnExceptionDefinition) def).getContinued(), languages);
+ }
+ if (def instanceof SortDefinition) {
+ findLanguage(((SortDefinition) def).getExpression(), languages);
+ }
+ if (def instanceof WireTapDefinition) {
+ findLanguage(((WireTapDefinition) def).getNewExchangeExpression(), languages);
+ }
+ findOutputComponents(def.getOutputs(), components, languages, dataformats);
+ }
+ }
+ }
+
+ private void findLanguage(ExpressionDefinition expression, Set<String> languages) {
+ if (expression != null) {
+ String lang = expression.getLanguage();
+ if (lang != null && lang.length() > 0) {
+ languages.add(lang);
+ }
+ }
+ }
+
+ private void findLanguage(List<ExpressionDefinition> expressions, Set<String> languages) {
+ if (expressions != null) {
+ for (ExpressionDefinition e : expressions) {
+ findLanguage(e, languages);
+ }
+ }
+ }
+
+ private void findLanguage(ExpressionSubElementDefinition expression, Set<String> languages) {
+ if (expression != null) {
+ findLanguage(expression.getExpressionType(), languages);
+ }
+ }
+
+ private void findDataFormat(DataFormatDefinition dfd, Set<String> dataformats) {
+ if (dfd != null && dfd.getDataFormatName() != null) {
+ dataformats.add(dfd.getDataFormatName());
+ }
+ }
+
+ private void findUriComponent(String uri, Set<String> components) {
+ if (uri != null) {
+ String splitURI[] = ObjectHelper.splitOnCharacter(uri, ":", 2);
+ if (splitURI[1] != null) {
+ String scheme = splitURI[0];
+ components.add(scheme);
+ }
+ }
+ }
+
public ComponentMetadata decorate(Node node, ComponentMetadata component, ParserContext context) {
return null;
}
Modified: camel/trunk/components/camel-core-osgi/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/pom.xml?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/pom.xml (original)
+++ camel/trunk/components/camel-core-osgi/pom.xml Fri Jun 4 17:16:29 2010
@@ -36,11 +36,28 @@
<artifactId>camel-core</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.felix</groupId>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<scope>provided</scope>
</dependency>
+ <!-- for testing -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.osgi</groupId>
+ <artifactId>spring-osgi-mock</artifactId>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
<build>
Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java Fri Jun 4 17:16:29 2010
@@ -18,10 +18,12 @@ package org.apache.camel.core.osgi;
import java.util.List;
+import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;
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.spi.Registry;
import org.apache.camel.util.ObjectHelper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -34,52 +36,22 @@ public final class OsgiCamelContextHelpe
// helper class
}
- public static DefaultTypeConverter createTypeConverter(DefaultCamelContext context) {
-
- DefaultTypeConverter answer = new DefaultTypeConverter(context.getPackageScanClassResolver(), context.getInjector(), context.getDefaultFactoryFinder());
- List<TypeConverterLoader> typeConverterLoaders = answer.getTypeConverterLoaders();
-
- // Remove the AnnotationTypeConverterLoader
- TypeConverterLoader atLoader = null;
- for (TypeConverterLoader loader : typeConverterLoaders) {
- if (loader instanceof AnnotationTypeConverterLoader) {
- atLoader = loader;
- break;
- }
- }
- if (atLoader != null) {
- typeConverterLoaders.remove(atLoader);
- }
-
- // add our osgi annotation loader
- typeConverterLoaders.add(new OsgiAnnotationTypeConverterLoader(context.getPackageScanClassResolver()));
- context.setTypeConverterRegistry(answer);
- return answer;
- }
-
public static void osgiUpdate(DefaultCamelContext camelContext, BundleContext bundleContext) {
- if (bundleContext != null) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Using OSGi resolvers");
- }
- updateRegistry(camelContext, bundleContext);
- LOG.debug("Using the OsgiClassResolver");
- camelContext.setClassResolver(new OsgiClassResolver(bundleContext));
- LOG.debug("Using OsgiFactoryFinderResolver");
- camelContext.setFactoryFinderResolver(new OsgiFactoryFinderResolver());
- LOG.debug("Using OsgiPackageScanClassResolver");
- camelContext.setPackageScanClassResolver(new OsgiPackageScanClassResolver(bundleContext));
- LOG.debug("Using OsgiComponentResolver");
- camelContext.setComponentResolver(new OsgiComponentResolver());
- LOG.debug("Using OsgiLanguageResolver");
- camelContext.setLanguageResolver(new OsgiLanguageResolver());
- } else {
- // TODO: should we not thrown an exception to not allow it to startup
- LOG.warn("BundleContext not set, cannot run in OSGI container");
- }
+ LOG.debug("Using the OsgiClassResolver");
+ camelContext.setClassResolver(new OsgiClassResolver(bundleContext));
+ LOG.debug("Using OsgiFactoryFinderResolver");
+ camelContext.setFactoryFinderResolver(new OsgiFactoryFinderResolver(bundleContext));
+ LOG.debug("Using OsgiPackageScanClassResolver");
+ camelContext.setPackageScanClassResolver(new OsgiPackageScanClassResolver(bundleContext));
+ LOG.debug("Using OsgiComponentResolver");
+ camelContext.setComponentResolver(new OsgiComponentResolver(bundleContext));
+ LOG.debug("Using OsgiLanguageResolver");
+ camelContext.setLanguageResolver(new OsgiLanguageResolver(bundleContext));
+ LOG.debug("Using OsgiDataFormatResolver");
+ camelContext.setDataFormatResolver(new OsgiDataFormatResolver(bundleContext));
}
- public static void updateRegistry(DefaultCamelContext camelContext, BundleContext bundleContext) {
+ public static Registry wrapRegistry(CamelContext camelContext, Registry registry, BundleContext bundleContext) {
ObjectHelper.notNull(bundleContext, "BundleContext");
LOG.debug("Setting the OSGi ServiceRegistry");
OsgiServiceRegistry osgiServiceRegistry = new OsgiServiceRegistry(bundleContext);
@@ -87,8 +59,8 @@ public final class OsgiCamelContextHelpe
camelContext.addLifecycleStrategy(osgiServiceRegistry);
CompositeRegistry compositeRegistry = new CompositeRegistry();
compositeRegistry.addRegistry(osgiServiceRegistry);
- compositeRegistry.addRegistry(camelContext.getRegistry());
- camelContext.setRegistry(compositeRegistry);
+ compositeRegistry.addRegistry(registry);
+ return compositeRegistry;
}
}
Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java Fri Jun 4 17:16:29 2010
@@ -39,7 +39,12 @@ public class OsgiClassResolver extends D
}
public Class<?> resolveClass(String name) {
- return loadClass(name, bundleContext.getBundle());
+ name = ObjectHelper.normalizeClassName(name);
+ Class<?> clazz = ObjectHelper.loadSimpleType(name);
+ if (clazz == null) {
+ clazz = doLoadClass(name, bundleContext.getBundle());
+ }
+ return clazz;
}
public <T> Class<T> resolveClass(String name, Class<T> type) {
@@ -62,17 +67,10 @@ public class OsgiClassResolver extends D
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;
+ return bundleContext.getBundle().getEntry(uri);
}
- protected Class<?> loadClass(String name, Bundle loader) {
+ protected Class<?> doLoadClass(String name, Bundle loader) {
ObjectHelper.notEmpty(name, "name");
Class<?> answer = null;
// Try to use the camel context's bundle's classloader to load the class
@@ -85,19 +83,6 @@ public class OsgiClassResolver extends D
}
}
}
- // 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;
}
Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java?rev=951497&r1=951496&r2=951497&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java Fri Jun 4 17:16:29 2010
@@ -16,16 +16,27 @@
*/
package org.apache.camel.core.osgi;
+import java.util.List;
+
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.spi.ComponentResolver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
public class OsgiComponentResolver implements ComponentResolver {
private static final transient Log LOG = LogFactory.getLog(OsgiComponentResolver.class);
+ private final BundleContext bundleContext;
+
+ public OsgiComponentResolver(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
@SuppressWarnings("unchecked")
public Component resolveComponent(String name, CamelContext context) throws Exception {
Object bean = null;
@@ -37,33 +48,26 @@ public class OsgiComponentResolver imple
} catch (Exception e) {
LOG.debug("Ignored error looking up bean: " + name + ". Error: " + e);
}
- if (bean != null) {
- if (bean instanceof Component) {
- return (Component)bean;
- }
- // we do not throw the exception here and try to auto create a component
+ if (bean instanceof Component) {
+ return (Component)bean;
}
// Check in OSGi bundles
- Class type;
+ return getComponent(name, context);
+ }
+
+ protected Component getComponent(String name, CamelContext context) throws Exception {
+ LOG.trace("Finding Component: " + name);
try {
- type = getComponent(name);
- } catch (Throwable e) {
- throw new IllegalArgumentException("Invalid URI, no Component registered for scheme : " + name, e);
- }
- if (type == null) {
+ ServiceReference[] refs = bundleContext.getServiceReferences(ComponentResolver.class.getName(), "(component=" + name + ")");
+ if (refs != null && refs.length > 0) {
+ ComponentResolver resolver = (ComponentResolver) bundleContext.getService(refs[0]);
+ return resolver.resolveComponent(name, context);
+ }
return null;
+ } catch (InvalidSyntaxException e) {
+ throw new RuntimeException(e); // Should never happen
}
-
- if (Component.class.isAssignableFrom(type)) {
- return (Component)context.getInjector().newInstance(type);
- } else {
- throw new IllegalArgumentException("Type is not a Component implementation. Found: " + type.getName());
- }
- }
-
- protected Class getComponent(String name) throws Exception {
- return Activator.getComponent(name);
}
}