You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/10/27 10:04:07 UTC

svn commit: r1634480 - in /felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm: context/ impl/

Author: pderop
Date: Mon Oct 27 09:04:07 2014
New Revision: 1634480

URL: http://svn.apache.org/r1634480
Log:
FELIX-3914: Log unsuccessful field injections and non existing dependency callbacks.

Modified:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FieldUtil.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/AbstractDependency.java Mon Oct 27 09:04:07 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.dm.context;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -26,9 +27,13 @@ import java.util.Set;
 
 import org.apache.felix.dm.ComponentDependencyDeclaration;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.impl.AbstractDecorator;
+import org.apache.felix.dm.impl.AdapterServiceImpl;
 import org.apache.felix.dm.impl.EventImpl;
+import org.apache.felix.dm.impl.Logger;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.log.LogService;
 
 /**
  * Abstract class for implementing Dependencies
@@ -55,15 +60,21 @@ public abstract class AbstractDependency
     protected final BundleContext m_context;
     protected final Bundle m_bundle;
     protected final static Dictionary<String, Object> EMPTY_PROPERTIES = new Hashtable<>(0);
-
+    protected final Logger m_logger;
+    
     public AbstractDependency() {
         this(true, null);
     }
 
     public AbstractDependency(boolean autoConfig, BundleContext bc) {
+        this(autoConfig, bc, null);
+    }
+    
+    public AbstractDependency(boolean autoConfig, BundleContext bc, Logger logger) {
         m_autoConfig = autoConfig;
         m_context = bc;
         m_bundle = m_context != null ? m_context.getBundle() : null;
+        m_logger = logger;
     }
 
     public AbstractDependency(AbstractDependency<T> prototype) {
@@ -82,6 +93,7 @@ public abstract class AbstractDependency
         m_propagateCallbackMethod = prototype.m_propagateCallbackMethod;
         m_context = prototype.m_context;
         m_bundle = prototype.m_bundle;
+        m_logger = prototype.m_logger;
     }
 
     // ----------------------- Dependency interface -----------------------------
@@ -121,21 +133,33 @@ public abstract class AbstractDependency
     @Override
     public void invokeAdd(Event e) {
         if (m_add != null) {
-            invoke(m_add, e);
+            // If the add callback is not found and if the component instance is not an abstract decorator, then
+            // log a warn message. (AbstractDecorator, like Aspect or Adapter are not interested in user dependency callbacks).
+            if (! invoke(m_add, e) && ! (m_component.getInstance() instanceof AbstractDecorator)) {
+                callbackNotFound(m_add);
+            }
         }
     }
 
     @Override
     public void invokeChange(Event e) {
         if (m_change != null) {
-            invoke(m_change, e);
+            // If the change callback is not found and if the component instance is not an abstract decorator, then
+            // log a warn message. (AbstractDecorator, like Aspect or Adapter are not interested in user dependency callbacks).
+            if (! invoke(m_change, e) && ! (m_component.getInstance() instanceof AbstractDecorator)) {
+                callbackNotFound(m_change);
+            }
         }
     }
 
     @Override
     public void invokeRemove(Event e) {
         if (m_remove != null) {
-            invoke(m_remove, e);
+            // If the remove callback is not found and if the component instance is not an abstract decorator, then
+            // log a warn message. (AbstractDecorator, like Aspect or Adapter are not interested in user dependency callbacks).
+            if (! invoke(m_remove, e) && ! (m_component.getInstance() instanceof AbstractDecorator)) {
+                callbackNotFound(m_remove);
+            }
         }
     }
 
@@ -287,13 +311,13 @@ public abstract class AbstractDependency
         }
     }
 
-    public void invoke(String method, Event e, Object[] instances) {
+    public boolean invoke(String method, Event e, Object[] instances) {
         // specific for this type of dependency
-        m_component.invokeCallbackMethod(instances, method, new Class[][] { {} }, new Object[][] { {} });
+        return m_component.invokeCallbackMethod(instances, method, new Class[][] { {} }, new Object[][] { {} });
     }
 
-    public void invoke(String method, Event e) {
-        invoke(method, e, getInstances());
+    public boolean invoke(String method, Event e) {
+        return invoke(method, e, getInstances());
     }
 
     @SuppressWarnings("unchecked")
@@ -409,4 +433,16 @@ public abstract class AbstractDependency
                 : ComponentDependencyDeclaration.STATE_OPTIONAL;
         }
     }
+    
+    // -------------- Private methods ---------------------------------------------------
+    
+    private void callbackNotFound(String callback) {
+        if (m_logger == null) {
+        System.out.println("Dependency \"" + callback + "\" callback not found on componnent instances "
+            + Arrays.toString(m_component.getInstances()));
+        } else {
+            m_logger.log(LogService.LOG_WARNING, "Dependency \"" + callback + "\" callback not found on componnent instances "
+                + Arrays.toString(m_component.getInstances()));
+        }
+    }
 }

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/ComponentContext.java Mon Oct 27 09:04:07 2014
@@ -24,8 +24,7 @@ import java.util.concurrent.Executor;
 
 import org.apache.felix.dm.Component;
 
-//TODO should this interface extend Component ?
-public interface ComponentContext {
+public interface ComponentContext extends Component {
     public Executor getExecutor(); // shared between a component and its dependencies
     public Component setThreadPool(Executor threadPool);
     public void start();
@@ -36,7 +35,7 @@ public interface ComponentContext {
     public void handleRemoved(DependencyContext dc, Event e);
     public void handleSwapped(DependencyContext dc, Event event, Event newEvent);
     public List<DependencyContext> getDependencies(); // for testing only...
-    public void invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters);
+    public boolean invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters);
     public Object[] getInstances();
     public String getAutoConfigInstance(Class<?> clazz);
     public boolean getAutoConfig(Class<?> clazz);

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/BundleDependencyImpl.java Mon Oct 27 09:04:07 2014
@@ -49,16 +49,13 @@ public class BundleDependencyImpl extend
     private boolean m_propagate;
     private Object m_propagateCallbackInstance;
     private String m_propagateCallbackMethod;
-    private final Logger m_logger;
 
     public BundleDependencyImpl(BundleContext context, Logger logger) {
-        super(true /* autoconfig */, context);
-        m_logger = logger;
+        super(true /* autoconfig */, context, logger);
     }
     
     public BundleDependencyImpl(BundleDependencyImpl prototype) {
         super(prototype);
-        m_logger = prototype.m_logger;
         m_stateMask = prototype.m_stateMask;
         m_nullObject = prototype.m_nullObject;
         m_bundleInstance = prototype.m_bundleInstance;
@@ -141,9 +138,9 @@ public class BundleDependencyImpl extend
     }
     
     @Override
