2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.config.manager.impl.osgi;
10 import org.osgi.framework.Bundle;
11 import org.osgi.framework.BundleContext;
12 import org.osgi.framework.BundleEvent;
13 import org.osgi.util.tracker.BundleTracker;
14 import org.osgi.util.tracker.BundleTrackerCustomizer;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
20 * Extensible bundle tracker. Takes several BundleTrackerCustomizers and propagates bundle events to all of them.
25 public final class ExtensibleBundleTracker<T> extends BundleTracker<T> {
27 private final BundleTrackerCustomizer<T> primaryTracker;
28 private final BundleTrackerCustomizer<?>[] additionalTrackers;
30 private static final Logger logger = LoggerFactory.getLogger(ExtensibleBundleTracker.class);
32 public ExtensibleBundleTracker(BundleContext context, BundleTrackerCustomizer<T> primaryBundleTrackerCustomizer,
33 BundleTrackerCustomizer<?>... additionalBundleTrackerCustomizers) {
34 this(context, Bundle.ACTIVE, primaryBundleTrackerCustomizer, additionalBundleTrackerCustomizers);
37 public ExtensibleBundleTracker(BundleContext context, int bundleState,
38 BundleTrackerCustomizer<T> primaryBundleTrackerCustomizer,
39 BundleTrackerCustomizer<?>... additionalBundleTrackerCustomizers) {
40 super(context, bundleState, null);
41 this.primaryTracker = primaryBundleTrackerCustomizer;
42 this.additionalTrackers = additionalBundleTrackerCustomizers;
43 logger.trace("Registered as extender with context {} and bundle state {}", context, bundleState);
47 public T addingBundle(final Bundle bundle, final BundleEvent event) {
48 T primaryTrackerRetVal = primaryTracker.addingBundle(bundle, event);
50 forEachAdditionalBundle(new BundleStrategy() {
52 public void execute(BundleTrackerCustomizer<?> tracker) {
53 tracker.addingBundle(bundle, event);
57 return primaryTrackerRetVal;
61 public void modifiedBundle(final Bundle bundle, final BundleEvent event, final T object) {
62 primaryTracker.modifiedBundle(bundle, event, object);
64 forEachAdditionalBundle(new BundleStrategy() {
66 public void execute(BundleTrackerCustomizer<?> tracker) {
67 tracker.modifiedBundle(bundle, event, null);
74 public void removedBundle(final Bundle bundle, final BundleEvent event, final T object) {
75 primaryTracker.removedBundle(bundle, event, object);
77 forEachAdditionalBundle(new BundleStrategy() {
79 public void execute(BundleTrackerCustomizer<?> tracker) {
80 tracker.removedBundle(bundle, event, null);
85 private void forEachAdditionalBundle(BundleStrategy lambda) {
86 for (BundleTrackerCustomizer<?> trac : additionalTrackers) {
91 private static interface BundleStrategy {
92 void execute(BundleTrackerCustomizer<?> tracker);