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);
         }
     }


Reply via email to