FELIX-3875 fix for services bound/unbound on configuration change
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1439756 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index 190d03d..b405c50 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -1765,7 +1765,8 @@
final ServiceTracker<T, RefPair<T>> oldTracker = trackerRef.get();
Customizer<T> customizer = newCustomizer();
customizer.setPreviousRefMap( refMap );
- ServiceTracker<T, RefPair<T>> tracker = new ServiceTracker<T, RefPair<T>>( m_componentManager.getActivator().getBundleContext(), m_targetFilter, customizer );
+ boolean initialActive = oldTracker != null && oldTracker.isActive();
+ ServiceTracker<T, RefPair<T>> tracker = new ServiceTracker<T, RefPair<T>>( m_componentManager.getActivator().getBundleContext(), m_targetFilter, customizer, initialActive );
customizer.setTracker( tracker );
trackerRef.set( tracker );
registered = true;
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
index f31a938..d32ce39 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java
@@ -232,15 +232,17 @@
* is null, then this {@code ServiceTracker} will be used as the
* {@code ServiceTrackerCustomizer} and this {@code ServiceTracker}
* will call the {@code ServiceTrackerCustomizer} methods on itself.
+ * @param initialActive Initial active state of the tracker.
* @since 1.1
*/
- public ServiceTracker(final BundleContext context, final Filter filter, final ServiceTrackerCustomizer<S, T> customizer) {
+ public ServiceTracker(final BundleContext context, final Filter filter, final ServiceTrackerCustomizer<S, T> customizer, boolean initialActive) {
this.context = context;
this.trackReference = null;
this.trackClass = null;
this.listenerFilter = filter.toString();
this.filter = filter;
this.customizer = customizer;
+ this.active = initialActive;
if ((context == null) || (filter == null)) {
/*
* we throw a NPE here to be consistent with the other constructors
@@ -424,7 +426,6 @@
if (outgoing == null) {
return;
}
- tracked = null;
if (DEBUG) {
System.out.println("ServiceTracker.close: " + filter);
}
@@ -432,6 +433,7 @@
for (ServiceReference<S> ref: toUntrack.keySet()) {
outgoing.untrack( ref, null );
}
+ tracked = null;
}
/**