package org.foo.dosgi.dummy; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import org.foo.dosgi.registry.Registry; import org.foo.dosgi.registry.RegistryEvent; import org.foo.dosgi.registry.RegistryListener; import org.foo.dosgi.registry.RegistryServiceReference; import org.osgi.framework.BundleContext; import org.osgi.framework.Filter; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; public class DummyRegistry implements Registry { private HashSet<RegistryListener> listeners = new HashSet<RegistryListener>(); private HashMap<ServiceReference, RegistryServiceReference> references = new HashMap<ServiceReference, RegistryServiceReference>(); private final BundleContext ctx; public DummyRegistry(BundleContext ctx) { this.ctx = ctx; } public void addListener(RegistryListener listener) { listeners.add(listener); } public void removeListener(RegistryListener listener) { listeners.remove(listener); } public void registerService(ServiceReference ref, String iface, Object svc) { RegistryServiceReferenceImpl reg = new RegistryServiceReferenceImpl( ref, iface, svc); references.put(ref, reg); notify(new RegistryEvent(this, reg, RegistryEvent.Type.ADDED)); } public void unregisterService(ServiceReference ref) { RegistryServiceReference reg = references.remove(ref); notify(new RegistryEvent(this, reg, RegistryEvent.Type.REMOVED)); } public Collection<RegistryServiceReference> findServices(String clazz, String filter) { ArrayList<RegistryServiceReference> refs = new ArrayList<RegistryServiceReference>(); try { Filter f = filter == null ? null : ctx.createFilter(filter); for ( RegistryServiceReference ref : references.values() ) { if ( clazz == null || clazz.equals( ref.getInterface() ) ) { if ( f == null || f.match( new Hashtable(ref.getProperties()) ) ) { refs.add( ref ); } } } } catch (InvalidSyntaxException e) { throw new IllegalStateException(e); } return refs; } private void notify(RegistryEvent event) { for (RegistryListener listener : listeners) { listener.handleEvent(event); } } }