-    public void invoke(String method, Event e) {
+    public boolean invoke(String method, Event e) {
         BundleEventImpl be = (BundleEventImpl) e;
-        m_component.invokeCallbackMethod(getInstances(), method,
+        return m_component.invokeCallbackMethod(getInstances(), method,
             new Class[][] {{Bundle.class}, {Object.class}, {}},             
             new Object[][] {{be.getBundle()}, {be.getBundle()}, {}}
         );

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java Mon Oct 27 09:04:07 2014
@@ -28,6 +28,7 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -628,9 +629,7 @@ public class ComponentImpl implements Co
         if (m_context != null && m_serviceName != null) {
             ServiceRegistrationImpl wrapper = new ServiceRegistrationImpl();
             m_registration = wrapper;
-            if (((Boolean) m_autoConfig.get(ServiceRegistration.class)).booleanValue()) {
-                configureImplementation(ServiceRegistration.class, m_registration, (String) m_autoConfigInstance.get(ServiceRegistration.class));
-            }
+            autoConfigureImplementation(ServiceRegistration.class, m_registration);
             
             // service name can either be a string or an array of strings
             ServiceRegistration registration;
@@ -664,7 +663,7 @@ public class ComponentImpl implements Co
                     m_registration.unregister();
                 }
             } catch (IllegalStateException e) { /* Should we really log this ? */}
-            configureImplementation(ServiceRegistration.class, NULL_REGISTRATION);
+            autoConfigureImplementation(ServiceRegistration.class, NULL_REGISTRATION);
             m_registration = null;
         }
     }
@@ -751,18 +750,10 @@ public class ComponentImpl implements Co
             }
             
 	        // configure the bundle context
