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 03:31:40 UTC

svn commit: r1689302 - in /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl: helper/ComponentServiceObjectsHelper.java manager/ComponentContextImpl.java manager/MultiplePrototypeRefPair.java manager/RefPair.java manager/SinglePrototypeRefPair.java

Author: cziegeler
Date: Mon Jul  6 01:31:39 2015
New Revision: 1689302

URL: http://svn.apache.org/r1689302
Log:
FELIX-4950 : [DS][RFC-190] Within a component instance for each reference to the same service the same object needs to be injected

Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentServiceObjectsHelper.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/MultiplePrototypeRefPair.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SinglePrototypeRefPair.java

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentServiceObjectsHelper.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentServiceObjectsHelper.java?rev=1689302&r1=1689301&r2=1689302&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentServiceObjectsHelper.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentServiceObjectsHelper.java Mon Jul  6 01:31:39 2015
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceObjects;
@@ -31,7 +33,8 @@ import org.osgi.service.component.Compon
 
 
 /**
- * Utility methods for class handling used by method and field references.
+ * Utility class for handling references using a ComponentServiceObjects
+ * to get services.
  */
 public class ComponentServiceObjectsHelper
 {
@@ -41,6 +44,8 @@ public class ComponentServiceObjectsHelp
 
     private final Map<ServiceObjects, List<Object>> services = new HashMap<ServiceObjects, List<Object>>();
 
+    private final ConcurrentMap<ServiceReference, Object> prototypeInstances = new ConcurrentHashMap<ServiceReference, Object>();
+
     public ComponentServiceObjectsHelper(final BundleContext bundleContext)
     {
         this.bundleContext = bundleContext;
@@ -60,6 +65,7 @@ public class ComponentServiceObjectsHelp
             services.clear();
             serviceObjectsMap.clear();
         }
+        prototypeInstances.clear();
     }
 
     public ComponentServiceObjects getServiceObjects(final ServiceReference<?> ref)
@@ -87,9 +93,11 @@ public class ComponentServiceObjectsHelp
                 final ServiceObjects serviceObjects = so;
                 final List<Object> serviceList = services;
 
-                return new ComponentServiceObjects() {
+                return new ComponentServiceObjects() 
+                {
 
-                    public Object getService() {
+                    public Object getService() 
+                    {
                         final Object service = serviceObjects.getService();
                         if ( service != null )
                         {
@@ -101,7 +109,8 @@ public class ComponentServiceObjectsHelp
                         return service;
                     }
 
-                    public void ungetService(final Object service) {
+                    public void ungetService(final Object service) 
+                    {
                         boolean remove;
                         synchronized ( serviceList )
                         {
@@ -112,7 +121,8 @@ public class ComponentServiceObjectsHelp
                         }
                     }
 
-                    public ServiceReference<?> getServiceReference() {
+                    public ServiceReference<?> getServiceReference() 
+                    {
                         return ref;
                     }
                 };
@@ -120,4 +130,23 @@ public class ComponentServiceObjectsHelp
         }
         return null;
     }
-}
+
+    
+    public <T> T getPrototypeRefInstance(final ServiceReference<T> ref, ServiceObjects<T> serviceObjects) 
+    {
+    	T service = (T) prototypeInstances.get(ref);
+    	if ( service == null )
+    	{
+    		service = serviceObjects.getService();
+    		T oldService = (T)prototypeInstances.putIfAbsent(ref, service);
+    		if ( oldService != null )
+    		{
+    			// another thread created the instance already
+    			serviceObjects.ungetService(service);
+    			service = oldService;
+    		}
+    	}
+    	return service;
+    }
+   
+ }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java?rev=1689302&r1=1689301&r2=1689302&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentContextImpl.java Mon Jul  6 01:31:39 2015
@@ -20,6 +20,8 @@ package org.apache.felix.scr.impl.manage
 
 
 import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -29,6 +31,7 @@ import org.apache.felix.scr.impl.helper.
 import org.apache.felix.scr.impl.helper.ReadOnlyDictionary;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentInstance;
 import org.osgi.service.log.LogService;
@@ -44,11 +47,11 @@ public class ComponentContextImpl<S> imp
 
     private final EdgeInfo[] edgeInfos;
 
-    private final ComponentInstance m_componentInstance = new ComponentInstanceImpl(this);
+    private final ComponentInstance m_componentInstance = new ComponentInstanceImpl<S>(this);
 
     private final Bundle m_usingBundle;
 
-    private S m_implementationObject;
+    private volatile S m_implementationObject;
 
     private volatile boolean m_implementationAccessible;
 
@@ -56,7 +59,7 @@ public class ComponentContextImpl<S> imp
 
     private final ComponentServiceObjectsHelper serviceObjectsHelper;
 
-    public ComponentContextImpl( SingleComponentManager<S> componentManager, Bundle usingBundle )
+    public ComponentContextImpl( final SingleComponentManager<S> componentManager, final Bundle usingBundle )
     {
         m_componentManager = componentManager;
         m_usingBundle = usingBundle;
@@ -73,7 +76,7 @@ public class ComponentContextImpl<S> imp
         this.serviceObjectsHelper.cleanup();
     }
 
-    public Object getComponentServiceObjectsHelper()
+    public ComponentServiceObjectsHelper getComponentServiceObjectsHelper()
     {
         return this.serviceObjectsHelper;
     }
@@ -99,7 +102,7 @@ public class ComponentContextImpl<S> imp
         return edgeInfos[index];
     }
 
