package org.simantics.district.route.internal; import java.util.Hashtable; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.util.tracker.ServiceTracker; import org.simantics.district.route.RouteService; import org.simantics.district.route.Router; /** * @author Tuukka Lehtonen * @since 6.09 */ public class Activator implements BundleActivator, ServiceListener { private static BundleContext context; private static Activator instance; static BundleContext getContext() { return context; } public static Activator getInstance() { return instance; } private RouteServiceImpl routeService; private ServiceRegistration routeServiceRegistration; private ServiceTracker routeServiceTracker; private ServiceTracker routerTracker; @Override public void start(BundleContext context) throws Exception { Activator.instance = this; Activator.context = context; routeService = new RouteServiceImpl(); // register the service routeServiceRegistration = context.registerService(RouteService.class.getName(), routeService, new Hashtable<>()); // create a tracker and track the service routeServiceTracker = new ServiceTracker<>(context, RouteService.class.getName(), null); routeServiceTracker.open(); // Register initially availble routers routerTracker = new ServiceTracker<>(context, Router.class.getName(), null); routerTracker.open(); Object[] routers = routerTracker.getServices(); if (routers != null) { for (Object router : routers) routeService.registerRouter((Router) router); } // have a service listener to implement the whiteboard pattern context.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + Router.class.getName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ // grab the service routeService = (RouteServiceImpl) routeServiceTracker.getService(); } @Override public void stop(BundleContext context) throws Exception { // close the service tracker routeServiceTracker.close(); routeServiceTracker = null; routeServiceRegistration.unregister(); routeService.close(); routeService = null; context = null; instance = null; } public void serviceChanged(ServiceEvent ev) { ServiceReference sr = ev.getServiceReference(); switch (ev.getType()) { case ServiceEvent.REGISTERED: routeService.registerRouter((Router) context.getService(sr)); break; case ServiceEvent.UNREGISTERING: routeService.unregisterRouter((Router) context.getService(sr)); break; } } public RouteService getRouteService() { return routeService; } }