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();