You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/01/18 02:57:33 UTC

svn commit: r1435006 - in /camel/trunk/components/camel-core-osgi/src: main/java/org/apache/camel/core/osgi/ test/java/org/apache/camel/core/osgi/

Author: ningjiang
Date: Fri Jan 18 01:57:33 2013
New Revision: 1435006

URL: http://svn.apache.org/viewvc?rev=1435006&view=rev
Log:
CAMEL-5969, CAMEL-5972 added the OsgiiServiceRegistry.lookupByType() and supports to lookup service with filter on name=blabla

Modified:
    camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.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/ServiceRegistryTest.java

Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java?rev=1435006&r1=1435005&r2=1435006&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java Fri Jan 18 01:57:33 2013
@@ -17,6 +17,7 @@
 package org.apache.camel.core.osgi;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -25,6 +26,7 @@ import java.util.concurrent.ConcurrentLi
 import org.apache.camel.CamelContext;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.LifecycleStrategySupport;
+import org.apache.camel.util.ObjectHelper;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 
@@ -34,21 +36,46 @@ import org.osgi.framework.ServiceReferen
 public class OsgiServiceRegistry extends LifecycleStrategySupport implements Registry {
     private final BundleContext bundleContext;
     private final Map<String, Object> serviceCacheMap = new ConcurrentHashMap<String, Object>();
-    private final Queue<ServiceReference> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference>();
+    private final Map<Class<?>, Map<String, Object>> typeCacheMap = new ConcurrentHashMap<Class<?>, Map<String, Object>>();
+    private final Queue<ServiceReference<?>> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference<?>>();
     
     public OsgiServiceRegistry(BundleContext bc) {
         bundleContext = bc;
     }
 
+    /**
+     * Support to lookup the Object with filter with the (name=NAME) and class type
+     * 
+     */
     public <T> T lookup(String name, Class<T> type) {
-        Object service = lookup(name);
+        Object service = serviceCacheMap.get(name);
+        if (service == null) {
+            ServiceReference<?> sr  = null;
+            try {
+                ServiceReference<?>[] refs = bundleContext.getServiceReferences(type.getName(), "(name=" + name + ")");            
+                if (refs != null && refs.length > 0) {
+                    // just return the first one
+                    sr = refs[0];
+                }
+                serviceReferenceQueue.add(sr);
+                service = bundleContext.getService(sr);
+                if (service != null) {
+                    serviceCacheMap.put(name, service);
+                }
+            } catch (Exception ex) {
+                throw ObjectHelper.wrapRuntimeCamelException(ex);
+            }
+        }
         return type.cast(service);
     }
 
+    /**
+     * It's only support to look up the ServiceReference with Class name
+     */
     public Object lookup(String name) {
         Object service = serviceCacheMap.get(name);
         if (service == null) {
-            ServiceReference sr = bundleContext.getServiceReference(name);            
+            ServiceReference<?> sr = bundleContext.getServiceReference(name);            
             if (sr != null) {
                 // Need to keep the track of Service
                 // and call ungetService when the camel context is closed 
@@ -63,14 +90,31 @@ public class OsgiServiceRegistry extends
     }
 
     public <T> Map<String, T> lookupByType(Class<T> type) {
-        // not implemented so we return an empty map
-        return Collections.<String, T>emptyMap();
+        Map<String, T> result = new HashMap<String, T>();
+        try {
+            ServiceReference<?>[] refs = bundleContext.getAllServiceReferences(type.getName(), null);
+            if (refs != null) {
+                for (ServiceReference<?> sr : refs) {
+                    serviceReferenceQueue.add(sr);
+                    Object service = bundleContext.getService(sr);
+                    if (service != null) {
+                        String name = (String)sr.getProperty("name");
+                        if (name != null) {
+                            result.put(name , type.cast(service));
+                        }
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            throw ObjectHelper.wrapRuntimeCamelException(ex);
+        }
+        return result;
     }
 
     @Override
     public void onContextStop(CamelContext context) {
         // Unget the OSGi service
-        ServiceReference sr = serviceReferenceQueue.poll();
+        ServiceReference<?> sr = serviceReferenceQueue.poll();
         while (sr != null) {
             bundleContext.ungetService(sr);
             sr = serviceReferenceQueue.poll();

Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java?rev=1435006&r1=1435005&r2=1435006&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java (original)
+++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java Fri Jan 18 01:57:33 2013
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.core.osgi;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import com.sun.org.apache.xml.internal.security.encryption.Reference;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.component.file.FileComponent;
@@ -26,8 +30,10 @@ import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LanguageResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.springframework.osgi.mock.MockBundleContext;
+import org.springframework.osgi.mock.MockServiceReference;
 
 public class CamelMockBundleContext extends MockBundleContext {
 
@@ -61,5 +67,14 @@ public class CamelMockBundleContext exte
             return null;
         }    
     }
-
+   
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        MockServiceReference reference = new MockServiceReference(getBundle(), new String[] {clazz});
+        // setup the name property with the class name
+        Dictionary properties = new Hashtable();
+        properties.put("name", clazz);
+        reference.setProperties(properties);
+        return new ServiceReference[] {reference};
+    }
 }

Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java?rev=1435006&r1=1435005&r2=1435006&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java (original)
+++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java Fri Jan 18 01:57:33 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.core.osgi;
 
+import java.util.Map;
+
 import org.apache.camel.core.osgi.test.MyService;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.junit.Test;
@@ -32,9 +34,11 @@ public class ServiceRegistryTest extends
 
         Object service = context.getRegistry().lookup(MyService.class.getName());
         assertNotNull("MyService should not be null", service);
+        assertTrue("It should be the instance of MyService ", service instanceof MyService);
 
-        service = context.getRegistry().lookupByType(MyService.class);
-        assertNotNull("MyService should not be null", service);
+        Map<String, MyService> collection = context.getRegistry().lookupByType(MyService.class);
+        assertNotNull("MyService should not be null", collection);
+        assertNotNull("There should have one MyService.", collection.get(MyService.class.getName()));
         context.stop();
     }
 



Re: svn commit: r1435006 - in /camel/trunk/components/camel-core-osgi/src: main/java/org/apache/camel/core/osgi/ test/java/org/apache/camel/core/osgi/

Posted by Willem jiang <wi...@gmail.com>.
Hi Claus,

I'm my bad, I should not import the class, and it is useless.
I will commit a quick fix for it shortly.

Thanks for pointing that out.  

--  
Willem Jiang

Red Hat, Inc.
FuseSource is now part of Red Hat
Web: http://www.fusesource.com | http://www.redhat.com
Blog: http://willemjiang.blogspot.com (http://willemjiang.blogspot.com/) (English)
          http://jnn.iteye.com (http://jnn.javaeye.com/) (Chinese)
Twitter: willemjiang  
Weibo: 姜宁willem





On Friday, January 18, 2013 at 3:03 PM, Claus Ibsen wrote:

> On Fri, Jan 18, 2013 at 2:57 AM, <ningjiang@apache.org (mailto:ningjiang@apache.org)> wrote:
> > Author: ningjiang
> > Date: Fri Jan 18 01:57:33 2013
> > New Revision: 1435006
> >  
> > URL: http://svn.apache.org/viewvc?rev=1435006&view=rev
> > Log:
> > CAMEL-5969, CAMEL-5972 added the OsgiiServiceRegistry.lookupByType() and supports to lookup service with filter on name=blabla
> >  
> > Modified:
> > camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.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/ServiceRegistryTest.java
> >  
> > Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
> > URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> > ==============================================================================
> > --- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java (original)
> > +++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java Fri Jan 18 01:57:33 2013
> > @@ -17,6 +17,7 @@
> > package org.apache.camel.core.osgi;
> >  
> > import java.util.Collections;
> > +import java.util.HashMap;
> > import java.util.Map;
> > import java.util.Queue;
> > import java.util.concurrent.ConcurrentHashMap;
> > @@ -25,6 +26,7 @@ import java.util.concurrent.ConcurrentLi
> > import org.apache.camel.CamelContext;
> > import org.apache.camel.spi.Registry;
> > import org.apache.camel.support.LifecycleStrategySupport;
> > +import org.apache.camel.util.ObjectHelper;
> > import org.osgi.framework.BundleContext;
> > import org.osgi.framework.ServiceReference;
> >  
> > @@ -34,21 +36,46 @@ import org.osgi.framework.ServiceReferen
> > public class OsgiServiceRegistry extends LifecycleStrategySupport implements Registry {
> > private final BundleContext bundleContext;
> > private final Map<String, Object> serviceCacheMap = new ConcurrentHashMap<String, Object>();
> > - private final Queue<ServiceReference> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference>();
> > + private final Map<Class<?>, Map<String, Object>> typeCacheMap = new ConcurrentHashMap<Class<?>, Map<String, Object>>();
> > + private final Queue<ServiceReference<?>> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference<?>>();
> >  
> > public OsgiServiceRegistry(BundleContext bc) {
> > bundleContext = bc;
> > }
> >  
> > + /**
> > + * Support to lookup the Object with filter with the (name=NAME) and class type
> > + *
> > + */
> > public <T> T lookup(String name, Class<T> type) {
> > - Object service = lookup(name);
> > + Object service = serviceCacheMap.get(name);
> > + if (service == null) {
> > + ServiceReference<?> sr = null;
> > + try {
> > + ServiceReference<?>[] refs = bundleContext.getServiceReferences(type.getName(), "(name=" + name + ")");
> > + if (refs != null && refs.length > 0) {
> > + // just return the first one
> > + sr = refs[0];
> > + }
> > + serviceReferenceQueue.add(sr);
> > + service = bundleContext.getService(sr);
> > + if (service != null) {
> > + serviceCacheMap.put(name, service);
> > + }
> > + } catch (Exception ex) {
> > + throw ObjectHelper.wrapRuntimeCamelException(ex);
> > + }
> > + }
> > return type.cast(service);
> > }
> >  
> > + /**
> > + * It's only support to look up the ServiceReference with Class name
> > + */
> > public Object lookup(String name) {
> > Object service = serviceCacheMap.get(name);
> > if (service == null) {
> > - ServiceReference sr = bundleContext.getServiceReference(name);
> > + ServiceReference<?> sr = bundleContext.getServiceReference(name);
> > if (sr != null) {
> > // Need to keep the track of Service
> > // and call ungetService when the camel context is closed
> > @@ -63,14 +90,31 @@ public class OsgiServiceRegistry extends
> > }
> >  
> > public <T> Map<String, T> lookupByType(Class<T> type) {
> > - // not implemented so we return an empty map
> > - return Collections.<String, T>emptyMap();
> > + Map<String, T> result = new HashMap<String, T>();
> > + try {
> > + ServiceReference<?>[] refs = bundleContext.getAllServiceReferences(type.getName(), null);
> > + if (refs != null) {
> > + for (ServiceReference<?> sr : refs) {
> > + serviceReferenceQueue.add(sr);
> > + Object service = bundleContext.getService(sr);
> > + if (service != null) {
> > + String name = (String)sr.getProperty("name");
> > + if (name != null) {
> > + result.put(name , type.cast(service));
> > + }
> > + }
> > + }
> > + }
> > + } catch (Exception ex) {
> > + throw ObjectHelper.wrapRuntimeCamelException(ex);
> > + }
> > + return result;
> > }
> >  
> > @Override
> > public void onContextStop(CamelContext context) {
> > // Unget the OSGi service
> > - ServiceReference sr = serviceReferenceQueue.poll();
> > + ServiceReference<?> sr = serviceReferenceQueue.poll();
> > while (sr != null) {
> > bundleContext.ungetService(sr);
> > sr = serviceReferenceQueue.poll();
> >  
> > Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
> > URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> > ==============================================================================
> > --- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java (original)
> > +++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java Fri Jan 18 01:57:33 2013
> > @@ -16,6 +16,10 @@
> > */
> > package org.apache.camel.core.osgi;
> >  
> > +import java.util.Dictionary;
> > +import java.util.Hashtable;
> > +
> > +import com.sun.org.apache.xml.internal.security.encryption.Reference;
>  
>  
>  
> This is a mistake it should not be this internal Reference class from
> SUN that should be imported.
> This causes the CI server to fail building the code.
>  
>  
>  
>  
> > import org.apache.camel.CamelContext;
> > import org.apache.camel.Component;
> > import org.apache.camel.component.file.FileComponent;
> > @@ -26,8 +30,10 @@ import org.apache.camel.spi.Language;
> > import org.apache.camel.spi.LanguageResolver;
> > import org.osgi.framework.Bundle;
> > import org.osgi.framework.Constants;
> > +import org.osgi.framework.InvalidSyntaxException;
> > import org.osgi.framework.ServiceReference;
> > import org.springframework.osgi.mock.MockBundleContext;
> > +import org.springframework.osgi.mock.MockServiceReference;
> >  
> > public class CamelMockBundleContext extends MockBundleContext {
> >  
> > @@ -61,5 +67,14 @@ public class CamelMockBundleContext exte
> > return null;
> > }
> > }
> > -
> > +
> > + @SuppressWarnings({"rawtypes", "unchecked"})
> > + public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
> > + MockServiceReference reference = new MockServiceReference(getBundle(), new String[] {clazz});
> > + // setup the name property with the class name
> > + Dictionary properties = new Hashtable();
> > + properties.put("name", clazz);
> > + reference.setProperties(properties);
> > + return new ServiceReference[] {reference};
> > + }
> > }
> >  
> > Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
> > URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> > ==============================================================================
> > --- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java (original)
> > +++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java Fri Jan 18 01:57:33 2013
> > @@ -16,6 +16,8 @@
> > */
> > package org.apache.camel.core.osgi;
> >  
> > +import java.util.Map;
> > +
> > import org.apache.camel.core.osgi.test.MyService;
> > import org.apache.camel.impl.DefaultCamelContext;
> > import org.junit.Test;
> > @@ -32,9 +34,11 @@ public class ServiceRegistryTest extends
> >  
> > Object service = context.getRegistry().lookup(MyService.class.getName());
> > assertNotNull("MyService should not be null", service);
> > + assertTrue("It should be the instance of MyService ", service instanceof MyService);
> >  
> > - service = context.getRegistry().lookupByType(MyService.class);
> > - assertNotNull("MyService should not be null", service);
> > + Map<String, MyService> collection = context.getRegistry().lookupByType(MyService.class);
> > + assertNotNull("MyService should not be null", collection);
> > + assertNotNull("There should have one MyService.", collection.get(MyService.class.getName()));
> > context.stop();
> > }
>  
>  
>  
>  
>  
> --  
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> FuseSource is now part of Red Hat
> Email: cibsen@redhat.com (mailto:cibsen@redhat.com)
> Web: http://fusesource.com
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen




Re: svn commit: r1435006 - in /camel/trunk/components/camel-core-osgi/src: main/java/org/apache/camel/core/osgi/ test/java/org/apache/camel/core/osgi/

Posted by Claus Ibsen <cl...@gmail.com>.
On Fri, Jan 18, 2013 at 2:57 AM,  <ni...@apache.org> wrote:
> Author: ningjiang
> Date: Fri Jan 18 01:57:33 2013
> New Revision: 1435006
>
> URL: http://svn.apache.org/viewvc?rev=1435006&view=rev
> Log:
> CAMEL-5969, CAMEL-5972 added the OsgiiServiceRegistry.lookupByType() and supports to lookup service with filter on name=blabla
>
> Modified:
>     camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.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/ServiceRegistryTest.java
>
> Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java
> URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> ==============================================================================
> --- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java (original)
> +++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiServiceRegistry.java Fri Jan 18 01:57:33 2013
> @@ -17,6 +17,7 @@
>  package org.apache.camel.core.osgi;
>
>  import java.util.Collections;
> +import java.util.HashMap;
>  import java.util.Map;
>  import java.util.Queue;
>  import java.util.concurrent.ConcurrentHashMap;
> @@ -25,6 +26,7 @@ import java.util.concurrent.ConcurrentLi
>  import org.apache.camel.CamelContext;
>  import org.apache.camel.spi.Registry;
>  import org.apache.camel.support.LifecycleStrategySupport;
> +import org.apache.camel.util.ObjectHelper;
>  import org.osgi.framework.BundleContext;
>  import org.osgi.framework.ServiceReference;
>
> @@ -34,21 +36,46 @@ import org.osgi.framework.ServiceReferen
>  public class OsgiServiceRegistry extends LifecycleStrategySupport implements Registry {
>      private final BundleContext bundleContext;
>      private final Map<String, Object> serviceCacheMap = new ConcurrentHashMap<String, Object>();
> -    private final Queue<ServiceReference> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference>();
> +    private final Map<Class<?>, Map<String, Object>> typeCacheMap = new ConcurrentHashMap<Class<?>, Map<String, Object>>();
> +    private final Queue<ServiceReference<?>> serviceReferenceQueue = new ConcurrentLinkedQueue<ServiceReference<?>>();
>
>      public OsgiServiceRegistry(BundleContext bc) {
>          bundleContext = bc;
>      }
>
> +    /**
> +     * Support to lookup the Object with filter with the (name=NAME) and class type
> +     *
> +     */
>      public <T> T lookup(String name, Class<T> type) {
> -        Object service = lookup(name);
> +        Object service = serviceCacheMap.get(name);
> +        if (service == null) {
> +            ServiceReference<?> sr  = null;
> +            try {
> +                ServiceReference<?>[] refs = bundleContext.getServiceReferences(type.getName(), "(name=" + name + ")");
> +                if (refs != null && refs.length > 0) {
> +                    // just return the first one
> +                    sr = refs[0];
> +                }
> +                serviceReferenceQueue.add(sr);
> +                service = bundleContext.getService(sr);
> +                if (service != null) {
> +                    serviceCacheMap.put(name, service);
> +                }
> +            } catch (Exception ex) {
> +                throw ObjectHelper.wrapRuntimeCamelException(ex);
> +            }
> +        }
>          return type.cast(service);
>      }
>
> +    /**
> +     * It's only support to look up the ServiceReference with Class name
> +     */
>      public Object lookup(String name) {
>          Object service = serviceCacheMap.get(name);
>          if (service == null) {
> -            ServiceReference sr = bundleContext.getServiceReference(name);
> +            ServiceReference<?> sr = bundleContext.getServiceReference(name);
>              if (sr != null) {
>                  // Need to keep the track of Service
>                  // and call ungetService when the camel context is closed
> @@ -63,14 +90,31 @@ public class OsgiServiceRegistry extends
>      }
>
>      public <T> Map<String, T> lookupByType(Class<T> type) {
> -        // not implemented so we return an empty map
> -        return Collections.<String, T>emptyMap();
> +        Map<String, T> result = new HashMap<String, T>();
> +        try {
> +            ServiceReference<?>[] refs = bundleContext.getAllServiceReferences(type.getName(), null);
> +            if (refs != null) {
> +                for (ServiceReference<?> sr : refs) {
> +                    serviceReferenceQueue.add(sr);
> +                    Object service = bundleContext.getService(sr);
> +                    if (service != null) {
> +                        String name = (String)sr.getProperty("name");
> +                        if (name != null) {
> +                            result.put(name , type.cast(service));
> +                        }
> +                    }
> +                }
> +            }
> +        } catch (Exception ex) {
> +            throw ObjectHelper.wrapRuntimeCamelException(ex);
> +        }
> +        return result;
>      }
>
>      @Override
>      public void onContextStop(CamelContext context) {
>          // Unget the OSGi service
> -        ServiceReference sr = serviceReferenceQueue.poll();
> +        ServiceReference<?> sr = serviceReferenceQueue.poll();
>          while (sr != null) {
>              bundleContext.ungetService(sr);
>              sr = serviceReferenceQueue.poll();
>
> Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
> URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> ==============================================================================
> --- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java (original)
> +++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java Fri Jan 18 01:57:33 2013
> @@ -16,6 +16,10 @@
>   */
>  package org.apache.camel.core.osgi;
>
> +import java.util.Dictionary;
> +import java.util.Hashtable;
> +
> +import com.sun.org.apache.xml.internal.security.encryption.Reference;

This is a mistake it should not be this internal Reference class from
SUN that should be imported.
This causes the CI server to fail building the code.




>  import org.apache.camel.CamelContext;
>  import org.apache.camel.Component;
>  import org.apache.camel.component.file.FileComponent;
> @@ -26,8 +30,10 @@ import org.apache.camel.spi.Language;
>  import org.apache.camel.spi.LanguageResolver;
>  import org.osgi.framework.Bundle;
>  import org.osgi.framework.Constants;
> +import org.osgi.framework.InvalidSyntaxException;
>  import org.osgi.framework.ServiceReference;
>  import org.springframework.osgi.mock.MockBundleContext;
> +import org.springframework.osgi.mock.MockServiceReference;
>
>  public class CamelMockBundleContext extends MockBundleContext {
>
> @@ -61,5 +67,14 @@ public class CamelMockBundleContext exte
>              return null;
>          }
>      }
> -
> +
> +    @SuppressWarnings({"rawtypes", "unchecked"})
> +    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
> +        MockServiceReference reference = new MockServiceReference(getBundle(), new String[] {clazz});
> +        // setup the name property with the class name
> +        Dictionary properties = new Hashtable();
> +        properties.put("name", clazz);
> +        reference.setProperties(properties);
> +        return new ServiceReference[] {reference};
> +    }
>  }
>
> Modified: camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
> URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java?rev=1435006&r1=1435005&r2=1435006&view=diff
> ==============================================================================
> --- camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java (original)
> +++ camel/trunk/components/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java Fri Jan 18 01:57:33 2013
> @@ -16,6 +16,8 @@
>   */
>  package org.apache.camel.core.osgi;
>
> +import java.util.Map;
> +
>  import org.apache.camel.core.osgi.test.MyService;
>  import org.apache.camel.impl.DefaultCamelContext;
>  import org.junit.Test;
> @@ -32,9 +34,11 @@ public class ServiceRegistryTest extends
>
>          Object service = context.getRegistry().lookup(MyService.class.getName());
>          assertNotNull("MyService should not be null", service);
> +        assertTrue("It should be the instance of MyService ", service instanceof MyService);
>
> -        service = context.getRegistry().lookupByType(MyService.class);
> -        assertNotNull("MyService should not be null", service);
> +        Map<String, MyService> collection = context.getRegistry().lookupByType(MyService.class);
> +        assertNotNull("MyService should not be null", collection);
> +        assertNotNull("There should have one MyService.", collection.get(MyService.class.getName()));
>          context.stop();
>      }
>
>
>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
FuseSource is now part of Red Hat
Email: cibsen@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen