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 2017/03/16 15:04:43 UTC

svn commit: r1787202 - in /felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl: inject/field/FieldHandler.java manager/ComponentContextImpl.java

Author: cziegeler
Date: Thu Mar 16 15:04:43 2017
New Revision: 1787202

URL: http://svn.apache.org/viewvc?rev=1787202&view=rev
Log:
FELIX-5572 : Reference target filter fails when using field strategy for multiple cardinality reference with multiple component instances

Modified:
    felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
    felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java

Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java?rev=1787202&r1=1787201&r2=1787202&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java Thu Mar 16 15:04:43 2017
@@ -24,10 +24,7 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 
@@ -65,18 +62,6 @@ public class FieldHandler
     /** State handling. */
     private volatile State state;
 
-    /** Mapping of ref pairs to value bound */
-    private final Map<RefPair<?, ?>, Object> boundValues = new TreeMap<RefPair<?,?>, Object>(
-        new Comparator<RefPair<?, ?>>()
-        {
-
-            @Override
-            public int compare(final RefPair<?, ?> o1, final RefPair<?, ?> o2)
-            {
-                return o1.getRef().compareTo(o2.getRef());
-            }
-        });
-
     /**
      * Create a new field handler
      * @param fieldName name of the field
@@ -171,10 +156,10 @@ public class FieldHandler
         return true;
     }
 
-    private Collection<Object> getReplaceCollection()
+    private Collection<Object> getReplaceCollection(final BindParameters bp)
     {
         final List<Object> objects = new ArrayList<Object>();
-        for(final Object val : this.boundValues.values())
+        for(final Object val : bp.getComponentContext().getBoundValues(metadata.getName()).values())
         {
             objects.add(val);
         }
@@ -200,12 +185,12 @@ public class FieldHandler
                 if ( this.metadata.isOptional() && !this.metadata.isStatic() )
                 {
                     // we only reset if it was previously set with this value
-                    if ( this.boundValues.size() == 1 )
+                    if ( bp.getComponentContext().getBoundValues(metadata.getName()).size() == 1 )
                     {
                         this.setFieldValue(componentInstance, null);
                     }
                 }
-                this.boundValues.remove(refPair);
+                bp.getComponentContext().getBoundValues(metadata.getName()).remove(refPair);
             }
             // updated needs only be done, if the value type is map or tuple
             // If it's a dynamic reference, the value can be updated
@@ -221,7 +206,7 @@ public class FieldHandler
                     final Object obj = ValueUtils.getValue(componentInstance.getClass().getName(),
                             valueType, field.getType(), key, refPair);
                     this.setFieldValue(componentInstance, obj);
-                    this.boundValues.put(refPair, obj);
+                    bp.getComponentContext().getBoundValues(metadata.getName()).put(refPair, obj);
             	}
             }
             // bind needs always be done
@@ -230,7 +215,7 @@ public class FieldHandler
                 final Object obj = ValueUtils.getValue(componentInstance.getClass().getName(),
                         valueType, field.getType(), key, refPair);
                 this.setFieldValue(componentInstance, obj);
-                this.boundValues.put(refPair, obj);
+                bp.getComponentContext().getBoundValues(metadata.getName()).put(refPair, obj);
             }
         }
         else
@@ -242,10 +227,10 @@ public class FieldHandler
             {
                 final Object obj = ValueUtils.getValue(componentInstance.getClass().getName(),
                         valueType, field.getType(), key, refPair);
-                this.boundValues.put(refPair, obj);
+                bp.getComponentContext().getBoundValues(metadata.getName()).put(refPair, obj);
                 if ( metadata.isReplace() )
                 {
-                    this.setFieldValue(componentInstance, getReplaceCollection());
+                    this.setFieldValue(componentInstance, getReplaceCollection(bp));
                 }
                 else
                 {
@@ -259,10 +244,10 @@ public class FieldHandler
             {
                 if ( !metadata.isStatic() )
                 {
-                    final Object obj = this.boundValues.remove(refPair);
+                    final Object obj = bp.getComponentContext().getBoundValues(metadata.getName()).remove(refPair);
                     if ( metadata.isReplace() )
                     {
-                        this.setFieldValue(componentInstance, getReplaceCollection());
+                        this.setFieldValue(componentInstance, getReplaceCollection(bp));
                     }
                     else
                     {
@@ -281,11 +266,11 @@ public class FieldHandler
                     {
 	                    final Object obj = ValueUtils.getValue(componentInstance.getClass().getName(),
 	                            valueType, field.getType(), key, refPair);
-	                    final Object oldObj = this.boundValues.put(refPair, obj);
+	                    final Object oldObj = bp.getComponentContext().getBoundValues(metadata.getName()).put(refPair, obj);
 
 	                    if ( metadata.isReplace() )
 	                    {
-	                        this.setFieldValue(componentInstance, getReplaceCollection());
+	                        this.setFieldValue(componentInstance, getReplaceCollection(bp));
 	                    }
 	                    else
 	                    {

Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java?rev=1787202&r1=1787201&r2=1787202&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java Thu Mar 16 15:04:43 2017
@@ -19,7 +19,11 @@
 package org.apache.felix.scr.impl.manager;
 
 
+import java.util.Comparator;
 import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -60,6 +64,11 @@ public class ComponentContextImpl<S> imp
 
     private final ComponentServiceObjectsHelper serviceObjectsHelper;
 
+    /** Mapping of ref pairs to value bound */
+    private final Map<String, Map<RefPair<?, ?>, Object>> boundValues = new HashMap<String, Map<RefPair<?,?>,Object>>();
+
+
+
     public ComponentContextImpl( final SingleComponentManager<S> componentManager, final Bundle usingBundle, ServiceRegistration<S> serviceRegistration )
     {
         m_componentManager = componentManager;
@@ -300,4 +309,28 @@ public class ComponentContextImpl<S> imp
 
     }
 
+    public Map<RefPair<?, ?>, Object> getBoundValues(final String key)
+    {
+        Map<RefPair<?, ?>, Object> map = this.boundValues.get(key);
+        if ( map == null )
+        {
+            map = createNewFieldHandlerMap();
+            this.boundValues.put(key, map);
+        }
+        return map;
+    }
+
+    private Map<RefPair<?, ?>, Object> createNewFieldHandlerMap()
+    {
+        return new TreeMap<RefPair<?,?>, Object>(
+                new Comparator<RefPair<?, ?>>()
+                {
+
+                    @Override
+                    public int compare(final RefPair<?, ?> o1, final RefPair<?, ?> o2)
+                    {
+                        return o1.getRef().compareTo(o2.getRef());
+                    }
+                });
+    }
 }