void filterServiceEventReceivers( final ServiceEvent evt, final Collection /*<ServiceListenerEntry>*/ receivers) { ArrayList srl = fwCtx.services.get(EventHook.class.getName()); if (srl != null) { HashSet ctxs = new HashSet(); for (Iterator ir = receivers.iterator(); ir.hasNext(); ) { ctxs.add(((ServiceListenerEntry) ir.next()).getBundleContext()); } int start_size = ctxs.size(); RemoveOnlyCollection filtered = new RemoveOnlyCollection(ctxs); for (Iterator i = srl.iterator(); i.hasNext(); ) { ServiceReferenceImpl sr = ((ServiceRegistrationImpl) i.next()).reference; EventHook eh = (EventHook) sr.getService(fwCtx.systemBundle); if (eh != null) { try { eh.event(evt, filtered); } catch (Exception e) { fwCtx.debug.printStackTrace( "Failed to call event hook #" + sr.getProperty(Constants.SERVICE_ID), e); } } } // NYI, refactor this for speed!? if (start_size != ctxs.size()) { for (Iterator ir = receivers.iterator(); ir.hasNext(); ) { if (!ctxs.contains(((ServiceListenerEntry) ir.next()).getBundleContext())) { ir.remove(); } } } } }
void filterServiceReferences( BundleContextImpl bc, String service, String filter, boolean allServices, Collection /*<ServiceReference>*/ refs) { ArrayList srl = fwCtx.services.get(FindHook.class.getName()); if (srl != null) { RemoveOnlyCollection filtered = new RemoveOnlyCollection(refs); for (Iterator i = srl.iterator(); i.hasNext(); ) { ServiceReferenceImpl sr = ((ServiceRegistrationImpl) i.next()).reference; FindHook fh = (FindHook) sr.getService(fwCtx.systemBundle); if (fh != null) { try { fh.find(bc, service, filter, allServices, filtered); } catch (Exception e) { fwCtx.listeners.frameworkError( bc, new BundleException( "Failed to call find hook #" + sr.getProperty(Constants.SERVICE_ID), e)); } } } } }