-	        if (((Boolean) m_autoConfig.get(BundleContext.class)).booleanValue()) {
-	            configureImplementation(BundleContext.class, m_context, (String) m_autoConfigInstance.get(BundleContext.class));
-	        }
-            if (((Boolean) m_autoConfig.get(ServiceRegistration.class)).booleanValue()) {
-                configureImplementation(ServiceRegistration.class, NULL_REGISTRATION, (String) m_autoConfigInstance.get(ServiceRegistration.class));
-            }
-            if (((Boolean) m_autoConfig.get(DependencyManager.class)).booleanValue()) {
-                configureImplementation(DependencyManager.class, m_manager, (String) m_autoConfigInstance.get(DependencyManager.class));
-            }
-            if (((Boolean) m_autoConfig.get(Component.class)).booleanValue()) {
-                configureImplementation(Component.class, this, (String) m_autoConfigInstance.get(Component.class));
-            }
+            autoConfigureImplementation(BundleContext.class, m_context);
+            autoConfigureImplementation(ServiceRegistration.class, NULL_REGISTRATION);
+            autoConfigureImplementation(DependencyManager.class, m_manager);
+            autoConfigureImplementation(Component.class, this);
 	    }
 	}
 	
@@ -874,10 +865,12 @@ public class ComponentImpl implements Co
     	return getCompositionInstances();
     }
     
-    public void invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters) {
+    public boolean invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters) {
+        boolean callbackFound = false;
         for (int i = 0; i < instances.length; i++) {
             try {
                 InvocationUtil.invokeCallbackMethod(instances[i], methodName, signatures, parameters);
+                callbackFound |= true;
             }
             catch (NoSuchMethodException e) {
                 // if the method does not exist, ignore it
@@ -890,6 +883,7 @@ public class ComponentImpl implements Co
                 m_logger.log(Logger.LOG_ERROR, "Could not invoke '" + methodName + "'.", e);
             }
         }
+        return callbackFound;
     }
 
     private Object createInstance(Class<?> clazz) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
@@ -932,27 +926,43 @@ public class ComponentImpl implements Co
 		return this;
 	}
 	
-    private void configureImplementation(Class<?> clazz, Object instance) {
-        configureImplementation(clazz, instance, null);
+    private void autoConfigureImplementation(Class<?> clazz, Object instance) {
+        if (((Boolean) m_autoConfig.get(clazz)).booleanValue()) {
+            configureImplementation(clazz, instance, (String) m_autoConfigInstance.get(clazz));
+        }
     }
-
-    /**
+    
+   /**
      * Configure a field in the service implementation. The service implementation
      * is searched for fields that have the same type as the class that was specified
      * and for each of these fields, the specified instance is filled in.
      *
      * @param clazz the class to search for
-     * @param inject the object to fill in the implementation class(es) field
+     * @param instance the object to fill in the implementation class(es) field
      * @param instanceName the name of the instance to fill in, or <code>null</code> if not used
      */
-    private void configureImplementation(Class<?> clazz, Object inject, String fieldName) {
+    private void configureImplementation(Class<?> clazz, Object instance, String fieldName) {
         Object[] targets = getInstances();
-        FieldUtil.injectField(targets, fieldName, clazz, inject, m_logger);
+        if (! FieldUtil.injectField(targets, fieldName, clazz, instance, m_logger) && fieldName != null) {
+            // If the target is an abstract decorator (i.e: an adapter, or an aspect), we must not log warnings
+            // if field has not been injected.
+            if (! (getInstance() instanceof AbstractDecorator)) {
+                m_logger.log(Logger.LOG_WARNING, "Could not inject " + instance + " to field \"" + fieldName
+                    + "\" at any of the following component instances: " + Arrays.toString(targets));
+            }
+        }
     }
 
     private void configureImplementation(Class<?> clazz, DependencyContext dc, String fieldName) {
         Object[] targets = getInstances();
-        FieldUtil.injectDependencyField(targets, fieldName, clazz, dc, m_logger);
+        if (! FieldUtil.injectDependencyField(targets, fieldName, clazz, dc, m_logger) && fieldName != null) {
+            // If the target is an abstract decorator (i.e: an adapter, or an aspect), we must not log warnings
+            // if field has not been injected.
+            if (! (getInstance() instanceof AbstractDecorator)) {
+                m_logger.log(Logger.LOG_WARNING, "Could not inject dependency " + clazz.getName() + " to field \""
+                    + fieldName + "\" at any of the following component instances: " + Arrays.toString(targets));
+            }
+        }
     }
 
     /**

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentScheduler.java Mon Oct 27 09:04:07 2014
@@ -62,7 +62,7 @@ public class ComponentScheduler {
         });
     }
 
-    protected void unbind(Executor threadPool) {
+    protected void unbind(ComponentExecutorFactory threadPool) {
         m_componentExecutorFactory = null;
     }
 

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ConfigurationDependencyImpl.java Mon Oct 27 09:04:07 2014
@@ -37,7 +37,6 @@ import org.osgi.service.cm.ManagedServic
 
 public class ConfigurationDependencyImpl extends AbstractDependency<ConfigurationDependency> implements ConfigurationDependency, ManagedService {
     private Dictionary<String, Object> m_settings;
-	private final Logger m_logger;
 	private String m_pid;
 	private ServiceRegistration m_registration;
     private MetaTypeProviderImpl m_metaType;
@@ -48,8 +47,7 @@ public class ConfigurationDependencyImpl
     }
     
     public ConfigurationDependencyImpl(BundleContext context, Logger logger) {
-    	super(false /* not autoconfig */, context);
-    	m_logger = logger;
+    	super(false /* not autoconfig */, context, logger);
         setRequired(true);
         setCallback("updated");
     }
