Author: cziegeler
Date: Sun Jul 12 10:27:46 2015
New Revision: 1690440
URL: http://svn.apache.org/r1690440
Log:
FELIX-4957 : [DS][RFC-212] Various issues with field references
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/FieldHandler.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/FieldHandler.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/FieldHandler.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/FieldHandler.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/FieldHandler.java
Sun Jul 12 10:27:46 2015
@@ -551,17 +551,21 @@ public class FieldHandler
}
this.boundValues.remove(refPair);
}
- // updated needs only be done, if reference is dynamic
- // and the value type is map or tuple
+ // updated needs only be done, if the value type is map or tuple
+ // If it's a dynamic reference, the value can be updated
+ // for a static reference we need a reactivation
else if ( mType == METHOD_TYPE.UPDATED )
{
- if ( !this.metadata.isStatic()
- && ( this.valueType == ParamType.map || this.valueType
== ParamType.tuple ) )
- {
+ if ( this.valueType == ParamType.map || this.valueType ==
ParamType.tuple )
+ {
+ if ( this.metadata.isStatic() )
+ {
+ return MethodResult.REACTIVATE;
+ }
final Object obj = getValue(key, refPair);
this.setFieldValue(componentInstance, obj);
this.boundValues.put(refPair, obj);
- }
+ }
}
// bind needs always be done
else
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
Sun Jul 12 10:27:46 2015
@@ -34,11 +34,16 @@ public class MethodResult
{
/**
- * Predefined instance indicating a successfull call to a void method.
+ * Predefined instance indicating a successful call to a void method.
*/
public static final MethodResult VOID = new MethodResult(false, null);
/**
+ * Predefined instance indicating to reactivate the component.
+ */
+ public static final MethodResult REACTIVATE = new MethodResult(false,
null);
+
+ /**
* The actual result from the method, which may be <code>null</code>.
*/
private final Map<String, Object> result;
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
Sun Jul 12 10:27:46 2015
@@ -993,7 +993,11 @@ public abstract class AbstractComponentM
return true;
}
- abstract <T> void invokeUpdatedMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> refPair, int trackingCount );
+ /**
+ * Invoke updated method
+ * @return {@code true} if the component needs reactivation, {@code false}
otherwise.
+ */
+ abstract <T> boolean invokeUpdatedMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> refPair, int trackingCount );
abstract <T> void invokeBindMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> refPair, int trackingCount );
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
Sun Jul 12 10:27:46 2015
@@ -300,8 +300,9 @@ public class ComponentFactoryImpl<S> ext
return true;
}
- <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager,
RefPair<S, T> ref, int trackingCount )
+ <T> boolean invokeUpdatedMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> ref, int trackingCount )
{
+ return false;
}
<T> void invokeBindMethod( DependencyManager<S, T> dependencyManager,
RefPair<S, T> reference, int trackingCount )
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
Sun Jul 12 10:27:46 2015
@@ -932,17 +932,31 @@ public class DependencyManager<S, T> imp
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic modified {2} (enter)", new Object[] {getName(), trackingCount,
serviceReference}, null );
boolean invokeUpdated;
- synchronized (getTracker().tracked())
+ final Object sync = getTracker().tracked();
+ synchronized (sync)
{
invokeUpdated = isActive() && refPair == this.refPair;
}
+ boolean reactivate = false;
if ( invokeUpdated )
{
- m_componentManager.invokeUpdatedMethod(
DependencyManager.this, refPair, trackingCount );
+ reactivate = 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 );
tracked( trackingCount );
+ if ( reactivate )
+ {
+ m_componentManager.deactivateInternal(
ComponentConstants.DEACTIVATION_REASON_REFERENCE, false, false );
+ synchronized ( sync )
+ {
+ if (refPair == this.refPair)
+ {
+ this.refPair = null;
+ }
+ }
+ m_componentManager.activateInternal( trackingCount );
+ }
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic modified {2} (exit)", new Object[] {getName(), trackingCount,
serviceReference}, null );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<S, T> refPair, int trackingCount )
@@ -1617,13 +1631,14 @@ public class DependencyManager<S, T> imp
*
* @param componentContext instance we are calling updated on.
* @param refPair A service reference corresponding to the service whose
service
- * @param edgeInfo EdgeInfo for the comibination of this instance and this
dependency manager.
+ * @param edgeInfo EdgeInfo for the combination of this instance and this
dependency manager.
+ * @return {@code true} if reactivation is required.
*/
- void invokeUpdatedMethod( ComponentContextImpl<S> componentContext, final
RefPair<S, T> refPair, int trackingCount, EdgeInfo info )
+ boolean invokeUpdatedMethod( ComponentContextImpl<S> componentContext,
final RefPair<S, T> refPair, int trackingCount, EdgeInfo info )
{
if ( m_dependencyMetadata.getUpdated() == null &&
m_dependencyMetadata.getField() == null )
{
- return;
+ return false;
}
// The updated method is only invoked if the implementation object is
not
// null. This is valid for both immediate and delayed components
@@ -1634,7 +1649,7 @@ public class DependencyManager<S, T> imp
if (info.outOfRange( trackingCount ) )
{
//ignore events after close started or we will have
duplicate unbinds.
- return;
+ return false;
}
}
info.waitForOpen( m_componentManager, getName(),
"invokeUpdatedMethod" );
@@ -1643,15 +1658,16 @@ public class DependencyManager<S, T> imp
m_componentManager.log( LogService.LOG_WARNING,
"DependencyManager : invokeUpdatedMethod : Service not
available from service registry for ServiceReference {0} for reference {1}",
new Object[] {refPair.getRef(), getName()}, null );
- return;
+ return false;
}
- BindParameters bp = new BindParameters(componentContext, refPair);
- MethodResult methodResult = m_bindMethods.getUpdated().invoke(
componentContext.getImplementationObject( false ), bp, MethodResult.VOID,
m_componentManager );
+ final BindParameters bp = new BindParameters(componentContext,
refPair);
+ final MethodResult methodResult =
m_bindMethods.getUpdated().invoke( componentContext.getImplementationObject(
false ), bp, MethodResult.VOID, m_componentManager );
if ( methodResult != null)
{
m_componentManager.setServiceProperties( methodResult );
}
+ return methodResult == MethodResult.REACTIVATE;
}
else
{
@@ -1661,6 +1677,7 @@ public class DependencyManager<S, T> imp
m_componentManager.log( LogService.LOG_DEBUG,
"DependencyManager : Component not set, no need to call
updated method", null );
}
+ return false;
}
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=1690440&r1=1690439&r2=1690440&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
Sun Jul 12 10:27:46 2015
@@ -176,12 +176,19 @@ public class ServiceFactoryComponentMana
}
}
- <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager,
RefPair<S, T> refPair, int trackingCount )
+ <T> boolean invokeUpdatedMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> refPair, int trackingCount )
{
+ // as all instances are treated the same == have the same updated
signatures for methods/fields
+ // we just need one result
+ boolean reactivate = false;
for ( ComponentContextImpl<S> cc : getComponentContexts() )
{
- dependencyManager.invokeUpdatedMethod( cc, refPair, trackingCount,
cc.getEdgeInfo( dependencyManager ) );
+ if ( dependencyManager.invokeUpdatedMethod( cc, refPair,
trackingCount, cc.getEdgeInfo( dependencyManager ) ) )
+ {
+ reactivate = true;
+ }
}
+ return reactivate;
}
<T> void invokeUnbindMethod( DependencyManager<S, T> dependencyManager,
RefPair<S, T> oldRefPair, int trackingCount )
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java?rev=1690440&r1=1690439&r2=1690440&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
Sun Jul 12 10:27:46 2015
@@ -372,14 +372,15 @@ public class SingleComponentManager<S> e
}
@Override
- <T> void invokeUpdatedMethod( DependencyManager<S, T> dependencyManager,
RefPair<S, T> refPair, int trackingCount )
+ <T> boolean invokeUpdatedMethod( DependencyManager<S, T>
dependencyManager, RefPair<S, T> refPair, int trackingCount )
{
- ComponentContextImpl<S> componentContext = m_componentContext;
+ final ComponentContextImpl<S> componentContext = m_componentContext;
if ( componentContext != null )
{
- EdgeInfo info = componentContext.getEdgeInfo( dependencyManager );
- dependencyManager.invokeUpdatedMethod( componentContext, refPair,
trackingCount, info );
+ final EdgeInfo info = componentContext.getEdgeInfo(
dependencyManager );
+ return dependencyManager.invokeUpdatedMethod( componentContext,
refPair, trackingCount, info );
}
+ return false;
}
@Override