FELIX-4011 serviceFactoryCM can't expose a being-constructed object through getService, since getService is only called once per bundle. Also fix a method name
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1463767 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index c3fbf30..2a1fbd0 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -851,7 +851,7 @@
m_dependenciesCollected = false;
}
- abstract <T> void update( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount );
+ abstract <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount );
abstract <T> void invokeBindMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount );
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
index 29e4087..56fae25 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
@@ -278,7 +278,7 @@
return true;
}
- <T> void update( DependencyManager<S, T> dependencyManager, RefPair<T> ref, int trackingCount )
+ <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager, RefPair<T> ref, int trackingCount )
{
}
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index d8979f4..a0dd549 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -358,7 +358,7 @@
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic modified {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
if (isActive())
{
- m_componentManager.update( DependencyManager.this, refPair, trackingCount );
+ m_componentManager.invokeUpdatedMethod( DependencyManager.this, refPair, trackingCount );
}
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic modified {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
@@ -484,7 +484,7 @@
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticGreedy modified {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
if (isActive())
{
- m_componentManager.update( DependencyManager.this, refPair, trackingCount );
+ m_componentManager.invokeUpdatedMethod( DependencyManager.this, refPair, trackingCount );
}
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticGreedy modified {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
@@ -571,7 +571,7 @@
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticReluctant modified {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
if (isActive())
{
- m_componentManager.update( DependencyManager.this, refPair, trackingCount );
+ m_componentManager.invokeUpdatedMethod( DependencyManager.this, refPair, trackingCount );
}
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticReluctant modified {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
@@ -730,7 +730,7 @@
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleDynamic modified {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
if (isActive())
{
- m_componentManager.update( DependencyManager.this, refPair, trackingCount );
+ m_componentManager.invokeUpdatedMethod( DependencyManager.this, refPair, trackingCount );
}
this.trackingCount = trackingCount;
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleDynamic modified {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
@@ -886,7 +886,7 @@
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleStatic modified {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
if ( isActive() )
{
- m_componentManager.update( DependencyManager.this, refPair, trackingCount );
+ m_componentManager.invokeUpdatedMethod( DependencyManager.this, refPair, trackingCount );
}
this.trackingCount = trackingCount;
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleStatic modified {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
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 a78e4a5..a943602 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
@@ -360,7 +360,7 @@
return Active.getInstance();
}
- <T> void update( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
+ <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
{
final S impl = ( m_tmpImplementationObject != null ) ? m_tmpImplementationObject : m_implementationObject;
dependencyManager.invokeUpdatedMethod( impl, refPair, trackingCount );
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 8df7ae7..749b7c1 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
@@ -48,12 +48,6 @@
// service instances
private IdentityHashMap<S, BundleComponentContext> serviceContexts = new IdentityHashMap<S, BundleComponentContext>();
- // pseudo map of implementation objects to be used for service
- // binding while calling the activate method. The map's keys and values
- // are just the implementation objects. The objects will only be
- // contained while the activate method is being called.
- private IdentityHashMap<S, BundleComponentContext> tmpImplementationObjects = new IdentityHashMap<S, BundleComponentContext>();
-
/**
* @param activator BundleComponentActivator for this DS implementation
* @param componentHolder ComponentHolder for configuration management
@@ -148,15 +142,13 @@
public void presetImplementationObject( S implementationObject )
{
serviceContext.setImplementationObject( implementationObject );
- tmpImplementationObjects.put( implementationObject, serviceContext );
+ serviceContexts.put( implementationObject, serviceContext );
}
public void setImplementationObject( S implementationObject )
{
- serviceContexts.put( implementationObject, serviceContext );
- tmpImplementationObjects.remove( implementationObject );
// if this is the first use of this component, switch to ACTIVE state
if ( getState() == STATE_REGISTERED )
@@ -168,7 +160,7 @@
public void resetImplementationObject( S implementationObject )
{
- tmpImplementationObjects.remove( implementationObject );
+ serviceContexts.remove( implementationObject );
serviceContext.setImplementationObject( null );
}
@@ -209,7 +201,15 @@
}
}
- <T> void update( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
+ <T> void invokeBindMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
+ {
+ for ( S implementationObject : serviceContexts.keySet() )
+ {
+ dependencyManager.invokeBindMethod( implementationObject, refPair, trackingCount );
+ }
+ }
+
+ <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
{
for ( S implementationObject : serviceContexts.keySet() )
{
@@ -217,28 +217,12 @@
}
}
- <T> void invokeBindMethod( DependencyManager<S, T> dependencyManager, RefPair<T> refPair, int trackingCount )
- {
- for ( S implementationObject : serviceContexts.keySet() )
- {
- dependencyManager.invokeBindMethod( implementationObject, refPair, trackingCount );
- }
- for ( S implementationObject : tmpImplementationObjects.keySet() )
- {
- dependencyManager.invokeBindMethod( implementationObject, refPair, trackingCount );
- }
- }
-
<T> void invokeUnbindMethod( DependencyManager<S, T> dependencyManager, RefPair<T> oldRefPair, int trackingCount )
{
for ( S implementationObject : serviceContexts.keySet() )
{
dependencyManager.invokeUnbindMethod( implementationObject, oldRefPair, trackingCount );
}
- for ( S implementationObject : tmpImplementationObjects.keySet() )
- {
- dependencyManager.invokeUnbindMethod( implementationObject, oldRefPair, trackingCount );
- }
}
protected MethodResult invokeModifiedMethod()
@@ -252,13 +236,6 @@
new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID, this );
}
- for ( BundleComponentContext componentContext : tmpImplementationObjects.values() )
- {
- Object instance = componentContext.getInstance();
- result = modifiedMethod.invoke( instance,
- new ActivateMethod.ActivatorParameter( componentContext, -1 ), MethodResult.VOID, this );
-
- }
return result;
}