void handleServiceListenerUnreg(Collection /* <ServiceListenerEntry> */ set) { if (!isOpen() || listenerHookTracker.size() == 0) { return; } ServiceReference[] srl = listenerHookTracker.getServiceReferences(); for (int i = 0; srl != null && i < srl.length; i++) { ListenerHook lh = (ListenerHook) listenerHookTracker.getService(srl[i]); try { lh.removed(set); } catch (Exception e) { fwCtx.debug.printStackTrace( "Failed to call listener hook #" + srl[i].getProperty(Constants.SERVICE_ID), e); } } }
synchronized void open() { if (fwCtx.debug.hooks) { fwCtx.debug.println("opening hooks"); } listenerHookTracker = new ServiceTracker( fwCtx.systemBundle.bundleContext, ListenerHook.class.getName(), new ServiceTrackerCustomizer() { public Object addingService(ServiceReference reference) { ListenerHook lh = (ListenerHook) fwCtx.systemBundle.bundleContext.getService(reference); try { lh.added(getServiceCollection()); } catch (Exception e) { fwCtx.debug.printStackTrace( "Failed to call listener hook #" + reference.getProperty(Constants.SERVICE_ID), e); } return lh; } public void modifiedService(ServiceReference reference, Object service) { // noop } public void removedService(ServiceReference reference, Object service) { fwCtx.systemBundle.bundleContext.ungetService(reference); } }); listenerHookTracker.open(); bOpen = true; }
synchronized void close() { listenerHookTracker.close(); listenerHookTracker = null; bOpen = false; }