@@ -57,7 +55,6 @@ public class ConfigurationDependencyImpl
 	public ConfigurationDependencyImpl(ConfigurationDependencyImpl prototype) {
 	    super(prototype);
 	    m_pid = prototype.m_pid;
-	    m_logger = prototype.m_logger;
         m_metaType = prototype.m_metaType != null ? new MetaTypeProviderImpl(prototype.m_metaType, this, null) : null;
 	}
 	

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FieldUtil.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FieldUtil.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FieldUtil.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FieldUtil.java Mon Oct 27 09:04:07 2014
@@ -41,13 +41,13 @@ public class FieldUtil {
      * @param service the injected service
      * @param logger the component logger.
      */
-    public static void injectField(Object[] targets, String fieldName, Class<?> clazz, final Object service,
+    public static boolean injectField(Object[] targets, String fieldName, Class<?> clazz, final Object service,
         final Logger logger)
     {
         if (service == null) {
-            return;
+            return true; // TODO why service can be null ?
         }
-        mapField(true, clazz, targets, fieldName, logger, new FieldFunction() {
+        return mapField(true, clazz, targets, fieldName, logger, new FieldFunction() {
             public void injectField(Field f, Object target) {
                 try {
                     f.setAccessible(true);
@@ -76,14 +76,14 @@ public class FieldUtil {
      * @param service the injected service
      * @param logger the component logger.
      */
-    public static void injectDependencyField(Object[] targets, String fieldName, Class<?> clazz,
+    public static boolean injectDependencyField(Object[] targets, String fieldName, Class<?> clazz,
         final DependencyContext dc, final Logger logger)
     {
         final Event event = dc.getService();
         if (event == null) {
-            return;
+            return true; // TODO check why event can be null
         }
-        mapField(false, clazz, targets, fieldName, logger, new FieldFunction() {
+        return mapField(false, clazz, targets, fieldName, logger, new FieldFunction() {
             public void injectField(Field f, Object target) {
                 try {
                     f.setAccessible(true);
@@ -210,9 +210,10 @@ public class FieldUtil {
      * @param func the callback used to notify when we find either a field with the same dependency service type, or
      * with a "Collection" type, or with a "Map" type.
      */
-    private static void mapField(boolean strict, Class<?> clazz, Object[] targets, String fieldName, Logger logger,
+    private static boolean mapField(boolean strict, Class<?> clazz, Object[] targets, String fieldName, Logger logger,
         FieldFunction func)
     {
+        boolean injected = false;
         if (targets != null && clazz != null) {
             for (int i = 0; i < targets.length; i++) {
                 Object target = targets[i];
@@ -230,19 +231,25 @@ public class FieldUtil {
                         if (fieldName == null) {
                             // Field type class must match injected service type
                             if (fieldType.equals(clazz)) {
+                                injected = true;
                                 func.injectField(field, target);
                             } else if (!strict && mayInjectToIterable(clazz, field, true)) {
+                                injected = true;
                                 func.injectIterableField(field, target);
                             } else if (!strict && mayInjectToMap(clazz, field, true)) {
+                                injected = true;
                                 func.injectMapField(field, target);
                             }
                         } else if (field.getName().equals(fieldName)) {
                             // Field type may be a superclass of the service type
                             if (fieldType.isAssignableFrom(clazz)) {
+                                injected = true;
                                 func.injectField(field, target);
                             } else if (!strict && mayInjectToIterable(clazz, field, false)) {
+                                injected = true;
                                 func.injectIterableField(field, target);
                             } else if (!strict && mayInjectToMap(clazz, field, false)) {
+                                injected = true;
                                 func.injectMapField(field, target);
                             } else {
                                 logger.log(
@@ -257,6 +264,7 @@ public class FieldUtil {
                 }
             }
         }
+        return injected;
     }
 
     private static boolean mayInjectToIterable(Class<?> clazz, Field field, boolean strictClassEquality) {

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/FilterComponent.java Mon Oct 27 09:04:07 2014
@@ -228,8 +228,8 @@ public class FilterComponent implements 
         m_component.stop();
     }
     
-    public void invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters) {
-        m_component.invokeCallbackMethod(instances, methodName, signatures, parameters);
+    public boolean invokeCallbackMethod(Object[] instances, String methodName, Class<?>[][] signatures, Object[][] parameters) {
+        return m_component.invokeCallbackMethod(instances, methodName, signatures, parameters);
     }
         
     public DependencyManager getDependencyManager() {

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceDependencyImpl.java Mon Oct 27 09:04:07 2014
@@ -42,18 +42,15 @@ public class ResourceDependencyImpl exte
     private volatile ServiceRegistration m_registration;
     private volatile String m_resourceFilter;
     private volatile URL m_trackedResource;
-    private final Logger m_logger;
 
     public ResourceDependencyImpl(BundleContext context, Logger logger) {
-        super(true /* autoconfig */, context);
-        m_logger = logger;
+        super(true /* autoconfig */, context, logger);
     }
     
     public ResourceDependencyImpl(ResourceDependencyImpl prototype) {
         super(prototype);
         m_resourceFilter = prototype.m_resourceFilter;
         m_trackedResource = prototype.m_trackedResource;
-        m_logger = prototype.m_logger;
     }
     
     @Override
@@ -119,12 +116,12 @@ public class ResourceDependencyImpl exte
     }
     
     @Override
-    public void invoke(String method, Event e) {
+    public boolean invoke(String method, Event e) {
         ResourceEventImpl re = (ResourceEventImpl) e;
         URL serviceInstance = re.getResource();
         Dictionary<?,?> resourceProperties = re.getProperties();
        
-        m_component.invokeCallbackMethod(getInstances(), method,
+        return m_component.invokeCallbackMethod(getInstances(), method,
             new Class[][] {
                     { Component.class, URL.class, Dictionary.class }, 
                     { Component.class, URL.class },

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java?rev=1634480&r1=1634479&r2=1634480&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java Mon Oct 27 09:04:07 2014
@@ -44,7 +44,6 @@ import org.osgi.service.log.LogService;
 
 public class ServiceDependencyImpl extends AbstractDependency<ServiceDependency> implements ServiceDependency, ServiceTrackerCustomizer {
 	protected volatile ServiceTracker m_tracker;
-    private final Logger m_logger;
     protected String m_swap;
     protected volatile Class<?> m_trackedServiceName;
     private volatile String m_trackedServiceFilter;
@@ -139,13 +138,11 @@ public class ServiceDependencyImpl exten
     }
     
 	public ServiceDependencyImpl(BundleContext ctx, Logger logger) {
-		super(true /* autoconfig */, ctx);
-	    m_logger = logger;
+		super(true /* autoconfig */, ctx, logger);
 	}
 	
 	public ServiceDependencyImpl(ServiceDependencyImpl prototype) {
 		super(prototype);
-		m_logger = prototype.m_logger;
         m_trackedServiceName = prototype.m_trackedServiceName;
         m_nullObject = prototype.m_nullObject;
         m_trackedServiceFilter = prototype.m_trackedServiceFilter;
@@ -255,11 +252,11 @@ public class ServiceDependencyImpl exten
 	}
 	
 	@Override
-	public void invoke(String method, Event e, Object[] instances) {
+	public boolean invoke(String method, Event e, Object[] instances) {
 		ServiceEventImpl se = (ServiceEventImpl) e;
 		ServicePropertiesMap propertiesMap = new ServicePropertiesMap(se.getReference());
 		Dictionary<?,?> properties = se.getProperties();
-		m_component.invokeCallbackMethod(instances, method,
+		return m_component.invokeCallbackMethod(instances, method,
 		    new Class[][]{
                 {Component.class, ServiceReference.class, m_trackedServiceName},
                 {Component.class, ServiceReference.class, Object.class},