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);
     }
 
 }