You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2013/08/22 15:15:46 UTC

svn commit: r1516441 - /felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java

Author: clement
Date: Thu Aug 22 13:15:45 2013
New Revision: 1516441

URL: http://svn.apache.org/r1516441
Log:
Fix FELIX-4199 and FELIX-4200

Modified:
    felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java

Modified: felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java?rev=1516441&r1=1516440&r2=1516441&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java (original)
+++ felix/trunk/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/dependency/impl/ServiceReferenceManager.java Thu Aug 22 13:15:45 2013
@@ -77,12 +77,11 @@ public class ServiceReferenceManager imp
     private Tracker m_trackingInterceptorTracker;
     /**
      * The set of tracking interceptors.
-     * TODO this set should be ranking according to the OSGi ranking policy.
+     * TODO this set should be sorted according to the OSGi ranking policy.
      * The filter is always the last interceptor.
      */
     private LinkedList<ServiceTrackingInterceptor> m_trackingInterceptors = new
             LinkedList<ServiceTrackingInterceptor>();
-    private List<ServiceReference> serviceReferencesList;
 
     /**
      * Creates the service reference manager.
@@ -94,9 +93,11 @@ public class ServiceReferenceManager imp
     public ServiceReferenceManager(DependencyModel dep, Filter filter, Comparator<ServiceReference> comparator) {
         m_dependency = dep;
         m_filter = filter;
-        if (m_filter != null) {
-            m_trackingInterceptors.addLast(new FilterBasedServiceTrackingInterceptor(m_filter));
-        }
+        // The Filter based service tracking interceptor needs to be created every time even if the filter is null.
+        // This arises from the potential re-implementation of the match method in the dependency implementation.
+        // It must be the last interceptor as the chain ends on the filter matching. (FELIX-4199)
+        m_trackingInterceptors.addLast(new FilterBasedServiceTrackingInterceptor(m_filter));
+
         if (comparator != null) {
             m_comparator = comparator;
             m_rankingInterceptor = new ComparatorBasedServiceRankingInterceptor(comparator);
@@ -134,7 +135,9 @@ public class ServiceReferenceManager imp
                     }
 
                     public void removedService(ServiceReference reference, Object service) {
-                        if (service != null && m_trackingInterceptors.contains(service)) {
+                        if (service != null && service instanceof ServiceTrackingInterceptor &&
+                                m_trackingInterceptors.contains(service)
+                        ) {
                             removeTrackingInterceptor((ServiceTrackingInterceptor) service);
                         }
                     }
@@ -235,7 +238,7 @@ public class ServiceReferenceManager imp
             ServiceReference oldBest = getFirstService();
             // Recompute the matching services.
             m_matchingReferences.clear();
-            serviceReferencesList = m_dependency.getTracker().getServiceReferencesList();
+            final List<ServiceReference> serviceReferencesList = m_dependency.getTracker().getServiceReferencesList();
             if (serviceReferencesList != null) {
                 for (ServiceReference reference : serviceReferencesList) {
                     TransformedServiceReference ref = new TransformedServiceReferenceImpl(reference);
@@ -345,13 +348,14 @@ public class ServiceReferenceManager imp
      * This method is called when holding the write lock on the dependency.
      *
      * @param reference the reference
-     * @param <S>
+     * @param <S> the service interface
      * @return the transformed reference, null if rejected
      */
     private <S> TransformedServiceReference<S> accept(TransformedServiceReference<S> reference) {
         TransformedServiceReference<S> accumulator = reference;
         for (ServiceTrackingInterceptor interceptor : m_trackingInterceptors) {
-            TransformedServiceReference<S> accepted = interceptor.accept(m_dependency, m_dependency.getBundleContext(), reference);
+            TransformedServiceReference<S> accepted = interceptor.accept(m_dependency,
+                    m_dependency.getBundleContext(), accumulator);
             if (accepted != null) {
                 accumulator = accepted;
             } else {