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


Reply via email to