import java.util.List;
import org.apache.aries.blueprint.NamespaceHandler;
import org.apache.aries.blueprint.services.BlueprintExtenderService;
+import org.apache.aries.quiesce.participant.QuiesceParticipant;
import org.apache.aries.util.AriesFrameworkUtil;
import org.opendaylight.controller.blueprint.ext.OpendaylightNamespaceHandler;
import org.opendaylight.controller.config.api.ConfigSystemService;
private static final String BLUEPRINT_FLE_PATTERN = "*.xml";
private static final long SYSTEM_BUNDLE_ID = 0;
- private ServiceTracker<BlueprintExtenderService, BlueprintExtenderService> serviceTracker;
+ private ServiceTracker<BlueprintExtenderService, BlueprintExtenderService> blueprintExtenderServiceTracker;
+ private ServiceTracker<QuiesceParticipant, QuiesceParticipant> quiesceParticipantTracker;
private BundleTracker<Bundle> bundleTracker;
private BundleContext bundleContext;
private volatile BlueprintExtenderService blueprintExtenderService;
+ private volatile QuiesceParticipant quiesceParticipant;
private volatile ServiceRegistration<?> blueprintContainerRestartReg;
private volatile BlueprintContainerRestartServiceImpl restartService;
private volatile boolean shuttingDown;
* Implemented from BundleActivator.
*/
@Override
- public void start(BundleContext context) {
+ public void start(final BundleContext context) {
LOG.info("Starting {}", getClass().getSimpleName());
+ restartService = new BlueprintContainerRestartServiceImpl();
+
bundleContext = context;
registerBlueprintEventHandler(context);
bundleTracker = new BundleTracker<>(context, Bundle.ACTIVE, this);
- serviceTracker = new ServiceTracker<>(context, BlueprintExtenderService.class.getName(),
+ blueprintExtenderServiceTracker = new ServiceTracker<>(context, BlueprintExtenderService.class.getName(),
new ServiceTrackerCustomizer<BlueprintExtenderService, BlueprintExtenderService>() {
@Override
public BlueprintExtenderService addingService(
- ServiceReference<BlueprintExtenderService> reference) {
+ final ServiceReference<BlueprintExtenderService> reference) {
blueprintExtenderService = reference.getBundle().getBundleContext().getService(reference);
bundleTracker.open();
LOG.debug("Got BlueprintExtenderService");
- restartService = new BlueprintContainerRestartServiceImpl(blueprintExtenderService);
+ restartService.setBlueprintExtenderService(blueprintExtenderService);
+
blueprintContainerRestartReg = context.registerService(
BlueprintContainerRestartService.class.getName(), restartService, new Hashtable<>());
}
@Override
- public void modifiedService(ServiceReference<BlueprintExtenderService> reference,
- BlueprintExtenderService service) {
+ public void modifiedService(final ServiceReference<BlueprintExtenderService> reference,
+ final BlueprintExtenderService service) {
}
@Override
- public void removedService(ServiceReference<BlueprintExtenderService> reference,
- BlueprintExtenderService service) {
+ public void removedService(final ServiceReference<BlueprintExtenderService> reference,
+ final BlueprintExtenderService service) {
}
});
- serviceTracker.open();
+ blueprintExtenderServiceTracker.open();
+
+ quiesceParticipantTracker = new ServiceTracker<>(context, QuiesceParticipant.class.getName(),
+ new ServiceTrackerCustomizer<QuiesceParticipant, QuiesceParticipant>() {
+ @Override
+ public QuiesceParticipant addingService(
+ final ServiceReference<QuiesceParticipant> reference) {
+ quiesceParticipant = reference.getBundle().getBundleContext().getService(reference);
+
+ LOG.debug("Got QuiesceParticipant");
+
+ restartService.setQuiesceParticipant(quiesceParticipant);
+
+ return quiesceParticipant;
+ }
+
+ @Override
+ public void modifiedService(final ServiceReference<QuiesceParticipant> reference,
+ final QuiesceParticipant service) {
+ }
+
+ @Override
+ public void removedService(final ServiceReference<QuiesceParticipant> reference,
+ final QuiesceParticipant service) {
+ }
+ });
+ quiesceParticipantTracker.open();
}
- private void registerNamespaceHandler(BundleContext context) {
+ private void registerNamespaceHandler(final BundleContext context) {
Dictionary<String, Object> props = new Hashtable<>();
props.put("osgi.service.blueprint.namespace", OpendaylightNamespaceHandler.NAMESPACE_1_0_0);
namespaceReg = context.registerService(NamespaceHandler.class.getName(),
new OpendaylightNamespaceHandler(), props);
}
- private void registerBlueprintEventHandler(BundleContext context) {
+ private void registerBlueprintEventHandler(final BundleContext context) {
Dictionary<String, Object> props = new Hashtable<>();
props.put(org.osgi.service.event.EventConstants.EVENT_TOPIC,
new String[]{EventConstants.TOPIC_CREATED, EventConstants.TOPIC_FAILURE});
* Implemented from BundleActivator.
*/
@Override
- public void stop(BundleContext context) {
+ public void stop(final BundleContext context) {
bundleTracker.close();
- serviceTracker.close();
+ blueprintExtenderServiceTracker.close();
+ quiesceParticipantTracker.close();
AriesFrameworkUtil.safeUnregisterService(eventHandlerReg);
AriesFrameworkUtil.safeUnregisterService(namespaceReg);
* Implemented from SynchronousBundleListener.
*/
@Override
- public void bundleChanged(BundleEvent event) {
+ public void bundleChanged(final BundleEvent event) {
// If the system bundle (id 0) is stopping, do an orderly shutdown of all blueprint containers. On
// shutdown the system bundle is stopped first.
if (event.getBundle().getBundleId() == SYSTEM_BUNDLE_ID && event.getType() == BundleEvent.STOPPING) {
* Implemented from BundleActivator.
*/
@Override
- public Bundle addingBundle(Bundle bundle, BundleEvent event) {
+ public Bundle addingBundle(final Bundle bundle, final BundleEvent event) {
modifiedBundle(bundle, event, bundle);
return bundle;
}
/**
- * Implemented from BundleActivator.
+ * Implemented from BundleTrackerCustomizer.
*/
@Override
- public void modifiedBundle(Bundle bundle, BundleEvent event, Bundle object) {
+ public void modifiedBundle(final Bundle bundle, final BundleEvent event, final Bundle object) {
if (shuttingDown) {
return;
}
}
/**
- * Implemented from BundleActivator.
+ * Implemented from BundleTrackerCustomizer.
*/
@Override
- public void removedBundle(Bundle bundle, BundleEvent event, Bundle object) {
+ public void removedBundle(final Bundle bundle, final BundleEvent event, final Bundle object) {
// BlueprintExtenderService will handle this.
}
* @param event the event to handle
*/
@Override
- public void handleEvent(Event event) {
+ public void handleEvent(final Event event) {
if (EventConstants.TOPIC_CREATED.equals(event.getTopic())) {
LOG.info("Blueprint container for bundle {} was successfully created",
event.getProperty(EventConstants.BUNDLE));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
- static List<Object> findBlueprintPaths(Bundle bundle) {
+ static List<Object> findBlueprintPaths(final Bundle bundle) {
Enumeration<?> rntries = bundle.findEntries(BLUEPRINT_FILE_PATH, BLUEPRINT_FLE_PATTERN, false);
if (rntries == null) {
return Collections.emptyList();
LOG.info("Shutdown of blueprint containers complete");
}
- private List<Bundle> getBundlesToDestroy(Collection<Bundle> containerBundles) {
+ private List<Bundle> getBundlesToDestroy(final Collection<Bundle> containerBundles) {
List<Bundle> bundlesToDestroy = new ArrayList<>();
// Find all container bundles that either have no registered services or whose services are no
return bundlesToDestroy;
}
- private static int getServiceUsage(ServiceReference<?> ref) {
+ private static int getServiceUsage(final ServiceReference<?> ref) {
Bundle[] usingBundles = ref.getUsingBundles();
return usingBundles != null ? usingBundles.length : 0;
}
- private <T> T getOSGiService(Class<T> serviceInterface) {
+ private <T> T getOSGiService(final Class<T> serviceInterface) {
try {
ServiceReference<T> serviceReference = bundleContext.getServiceReference(serviceInterface);
if (serviceReference == null) {
}
return service;
- } catch (IllegalStateException e) {
+ } catch (final IllegalStateException e) {
// This is thrown if the BundleContext is no longer valid which is possible on shutdown so we
// log as debug.
LOG.debug("Error obtaining OSGi service {}", serviceInterface.getSimpleName(), e);