package io.fabric8.karaf.checks.internal; import io.fabric8.karaf.checks.Check; import org.apache.felix.scr.Component; import org.apache.felix.scr.ScrService; import org.osgi.framework.Bundle; import org.osgi.util.tracker.ServiceTracker; public class ScrState extends AbstractBundleChecker { private final ServiceTracker<ScrService, ScrService> tracker; public ScrState() { super(); tracker = new ServiceTracker<>(bundleContext, ScrService.class, null); tracker.open(); } @Override protected Check checkBundle(Bundle bundle) { if (bundle.getHeaders().get("Service-Component") == null) { return null; } ScrService svc = tracker.getService(); if (svc == null) { return new Check("scr-state", "No ScrService found"); } Component[] components = svc.getComponents(bundle); if (components != null) { for (Component component : components) { int state = component.getState(); if (state != Component.STATE_ACTIVE && state != Component.STATE_REGISTERED && state != Component.STATE_FACTORY) { return new Check("scr-state", "SCR bundle " + bundle.getBundleId() + " is in state " + getState(state)); } } } return null; } private String getState(int state) { switch (state) { case (Component.STATE_DISABLED): return "disabled"; case (Component.STATE_ENABLING): return "enabling"; case (Component.STATE_ENABLED): return "enabled"; case (Component.STATE_UNSATISFIED): return "unsatisfied"; case (Component.STATE_ACTIVATING): return "activating"; case (Component.STATE_ACTIVE): return "active"; case (Component.STATE_REGISTERED): return "registered"; case (Component.STATE_FACTORY): return "factory"; case (Component.STATE_DEACTIVATING): return "deactivating"; case (Component.STATE_DISABLING): return "disabling"; case (Component.STATE_DISPOSING): return "disposing"; case (Component.STATE_DISPOSED): return "disposed"; default: return "unknown: " + state; } } }