-    protected SingleComponentManager<S> getComponentManager()
+   protected SingleComponentManager<S> getComponentManager()
     {
         return m_componentManager;
     }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/MultiplePrototypeRefPair.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/MultiplePrototypeRefPair.java?rev=1689302&r1=1689301&r2=1689302&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/MultiplePrototypeRefPair.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/MultiplePrototypeRefPair.java Mon Jul  6 01:31:39 2015
@@ -44,13 +44,11 @@ public class MultiplePrototypeRefPair<S,
     }
 
     @Override
-    public Object getServiceObjects()
+    public ServiceObjects<T> getServiceObjects()
     {
         return serviceObjects;
     }
 
-
-
     @Override
     public T getServiceObject(ComponentContextImpl<S> key)
     {
@@ -79,7 +77,7 @@ public class MultiplePrototypeRefPair<S,
     public boolean getServiceObject(ComponentContextImpl<S> key, BundleContext context,
         SimpleLogger logger)
     {
-        T service = serviceObjects.getService();
+    	final T service = key.getComponentServiceObjectsHelper().getPrototypeRefInstance(this.getRef(), serviceObjects);
         if ( service == null )
         {
             setFailed();
@@ -95,6 +93,4 @@ public class MultiplePrototypeRefPair<S,
         }
         return true;
     }
-
-
 }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java?rev=1689302&r1=1689301&r2=1689302&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java Mon Jul  6 01:31:39 2015
@@ -22,10 +22,11 @@ package org.apache.felix.scr.impl.manage
 
 import org.apache.felix.scr.impl.helper.SimpleLogger;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 
 /**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
  */
 public abstract class RefPair<S, T>
 {
@@ -44,7 +45,7 @@ public abstract class RefPair<S, T>
         return ref;
     }
 
-    public Object getServiceObjects()
+    public ServiceObjects<T> getServiceObjects()
     {
         return null;
     }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SinglePrototypeRefPair.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SinglePrototypeRefPair.java?rev=1689302&r1=1689301&r2=1689302&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SinglePrototypeRefPair.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SinglePrototypeRefPair.java Mon Jul  6 01:31:39 2015
@@ -40,7 +40,7 @@ public class SinglePrototypeRefPair<S, T
     }
 
     @Override
-    public Object getServiceObjects()
+    public ServiceObjects<T> getServiceObjects()
     {
         return serviceObjects;
     }
@@ -55,7 +55,7 @@ public class SinglePrototypeRefPair<S, T
     public boolean getServiceObject(ComponentContextImpl<S> key, BundleContext context,
         SimpleLogger logger)
     {
-        T service = serviceObjects.getService();
+    	final T service = key.getComponentServiceObjectsHelper().getPrototypeRefInstance(this.getRef(), serviceObjects);
         if ( service == null )
         {
             setFailed();