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 2012/10/16 21:50:10 UTC

svn commit: r1398958 - in /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager: ImmediateComponentManager.java ServiceFactoryComponentManager.java

Author: djencks
Date: Tue Oct 16 19:50:09 2012
New Revision: 1398958

URL: http://svn.apache.org/viewvc?rev=1398958&view=rev
Log:
FELIX-3534 fix service factory modify and deactivate behavior

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

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=1398958&r1=1398957&r2=1398958&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 Oct 16 19:50:09 2012
@@ -510,7 +510,7 @@ public class ImmediateComponentManager e
     private boolean modify()
     {
         // 0. no live update if there is no instance
-        if ( getInstance() == null )
+        if ( hasInstance() )
         {
             return false;
         }
@@ -546,8 +546,7 @@ public class ImmediateComponentManager e
         // 4. call method (nothing to do when failed, since it has already been logged)
         //   (call with non-null default result to continue even if the
         //    modify method call failed)
-        final MethodResult result = getComponentMethods().getModifiedMethod().invoke( getInstance(),
-                new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID );
+        final MethodResult result = invokeModifiedMethod();
         if ( result == null )
         {
             // log an error if the declared method cannot be found
@@ -583,6 +582,17 @@ public class ImmediateComponentManager e
         return true;
     }
 
+    protected MethodResult invokeModifiedMethod()
+    {
+        return getComponentMethods().getModifiedMethod().invoke( getInstance(),
+                    new ActivatorParameter( m_componentContext, -1 ), MethodResult.VOID );
+    }
+
+    protected boolean hasInstance()
+    {
+        return getInstance() == null;
+    }
+
 
     /**
      * Checks if the given service registration properties matches another set

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=1398958&r1=1398957&r2=1398958&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 Oct 16 19:50:09 2012
@@ -24,7 +24,10 @@ import java.util.Iterator;
 
 import org.apache.felix.scr.impl.BundleComponentActivator;
 import org.apache.felix.scr.impl.config.ComponentHolder;
+import org.apache.felix.scr.impl.helper.ActivateMethod;
 import org.apache.felix.scr.impl.helper.ComponentMethods;
+import org.apache.felix.scr.impl.helper.MethodResult;
+import org.apache.felix.scr.impl.helper.ModifiedMethod;
 import org.apache.felix.scr.impl.metadata.ComponentMetadata;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
@@ -75,7 +78,17 @@ public class ServiceFactoryComponentMana
      */
     protected void deleteComponent( int reason )
     {
-        // nothing to do, this is handled by ungetService
+        if ( !isWriteLocked() )
+        {
+            throw new IllegalStateException( "need write lock (deleteComponent)" );
+        }
+        for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
+        {
+            BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
+            i.remove();
+            disposeImplementationObject( componentContext.getInstance(), componentContext, reason );
+            log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent", new Object[] { getName() },  null );
+        }
     }
 
 
@@ -225,6 +238,26 @@ public class ServiceFactoryComponentMana
         }
     }
 
+    protected MethodResult invokeModifiedMethod()
+    {
+        ModifiedMethod modifiedMethod = getComponentMethods().getModifiedMethod();
+        MethodResult result = null;
+        for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
+        {
+            BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
+            Object instance = componentContext.getInstance();
+            result = modifiedMethod.invoke( instance,
+                    new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID );
+
+        }
+        return result;
+    }
+
+    protected boolean hasInstance()
+    {
+        return !serviceContexts.isEmpty();
+    }
+
     //---------- Component interface
 
     public ComponentInstance getComponentInstance()