package com.buglabs.util.osgi; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.Filter; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; /** * A ServiceTracker that calls ServiceTrackerCustomizer.removedService() for all bound services. * This allows the application to shutdown when the ServiceTracker is closed. This is _not_ standard OSGi behavior. * * This class is not intended to be used by clients * @author kgilmer * */ final class ClosingServiceTracker extends ServiceTracker { private final ServiceTrackerCustomizer customizer2; private final String[] services; public ClosingServiceTracker(BundleContext context, Filter filter, ServiceTrackerCustomizer customizer, String[] services) { super(context, filter, customizer); customizer2 = customizer; this.services = services; } /* (non-Javadoc) * @see org.osgi.util.tracker.ServiceTracker#close() */ public void close() { for (int i = 0; i < services.length; ++i) { customizer2.removedService(new SimpleServiceReference(services[i]), null); } super.close(); } /** * Stub ServiceReference implementation to pass in as notification for bundle shutdown. * @author kgilmer * */ private class SimpleServiceReference implements ServiceReference { private final String objectClass; public SimpleServiceReference(String objectClass) { this.objectClass = objectClass; } public int compareTo(Object arg0) { return 0; } public Bundle getBundle() { return null; } public Object getProperty(String arg0) { if (arg0.equals(Constants.OBJECTCLASS)) { return new String[] {objectClass}; } return null; } public String[] getPropertyKeys() { return new String[] {Constants.OBJECTCLASS}; } public Bundle[] getUsingBundles() { return null; } public boolean isAssignableTo(Bundle arg0, String arg1) { return false; } } }