Author: pderop
Date: Sun Jan 31 22:00:44 2016
New Revision: 1727864
URL: http://svn.apache.org/viewvc?rev=1727864&view=rev
Log:
FELIX-5155: Do not invoke callbacks on Factory Pid Adapters components and on
AbstractDecorator components (excepts for the first internal dependency
declared by aspects and adapters).
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java?rev=1727864&r1=1727863&r2=1727864&view=diff
==============================================================================
---
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
(original)
+++
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
Sun Jan 31 22:00:44 2016
@@ -538,27 +538,8 @@ public abstract class AbstractDependency
public ComponentContext getComponentContext() {
return m_component;
}
-
- /**
- * Returns the dependency callback instance, if there is one.
- * @returns the dependency callback instance if there is one, else null.
- */
- public Object getCallbackInstance() {
- return m_callbackInstance;
- }
/**
- * Sets the dependency callback instance
- * @param callbackInstance the dependency callback instance
- * @return the previous callbackInstance, or <code>null</code> if it did
not have one
- */
- public Object setCallbackInstance(Object callbackInstance) {
- Object currentCallbackInstance = m_callbackInstance;
- m_callbackInstance = callbackInstance;
- return currentCallbackInstance;
- }
-
- /**
* Returns the default service, or null.
* @param nullObject if true, a null object may be returned.
* @return the default service
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java?rev=1727864&r1=1727863&r2=1727864&view=diff
==============================================================================
---
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
(original)
+++
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
Sun Jan 31 22:00:44 2016
@@ -126,17 +126,4 @@ public interface DependencyContext exten
* @return a clone of this dependency.
*/
public DependencyContext createCopy();
-
- /**
- * Returns the dependency callback instance, if there is one.
- * @returns the dependency callback instance if there is one, else null.
- */
- public Object getCallbackInstance();
-
- /**
- * Sets the dependency callback instance
- * @param callbackInstance the dependency callback instance
- * @return the previous callbackInstance, or <code>null</code> if it did
not have one
- */
- public Object setCallbackInstance(Object callbackInstance);
}
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java?rev=1727864&r1=1727863&r2=1727864&view=diff
==============================================================================
---
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
(original)
+++
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
Sun Jan 31 22:00:44 2016
@@ -1438,6 +1438,16 @@ public class ComponentImpl implements Co
return;
}
if (m_invokeCallbackCache.put(event, event) == null) {
+ // FELIX-5155: we must not invoke callbacks on our special
internal components (adapters/aspects) if the dependency is not the first one,
or
+ // if the internal component is a Factory Pid Adapter.
+ // For aspects/adapters, the first dependency only need to
be injected, not the other extra dependencies added by user.
+ // (in fact, we do this because extra dependencies (added
by user) may contain a callback instance, and we really don't want to invoke
the callbacks twice !
+ Object mainComponentImpl = getInstance();
+ if (mainComponentImpl instanceof AbstractDecorator) {
+ if (mainComponentImpl instanceof
FactoryConfigurationAdapterImpl || dc != m_dependencies.get(0)) {
+ return;
+ }
+ }
dc.invokeCallback(type, event);
}
}
Modified:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java?rev=1727864&r1=1727863&r2=1727864&view=diff
==============================================================================
---
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
(original)
+++
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
Sun Jan 31 22:00:44 2016
@@ -19,7 +19,6 @@
package org.apache.felix.dm.impl;
import java.util.Dictionary;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -62,7 +61,6 @@ public class FilterComponent implements
protected volatile Object m_factory;
protected volatile String m_factoryCreateMethod;
protected volatile Dictionary<String, Object> m_serviceProperties;
- private final Map<DependencyContext, Object> m_dependencyCallbacks = new
HashMap<>();
public FilterComponent(Component service) {
m_component = (ComponentImpl) service;
@@ -79,37 +77,21 @@ public class FilterComponent implements
}
public Component add(Dependency ... dependencies) {
- // First, detect if one of the added dependencies is required, and
also, remove any callback instance found in
- // dependencies. We'll store such dependency callback instance in our
m_dependencyCallbacks map and will
- // re-add them later, in concrete aspect or adapter instances (see the
copyDependencies method).
- // We remove dependency callback instance because we don't want to
call with internal abstract decorator instances).
-
- boolean allDependenciesOptional = true;
+ m_component.add(dependencies);
+ // Add the dependencies to all already instantiated services.
+ // If one dependency from the list is required, we have nothing to do,
since our internal
+ // service will be stopped/restarted.
for (Dependency dependency : dependencies) {
- DependencyContext dc = (DependencyContext) dependency;
- if (dc.isRequired()) {
- allDependenciesOptional = false;
- }
-
- // Temporarily remove dependency callback instance (if set),
because we don't want to call it twice (one time from the
- // internal aspect/adapter AbstractDecorator object, and another
one time from the actual aspect/adapter component instances).
- // See FELIX-5155.
- if (dc.getCallbackInstance() != null) {
- m_dependencyCallbacks.put(dc, dc.setCallbackInstance(null));
+ if (((DependencyContext) dependency).isRequired()) {
+ return this;
}
}
-
- // Now, add the dependencies in the internal abstract decorator
component.
- m_component.add(dependencies);
-
- // If all dependencies are optional, add them to already instantiated
aspect or adapter components.
- if (allDependenciesOptional) {
- Object[] instances = m_component.getInstances();
- if (instances.length > 0) {
- AbstractDecorator ad = (AbstractDecorator) instances[0];
- if (ad != null) {
- ad.addDependency(dependencies);
- }
+ // Ok, the list contains no required dependencies: add optionals
dependencies in already instantiated services.
+ Object[] instances = m_component.getInstances();
+ if (instances.length > 0) {
+ AbstractDecorator ad = (AbstractDecorator) instances[0];
+ if (ad != null) {
+ ad.addDependency(dependencies);
}
}
return this;
@@ -160,8 +142,6 @@ public class FilterComponent implements
}
}
}
- // Cleanup possibly cached depenedncy callack instances.
- m_dependencyCallbacks.remove((DependencyContext) dependency);
return this;
}
@@ -380,10 +360,7 @@ public class FilterComponent implements
protected void copyDependencies(List<DependencyContext> dependencies,
Component component) {
for (DependencyContext dc : dependencies) {
DependencyContext copy = dc.createCopy();
- Object callbackInstance = m_dependencyCallbacks.get(dc);
- if (callbackInstance != null) {
- copy.setCallbackInstance(callbackInstance);
- }
+
component.add(copy);
}
}