FELIX-3534 fix service factory modify and deactivate behavior
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1398958 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index 41b1c24..584399a 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -510,7 +510,7 @@
private boolean modify()
{
// 0. no live update if there is no instance
- if ( getInstance() == null )
+ if ( hasInstance() )
{
return false;
}
@@ -546,8 +546,7 @@
// 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 @@
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
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
index 0c39e39..708dc09 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
@@ -24,7 +24,10 @@
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 @@
*/
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 @@
}
}
+ 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()