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