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 2015/07/06 01:51:57 UTC

svn commit: r1689301 - in /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl: manager/DependencyManager.java metadata/ReferenceMetadata.java

Author: cziegeler
Date: Sun Jul  5 23:51:56 2015
New Revision: 1689301

URL: http://svn.apache.org/r1689301
Log:
FELIX-4949 : [DS][RFC-190] Implement prototype_required

Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.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=1689301&r1=1689300&r2=1689301&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 Sun Jul  5 23:51:56 2015
@@ -1873,11 +1873,40 @@ public class DependencyManager<S, T> imp
             }
         }
         m_target = target;
-        String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
-        if (m_target != null)
+        final boolean multipleExpr = m_target != null || m_dependencyMetadata.getScope() == ReferenceScope.prototype_required;
+        final StringBuilder filterSB = new StringBuilder();
+        if (multipleExpr )
         {
-            filterString = "(&" + filterString + m_target + ")";
+            filterSB.append("(&");
         }
+        // "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")"
+        filterSB.append('(');
+        filterSB.append(Constants.OBJECTCLASS);
+        filterSB.append('=');
+        filterSB.append(m_dependencyMetadata.getInterface());
+        filterSB.append(')');
+
+        // if reference scope is prototype_required, we simply add
+        // service.scope=prototype to the filter
+        if ( m_dependencyMetadata.getScope() == ReferenceScope.prototype_required )
+        {
+            filterSB.append('(');
+            filterSB.append(Constants.SERVICE_SCOPE);
+            filterSB.append('=');
+            filterSB.append(Constants.SCOPE_PROTOTYPE);
+            filterSB.append(')');
+        }
+
+        // append target
+        if ( m_target != null )
+        {
+            filterSB.append(m_target);
+        }
+        if (multipleExpr )
+        {
+            filterSB.append(')');
+        }
+        String filterString = filterSB.toString();
 
         final ServiceTracker<T, RefPair<S, T>> oldTracker = m_tracker;
         AtomicInteger trackingCount = new AtomicInteger();

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java?rev=1689301&r1=1689300&r2=1689301&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/metadata/ReferenceMetadata.java Sun Jul  5 23:51:56 2015
@@ -659,7 +659,7 @@ public class ReferenceMetadata
         	{
         		m_scope = ReferenceScope.valueOf(m_scopeName);
         	}
-        	catch (IllegalArgumentException e)
+        	catch (final IllegalArgumentException e)
         	{
         		throw componentMetadata.validationFailure( "reference scope must be 'bundle' or 'prototype' not " + m_scopeName);