You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2013/04/02 23:50:44 UTC

svn commit: r1463769 - in /felix/trunk/scr/src: main/java/org/apache/felix/scr/impl/manager/ test/java/org/apache/felix/scr/integration/

Author: djencks
Date: Tue Apr  2 21:50:44 2013
New Revision: 1463769

URL: http://svn.apache.org/r1463769
Log:
FELIX-4011 use a final ComponentContext since it now has useful state (later made non-final again) and make ComponentInstance a separate class

Modified:
    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/ImmediateComponentManager.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ConfigurationComponentFactoryTest.java

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=1463769&r1=1463768&r2=1463769&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 Tue Apr  2 21:50:44 2013
@@ -34,12 +34,13 @@ import org.osgi.service.component.Compon
  * Implementation for the ComponentContext interface
  *
  */
-public class ComponentContextImpl implements ExtComponentContext, ComponentInstance {
+public class ComponentContextImpl implements ExtComponentContext {
 
     private final AbstractComponentManager m_componentManager;
     
     private final EdgeInfo[] edgeInfos;
-
+    
+    private volatile ComponentInstance m_componentInstance;
 
     ComponentContextImpl( AbstractComponentManager componentManager )
     {
@@ -110,7 +111,7 @@ public class ComponentContextImpl implem
 
     public ComponentInstance getComponentInstance()
     {
-        return this;
+        return m_componentInstance;
     }
 
 
@@ -132,24 +133,49 @@ public class ComponentContextImpl implem
     }
 
 
-    //---------- ComponentInstance interface ------------------------------
+    //---------- Speculative MutableProperties interface ------------------------------
 
-    public Object getInstance()
+    public void setServiceProperties(Dictionary properties)
     {
-        return getComponentManager().getInstance();
+        getComponentManager().setServiceProperties(properties );
     }
+    
+    //---------- ComponentInstance interface support ------------------------------
 
-
-    public void dispose()
+    Object getImplementationObject()
     {
-        getComponentManager().dispose();
+        return getComponentManager().getInstance();
     }
-
-    //---------- Speculative MutableProperties interface ------------------------------
-
-    public void setServiceProperties(Dictionary properties)
+    
+    void newComponentInstance()
     {
-        getComponentManager().setServiceProperties(properties );
+        m_componentInstance = new ComponentInstanceImpl(this);
     }
+    
+    void clearComponentInstance(){
+        m_componentInstance = null;
+    }
+
+    private static class ComponentInstanceImpl implements ComponentInstance
+    {
+        private final ComponentContextImpl m_componentContext;
+
+        private ComponentInstanceImpl(ComponentContextImpl m_componentContext)
+        {
+            this.m_componentContext = m_componentContext;
+        }
 
+
+        public Object getInstance()
+        {
+            return m_componentContext.getImplementationObject();
+        }
+
+
+        public void dispose()
+        {
+            m_componentContext.getComponentManager().dispose();
+        }
+
+    }
 }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java?rev=1463769&r1=1463768&r2=1463769&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java Tue Apr  2 21:50:44 2013
@@ -59,7 +59,7 @@ public class ImmediateComponentManager<S
     private final AtomicInteger m_useCount = new AtomicInteger( );
 
     // The context that will be passed to the implementationObject
-    private ComponentContextImpl m_componentContext;
+    private final ComponentContextImpl m_componentContext = new ComponentContextImpl(this);
 
     // the component holder responsible for managing this component
     private ComponentHolder m_componentHolder;
@@ -120,9 +120,7 @@ public class ImmediateComponentManager<S
         }
         if ( m_implementationObject == null )
         {
-            final ComponentContextImpl tmpContext = new ComponentContextImpl( this );
-            m_componentContext = tmpContext;
-            S tmpComponent = createImplementationObject( tmpContext, new SetImplementationObject<S>()
+            S tmpComponent = createImplementationObject( m_componentContext, new SetImplementationObject<S>()
             {
                 public void setImplementationObject( S implementationObject )
                 {
@@ -175,7 +173,6 @@ public class ImmediateComponentManager<S
             m_tmpImplementationObject = null;
             cleanupImplementationObject( implementationObject );
             log( LogService.LOG_DEBUG, "Unset and deconfigured implementation object for component {0} in deleteComponent for reason {1}", new Object[] { getName(), REASONS[ reason ] },  null );
-            m_componentContext = null;
             m_properties = null;
             m_serviceProperties = null;
         }
@@ -184,7 +181,7 @@ public class ImmediateComponentManager<S
 
     public ComponentInstance getComponentInstance()
     {
-        return m_componentContext;
+        return m_componentContext.getComponentInstance();
     }
 
 
@@ -238,7 +235,7 @@ public class ImmediateComponentManager<S
     }
 
 
-    protected S createImplementationObject( ComponentContext componentContext, SetImplementationObject setter )
+    protected S createImplementationObject( ComponentContextImpl componentContext, SetImplementationObject setter )
     {
         final Class<S> implementationObjectClass;
         final S implementationObject;
@@ -262,6 +259,8 @@ public class ImmediateComponentManager<S
             log( LogService.LOG_ERROR, "Error during instantiation of the implementation object", t );
             return null;
         }
+        
+        componentContext.newComponentInstance();
 
         // 3. set the implementation object prematurely
         setter.presetImplementationObject( implementationObject );
@@ -343,6 +342,7 @@ public class ImmediateComponentManager<S
     protected void cleanupImplementationObject( Object implementationObject )
     {
         m_componentContext.clearEdgeInfos();
+        m_componentContext.clearComponentInstance();
     }
 
     State getSatisfiedState()

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java?rev=1463769&r1=1463768&r2=1463769&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Tue Apr  2 21:50:44 2013
@@ -83,9 +83,9 @@ public class ServiceFactoryComponentMana
         for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
         {
             BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
-            disposeImplementationObject( componentContext.getInstance(), componentContext, reason );
+            disposeImplementationObject( componentContext.getImplementationObject(), componentContext, reason );
             i.remove();
-            cleanupImplementationObject( componentContext.getInstance() );
+            cleanupImplementationObject( componentContext.getImplementationObject() );
             log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent for reason {1}", new Object[] { getName(), REASONS[ reason ] },  null );
         }
     }
@@ -240,7 +240,7 @@ public class ServiceFactoryComponentMana
         MethodResult result = MethodResult.VOID;
         for ( BundleComponentContext componentContext : serviceContexts.values() )
         {
-            Object instance = componentContext.getInstance();
+            Object instance = componentContext.getImplementationObject();
             result = modifiedMethod.invoke( instance,
                     new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID, this );
 
@@ -284,9 +284,9 @@ public class ServiceFactoryComponentMana
         }
 
 
-        //---------- ComponentInstance interface ------------------------------
+        //---------- ComponentInstance interface support ------------------------------
 
-        public Object getInstance()
+        Object getImplementationObject()
         {
             return m_implementationObject;
         }

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java?rev=1463769&r1=1463768&r2=1463769&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentFactoryTest.java Tue Apr  2 21:50:44 2013
@@ -94,7 +94,7 @@ public class ComponentFactoryTest extend
         TestCase.assertNotNull( instanceMap );
         TestCase.assertEquals( 1, instanceMap.size() );
 
-        final Object instanceManager = getFieldValue( instance, "m_componentManager" );
+        final Object instanceManager = getComponentManagerFromComponentInstance( instance );
         TestCase.assertTrue( instanceMap.containsValue( instanceManager ) );
 
         // check registered components
@@ -169,7 +169,7 @@ public class ComponentFactoryTest extend
         TestCase.assertNotNull( instanceMap );
         TestCase.assertEquals( 1, instanceMap.size() );
 
-        final Object instanceManager = getFieldValue( instance, "m_componentManager" );
+        final Object instanceManager = getComponentManagerFromComponentInstance( instance );
         TestCase.assertTrue( instanceMap.containsValue( instanceManager ) );
 
         // disable the factory
@@ -301,7 +301,7 @@ public class ComponentFactoryTest extend
         TestCase.assertNotNull( instanceMap );
         TestCase.assertEquals( 1, instanceMap.size() );
 
-        final Object instanceManager = getFieldValue( instance, "m_componentManager" );
+        final Object instanceManager = getComponentManagerFromComponentInstance( instance );
         TestCase.assertTrue( instanceMap.containsValue( instanceManager ) );
 
         // delete config, ensure factory is not active anymore and component instance not changed
@@ -377,7 +377,7 @@ public class ComponentFactoryTest extend
         TestCase.assertNotNull( instanceMap );
         TestCase.assertEquals( 1, instanceMap.size() );
 
-        final Object instanceManager = getFieldValue( instance, "m_componentManager" );
+        final Object instanceManager = getComponentManagerFromComponentInstance( instance );
         TestCase.assertTrue( instanceMap.containsValue( instanceManager ) );
 
         // check registered components

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java?rev=1463769&r1=1463768&r2=1463769&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java Tue Apr  2 21:50:44 2013
@@ -370,6 +370,12 @@ public abstract class ComponentTestBase
             return null; // keep the compiler happy
         }
     }
+    
+    protected Object getComponentManagerFromComponentInstance( Object instance )
+    {
+        Object cc = getFieldValue( instance, "m_componentContext");
+        return getFieldValue( cc, "m_componentManager" );
+    }
 
 
     protected static Field getField( Class<?> type, String fieldName ) throws NoSuchFieldException

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ConfigurationComponentFactoryTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ConfigurationComponentFactoryTest.java?rev=1463769&r1=1463768&r2=1463769&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ConfigurationComponentFactoryTest.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ConfigurationComponentFactoryTest.java Tue Apr  2 21:50:44 2013
@@ -98,7 +98,7 @@ public class ConfigurationComponentFacto
         TestCase.assertNotNull( instanceMap );
         TestCase.assertEquals( 1, instanceMap.size() );
 
-        final Object instanceManager = getFieldValue( SimpleComponent.INSTANCE.m_activateContext.getComponentInstance(), "m_componentManager" );
+        final Object instanceManager = getFieldValue( SimpleComponent.INSTANCE.m_activateContext, "m_componentManager" );
         TestCase.assertTrue( instanceMap.containsValue( instanceManager ) );