You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2018/01/09 10:03:40 UTC

svn commit: r1820632 - /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java

Author: cziegeler
Date: Tue Jan  9 10:03:40 2018
New Revision: 1820632

URL: http://svn.apache.org/viewvc?rev=1820632&view=rev
Log:
FELIX-5769 : SCR should not bind prototype_required reference to bundle scope service

Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=1820632&r1=1820631&r2=1820632&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java Tue Jan  9 10:03:40 2018
@@ -2004,17 +2004,45 @@ public class DependencyManager<S, T> imp
             }
         }
         m_target = target;
+
+        // three filters are created:
+        // classFilter = filters only on the service interface
+        // eventFilter = filters only on the provided target and service scope (if prototype required)
+        // initialReferenceFilter = classFilter & eventFilter
+
+        // classFilter
+        // "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")"
+        final StringBuilder classFilterSB = new StringBuilder();
+        classFilterSB.append(OBJECTCLASS_CLAUSE);
+        classFilterSB.append(m_dependencyMetadata.getInterface());
+        classFilterSB.append(')');
+        final String classFilterString = classFilterSB.toString();
+
+        // eventFilter
+        String eventFilterString;
+        if (m_target != null
+            && m_dependencyMetadata.getScope() == ReferenceScope.prototype_required)
+        {
+            final StringBuilder sb = new StringBuilder("(&").append(PROTOTYPE_SCOPE_CLAUSE).append(m_target).append(")");
+            eventFilterString = sb.toString();
+        }
+        else if ( m_dependencyMetadata.getScope() == ReferenceScope.prototype_required )
+        {
+            eventFilterString = PROTOTYPE_SCOPE_CLAUSE;
+        }
+        else
+        {
+            eventFilterString = m_target;
+        }
+
+        // initialReferenceFilter
         final boolean multipleExpr = m_target != null
-            || m_dependencyMetadata.getScope() == ReferenceScope.prototype_required;
-        final boolean allExpr = m_target != null
-            && m_dependencyMetadata.getScope() == ReferenceScope.prototype_required;
+                || m_dependencyMetadata.getScope() == ReferenceScope.prototype_required;
         final StringBuilder initialReferenceFilterSB = new StringBuilder();
         if (multipleExpr)
         {
             initialReferenceFilterSB.append("(&");
         }
-        // "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")"
-        String classFilterString = OBJECTCLASS_CLAUSE + m_dependencyMetadata.getInterface() + ")";
         initialReferenceFilterSB.append(classFilterString);
 
         // if reference scope is prototype_required, we simply add
@@ -2034,16 +2062,6 @@ public class DependencyManager<S, T> imp
             initialReferenceFilterSB.append(')');
         }
         String initialReferenceFilterString = initialReferenceFilterSB.toString();
-        String eventFilterString;
-        if (allExpr)
-        {
-            StringBuilder sb = new StringBuilder("(&").append(PROTOTYPE_SCOPE_CLAUSE).append(m_target).append(")");
-            eventFilterString = sb.toString();
-        }
-        else
-        {
-            eventFilterString = m_target;
-        }
 
         final ServiceTracker<T, RefPair<S, T>, ExtendedServiceEvent> oldTracker = m_tracker;
         AtomicInteger trackingCount = new AtomicInteger();