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/09/04 22:27:46 UTC

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

Author: marrs
Date: Mon Sep  4 13:27:45 2006
New Revision: 440172

URL: http://svn.apache.org/viewvc?view=rev&rev=440172
Log:
FELIX-137 Implemented a new algorithm to invoke a callback method. This one should be able to discover all methods in a class and its superclasses (except for private methods in superclasses).

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=440172&r1=440171&r2=440172
==============================================================================
--- 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 Mon Sep  4 13:27:45 2006
@@ -19,6 +19,7 @@
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.Proxy;
 
 import org.osgi.framework.BundleContext;
@@ -247,56 +248,32 @@
         return callbackInstance;
     }
     
-    // TODO a lot of things in this method can be cached instead of done each time
-    // TODO Richard had an example where he could not invoke a private method
     private void invokeCallbackMethod(Object instance, String methodName, ServiceReference reference, Object service) throws NoSuchMethodException {
-        Method method = null;
-        Class clazz = instance.getClass();
-        while (clazz != null) {
-	        AccessibleObject.setAccessible(clazz.getDeclaredMethods(), true);
-	        try {
-	            try {
-	                method = clazz.getDeclaredMethod(methodName, new Class[] {ServiceReference.class, Object.class});
-	                method.invoke(instance, new Object[] {reference, service});
-	                return;
-	            }
-	            catch (NoSuchMethodException e) {
-	                try {
-	                    method = clazz.getDeclaredMethod(methodName, new Class[] {ServiceReference.class});
-	                    method.invoke(instance, new Object[] {reference});
-	                    return;
-	                } 
-	                catch (NoSuchMethodException e1) {
-	                    try {
-	                        method = clazz.getDeclaredMethod(methodName, new Class[] {Object.class});
-	                        method.invoke(instance, new Object[] {service});
-	                        return;
-	                    } 
-	                    catch (NoSuchMethodException e2) {
-	                        try {
-	                            method = clazz.getDeclaredMethod(methodName, new Class[] {m_trackedServiceName});
-	                            method.invoke(instance, new Object[] {service});
-	                            return;
-	                        } 
-	                        catch (NoSuchMethodException e3) {
-	                            method = clazz.getDeclaredMethod(methodName, null);
-	                            method.invoke(instance, null);
-	                            return;
-	                        }
-	                    }
-	                }
-	            }
-	        } 
-	        catch (IllegalArgumentException e1) {
-	        	// ignore this exception
-	        } 
-	        catch (IllegalAccessException e1) {
-	        	// ignore this exception
-	        } 
-	        catch (InvocationTargetException e1) {
-	        	// ignore this exception
-	        }
-	        clazz = clazz.getSuperclass();
+        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);
+    }
+
+    private void 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];
+            try {
+                m = clazz.getDeclaredMethod(name, signature);
+                if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
+                    m.setAccessible(true);
+                    m.invoke(object, parameters[i]);
+                    return;
+                }
+            }
+            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);
+            }
         }
     }