On Fri, Jan 18, 2013 at 2:57 AM, <ningji...@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: cib...@redhat.com Web: http://fusesource.com Twitter: davsclaus Blog: http://davsclaus.com Author of Camel in Action: http://www.manning.com/ibsen