*/
package org.opendaylight.controller.blueprint;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
-import javax.annotation.Nullable;
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.eclipse.jdt.annotation.Nullable;
+import org.gaul.modernizer_maven_annotations.SuppressModernizer;
import org.opendaylight.controller.blueprint.ext.OpendaylightNamespaceHandler;
+import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class BlueprintBundleTracker implements BundleActivator, BundleTrackerCustomizer<Bundle>, BlueprintListener,
SynchronousBundleListener {
private static final Logger LOG = LoggerFactory.getLogger(BlueprintBundleTracker.class);
- private static final String BLUEPRINT_FILE_PATH = "org/opendaylight/blueprint/";
+ private static final String ODL_CUSTOM_BLUEPRINT_FILE_PATH = "org/opendaylight/blueprint/";
+ private static final String STANDARD_BLUEPRINT_FILE_PATH = "OSGI-INF/blueprint/";
private static final String BLUEPRINT_FLE_PATTERN = "*.xml";
private static final long SYSTEM_BUNDLE_ID = 0;
public void start(final BundleContext context) {
LOG.info("Starting {}", getClass().getSimpleName());
+ // CONTROLLER-1867: force UntrustedXML initialization, so that it uses our TCCL to initialize
+ UntrustedXML.newDocumentBuilder();
+
restartService = new BlueprintContainerRestartServiceImpl();
bundleContext = context;
bundleTracker = new BundleTracker<>(context, Bundle.ACTIVE, this);
- blueprintExtenderServiceTracker = new ServiceTracker<>(context, BlueprintExtenderService.class.getName(),
+ blueprintExtenderServiceTracker = new ServiceTracker<>(context, BlueprintExtenderService.class,
new ServiceTrackerCustomizer<BlueprintExtenderService, BlueprintExtenderService>() {
@Override
public BlueprintExtenderService addingService(
});
blueprintExtenderServiceTracker.open();
- quiesceParticipantTracker = new ServiceTracker<>(context, QuiesceParticipant.class.getName(),
+ quiesceParticipantTracker = new ServiceTracker<>(context, QuiesceParticipant.class,
new ServiceTrackerCustomizer<QuiesceParticipant, QuiesceParticipant>() {
@Override
public QuiesceParticipant addingService(
quiesceParticipantTracker.open();
}
+ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "https://github.com/spotbugs/spotbugs/issues/811")
private QuiesceParticipant onQuiesceParticipantAdded(final ServiceReference<QuiesceParticipant> reference) {
quiesceParticipant = reference.getBundle().getBundleContext().getService(reference);
return quiesceParticipant;
}
+ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "https://github.com/spotbugs/spotbugs/issues/811")
private BlueprintExtenderService onBlueprintExtenderServiceAdded(
final ServiceReference<BlueprintExtenderService> reference) {
blueprintExtenderService = reference.getBundle().getBundleContext().getService(reference);
restartService.setBlueprintExtenderService(blueprintExtenderService);
- blueprintContainerRestartReg = bundleContext.registerService(
- BlueprintContainerRestartService.class.getName(), restartService, new Hashtable<>());
+ blueprintContainerRestartReg = bundleContext.registerService(BlueprintContainerRestartService.class,
+ restartService, null);
return blueprintExtenderService;
}
private void registerNamespaceHandler(final BundleContext context) {
- Dictionary<String, Object> props = new Hashtable<>();
+ Dictionary<String, Object> props = emptyDict();
props.put("osgi.service.blueprint.namespace", OpendaylightNamespaceHandler.NAMESPACE_1_0_0);
- namespaceReg = context.registerService(NamespaceHandler.class.getName(),
- new OpendaylightNamespaceHandler(), props);
+ namespaceReg = context.registerService(NamespaceHandler.class, new OpendaylightNamespaceHandler(), props);
}
private void registerBlueprintEventHandler(final BundleContext context) {
- eventHandlerReg = context.registerService(BlueprintListener.class.getName(), this, new Hashtable<>());
+ eventHandlerReg = context.registerService(BlueprintListener.class, this, null);
+ }
+
+ @SuppressModernizer
+ private static Dictionary<String, Object> emptyDict() {
+ return new Hashtable<>();
}
/**
}
if (bundle.getState() == Bundle.ACTIVE) {
- List<Object> paths = findBlueprintPaths(bundle);
+ List<Object> paths = findBlueprintPaths(bundle, ODL_CUSTOM_BLUEPRINT_FILE_PATH);
if (!paths.isEmpty()) {
LOG.info("Creating blueprint container for bundle {} with paths {}", bundle, paths);
* @param event the event to handle
*/
@Override
- public void blueprintEvent(BlueprintEvent event) {
+ public void blueprintEvent(final BlueprintEvent event) {
if (event.getType() == BlueprintEvent.CREATED) {
LOG.info("Blueprint container for bundle {} was successfully created", event.getBundle());
return;
}
}
- @SuppressWarnings({ "rawtypes", "unchecked" })
static List<Object> findBlueprintPaths(final Bundle bundle) {
- Enumeration<?> rntries = bundle.findEntries(BLUEPRINT_FILE_PATH, BLUEPRINT_FLE_PATTERN, false);
+ List<Object> paths = findBlueprintPaths(bundle, STANDARD_BLUEPRINT_FILE_PATH);
+ return !paths.isEmpty() ? paths : findBlueprintPaths(bundle, ODL_CUSTOM_BLUEPRINT_FILE_PATH);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private static List<Object> findBlueprintPaths(final Bundle bundle, final String path) {
+ Enumeration<?> rntries = bundle.findEntries(path, BLUEPRINT_FLE_PATTERN, false);
if (rntries == null) {
return Collections.emptyList();
} else {
return bundlesToDestroy;
}
- @Nullable
- private Bundle findBundleWithHighestUsedServiceId(final Collection<Bundle> containerBundles) {
+ private @Nullable Bundle findBundleWithHighestUsedServiceId(final Collection<Bundle> containerBundles) {
ServiceReference<?> highestServiceRef = null;
for (Bundle bundle : containerBundles) {
ServiceReference<?>[] references = bundle.getRegisteredServices();