felix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fmesc...@apache.org
Subject svn commit: r1409028 - in /felix/trunk/scr/src: main/java/org/apache/felix/scr/impl/manager/ test/java/org/apache/felix/scr/integration/ test/java/org/apache/felix/scr/integration/components/ test/resources/
Date Tue, 13 Nov 2012 23:40:57 GMT
Author: fmeschbe
Date: Tue Nov 13 23:40:56 2012
New Revision: 1409028

URL: http://svn.apache.org/viewvc?rev=1409028&view=rev
Log:
FELIX-3754 Internally register the component instance before calling the activate method to
make sure (dynamic) services can be bound during activation. In case of activation failure,
the instance has to be unregistered again. Plus test case.

Modified:
    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/ComponentActivationTest.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java
    felix/trunk/scr/src/test/resources/integration_test_activation_components.xml

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=1409028&r1=1409027&r2=1409028&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 Nov 13 23:40:56 2012
@@ -123,6 +123,14 @@ public class ImmediateComponentManager e
                     m_componentContext = tmpContext;
                     m_implementationObject = implementationObject;
                 }
+
+
+                public void unsetImplementationObject( Object implementationObject )
+                {
+                    m_componentContext = null;
+                    m_implementationObject = null;
+                }
+
             } );
 
             // if something failed creating the component instance, return false
@@ -180,6 +188,7 @@ public class ImmediateComponentManager e
 
     protected interface SetImplementationObject {
         void setImplementationObject(Object implementationObject);
+        void unsetImplementationObject(Object implementationObject);
     }
 
     protected Object createImplementationObject( ComponentContext componentContext, SetImplementationObject
setter )
@@ -235,11 +244,17 @@ public class ImmediateComponentManager e
             }
         }
 
-        // 4. Call the activate method, if present
+        // 4. set the implementation object prematurely
+        setter.setImplementationObject( implementationObject );
+
+        // 5. Call the activate method, if present
         final MethodResult result = getComponentMethods().getActivateMethod().invoke( implementationObject,
new ActivatorParameter(
                 componentContext, 1 ), null );
         if ( result == null )
         {
+            // make sure the implementation object is not available
+            setter.unsetImplementationObject( implementationObject );
+
             // 112.5.8 If the activate method throws an exception, SCR must log an error
message
             // containing the exception with the Log Service and activation fails
             it = getDependencyManagers();
@@ -253,7 +268,6 @@ public class ImmediateComponentManager e
         }
         else
         {
-            setter.setImplementationObject( implementationObject );
             setServiceProperties( result );
         }
 

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=1409028&r1=1409027&r2=1409028&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 Nov 13 23:40:56 2012
@@ -152,6 +152,13 @@ public class ServiceFactoryComponentMana
                     changeState( Active.getInstance() );
                 }
             }
+
+
+            public void unsetImplementationObject( Object implementationObject )
+            {
+                serviceContexts.remove( implementationObject );
+                serviceContext.setImplementationObject( null );
+            }
         } );
 
         // register the components component context if successfull

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java?rev=1409028&r1=1409027&r2=1409028&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
(original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentActivationTest.java
Tue Nov 13 23:40:56 2012
@@ -22,6 +22,7 @@ package org.apache.felix.scr.integration
 import junit.framework.TestCase;
 
 import org.apache.felix.scr.Component;
+import org.apache.felix.scr.integration.components.ActivatorComponent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
@@ -185,4 +186,31 @@ public class ComponentActivationTest ext
         delay();
         TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
     }
+
+
+    @Test
+    public void test_activate_register_service()
+    {
+        final String componentname = "ActivatorComponent.activate.with.bind";
+
+        final Component component = findComponentByName( componentname );
+
+        TestCase.assertNotNull( component );
+        TestCase.assertFalse( component.isDefaultEnabled() );
+
+        TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
+
+        component.enable();
+        delay();
+
+        TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
+
+        ActivatorComponent ac = (ActivatorComponent) component.getComponentInstance().getInstance();
+        TestCase.assertNotNull( ac.getSimpleService() );
+
+        component.disable();
+
+        delay();
+        TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
+    }
 }

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java?rev=1409028&r1=1409027&r2=1409028&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java
(original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/ActivatorComponent.java
Tue Nov 13 23:40:56 2012
@@ -21,6 +21,9 @@ package org.apache.felix.scr.integration
 
 import java.util.Map;
 
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
 
 public class ActivatorComponent
 {
@@ -29,14 +32,23 @@ public class ActivatorComponent
 
     public static final String FLAG_FAIL_DEACTIVATE = "failDeactivate";
 
+    public static final String FLAG_REGISTER_SERVICE = "registerService";
+
+    private ServiceRegistration registration;
+
+    private SimpleService simpleService;
 
     @SuppressWarnings("unused")
-    private void myActivate( Map<?, ?> configuration )
+    private void myActivate( BundleContext context, Map<?, ?> configuration )
     {
         if ( configuration.containsKey( FLAG_FAIL_ACTIVATE ) )
         {
             throw new IllegalStateException( "myActivate fails" );
         }
+        if ( configuration.containsKey( FLAG_REGISTER_SERVICE ) )
+        {
+            registration = context.registerService( SimpleService.class.getName(), new SimpleServiceImpl(),
null );
+        }
     }
 
 
@@ -47,5 +59,33 @@ public class ActivatorComponent
         {
             throw new IllegalStateException( "myDeactivate fails" );
         }
+        if ( registration != null )
+        {
+            registration.unregister();
+            registration = null;
+        }
+    }
+
+
+    public SimpleService getSimpleService()
+    {
+        return simpleService;
+    }
+
+
+    @SuppressWarnings("unused")
+    private void bindSimpleService( SimpleService simpleService )
+    {
+        this.simpleService = simpleService;
+    }
+
+
+    @SuppressWarnings("unused")
+    private void unbindSimpleService( SimpleService simpleService )
+    {
+        if ( this.simpleService == simpleService )
+        {
+            this.simpleService = null;
+        }
     }
 }

Modified: felix/trunk/scr/src/test/resources/integration_test_activation_components.xml
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/resources/integration_test_activation_components.xml?rev=1409028&r1=1409027&r2=1409028&view=diff
==============================================================================
--- felix/trunk/scr/src/test/resources/integration_test_activation_components.xml (original)
+++ felix/trunk/scr/src/test/resources/integration_test_activation_components.xml Tue Nov
13 23:40:56 2012
@@ -70,4 +70,21 @@
         <implementation class="org.apache.felix.scr.integration.components.ActivatorComponent"
/>
         <property name="failDeactivate" value="true" />
     </scr:component>
+
+    <!-- bind service during activate -->
+    <scr:component name="ActivatorComponent.activate.with.bind"
+        enabled="false"
+        activate="myActivate"
+        deactivate="myDeactivate">
+        <implementation class="org.apache.felix.scr.integration.components.ActivatorComponent"
/>
+        <property name="registerService" value="true" />
+        <reference
+            name="service"
+            interface="org.apache.felix.scr.integration.components.SimpleService"
+            bind="bindSimpleService"
+            unbind="unbindSimpleService"
+            policy="dynamic"
+            cardinality="0..n"
+        />
+    </scr:component>
 </components>



Mime
View raw message