You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2006/12/07 00:21:43 UTC

svn commit: r483287 - /incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java

Author: marrs
Date: Wed Dec  6 15:21:41 2006
New Revision: 483287

URL: http://svn.apache.org/viewvc?view=rev&rev=483287
Log:
FELIX-137 Applied the patch provided by Bram with a small difference: if the invoked method itself throws an exception, we stop looking for a method.

Modified:
    incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java

Modified: incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java?view=diff&rev=483287&r1=483286&r2=483287
==============================================================================
--- incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java (original)
+++ incubator/felix/trunk/org.apache.felix.dependencymanager/src/main/java/org/apache/felix/dependencymanager/ServiceDependency.java Wed Dec  6 15:21:41 2006
@@ -249,13 +249,20 @@
     }
     
     private void invokeCallbackMethod(Object instance, String methodName, ServiceReference reference, Object service) throws NoSuchMethodException {
-        invokeMethod(instance, instance.getClass(), methodName, 
-            new Class[][] {{ServiceReference.class, Object.class}, {ServiceReference.class}, {Object.class}, {m_trackedServiceName}, {}}, 
-            new Object[][] {{reference, service}, {reference}, {service}, {service}, {}},
-            false);
+        Class currentClazz = instance.getClass();
+        boolean done = false;
+        while (!done && currentClazz != null) {
+            done = invokeMethod(instance, currentClazz, methodName,
+                new Class[][] {{ServiceReference.class, Object.class}, {ServiceReference.class}, {Object.class}, {m_trackedServiceName}, {}},
+                new Object[][] {{reference, service}, {reference}, {service}, {service}, {}},
+                false);
+            if (!done) {
+                currentClazz = currentClazz.getSuperclass();
+            }
+        }
     }
 
-    private void invokeMethod(Object object, Class clazz, String name, Class[][] signatures, Object[][] parameters, boolean isSuper) {
+    private boolean invokeMethod(Object object, Class clazz, String name, Class[][] signatures, Object[][] parameters, boolean isSuper) {
         Method m = null;
         for (int i = 0; i < signatures.length; i++) {
             Class[] signature = signatures[i];
@@ -263,18 +270,21 @@
                 m = clazz.getDeclaredMethod(name, signature);
                 if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
                     m.setAccessible(true);
-                    m.invoke(object, parameters[i]);
-                    return;
+                    try {
+                        m.invoke(object, parameters[i]);
+                    }
+                    catch (InvocationTargetException e) {
+                        // thrown by the underlying method, we ignore this exception
+                        // and still return true because we could invoke the method
+                    }
+                    return true;
                 }
             }
             catch (Exception e) {
                 // ignore any exception and keep looking for a method
             }
-            Class c = clazz.getSuperclass();
-            if (c != null) {
-                invokeMethod(object, c, name, signatures, parameters, true);
-            }
         }
+        return false;
     }
     
     // ----- CREATION