[jboss-cvs] JBossAS SVN: r80194 - in projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors: lang and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Oct 29 10:36:15 EDT 2008


Author: wolfc
Date: 2008-10-29 10:36:14 -0400 (Wed, 29 Oct 2008)
New Revision: 80194

Modified:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java
Log:
EJBTHREE-1556: find a correct declared method taking the parameters into account

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java	2008-10-29 13:30:04 UTC (rev 80193)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/direct/AbstractDirectContainer.java	2008-10-29 14:36:14 UTC (rev 80194)
@@ -126,7 +126,16 @@
    @SuppressWarnings("unchecked")
    public <R> R invoke(BeanContext<T> target, String methodName, Object ... args) throws Throwable
    {
-      Method method = ClassHelper.getMethod(target.getInstance().getClass(), methodName);
+      Method method;
+      if(args != null)
+      {
+         Class<?> params[] = new Class<?>[args.length];
+         for(int i = 0; i < params.length; i++)
+            params[i] = args[i].getClass();
+         method = ClassHelper.getMethod(target.getInstance().getClass(), methodName, params);
+      }
+      else
+         method = ClassHelper.getMethod(target.getInstance().getClass(), methodName);
       return (R) invoke(target, method, args);
    }
    

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java	2008-10-29 13:30:04 UTC (rev 80193)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/lang/ClassHelper.java	2008-10-29 14:36:14 UTC (rev 80194)
@@ -24,6 +24,7 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,6 +37,40 @@
  */
 public class ClassHelper
 {
+   private static Map<Class<?>, Class<?>> primitiveWrapperMap = new HashMap<Class<?>, Class<?>>();
+   static
+   {
+      primitiveWrapperMap.put(Boolean.TYPE, Boolean.class);
+      primitiveWrapperMap.put(Byte.TYPE, Byte.class);
+      primitiveWrapperMap.put(Character.TYPE, Character.class);
+      primitiveWrapperMap.put(Short.TYPE, Short.class);
+      primitiveWrapperMap.put(Integer.TYPE, Integer.class);
+      primitiveWrapperMap.put(Long.TYPE, Long.class);
+      primitiveWrapperMap.put(Double.TYPE, Double.class);
+      primitiveWrapperMap.put(Float.TYPE, Float.class);
+      primitiveWrapperMap.put(Void.TYPE, Void.TYPE);
+   }
+
+   private static boolean checkParameters(Class<?> parameterTypes[], Class<?> methodParameterTypes[])
+   {
+      if(parameterTypes.length != methodParameterTypes.length)
+         return false;
+      for(int i = 0; i < parameterTypes.length; i++)
+      {
+         Class<?> methodParameterType = methodParameterTypes[i];
+         if(methodParameterType.isPrimitive())
+            methodParameterType = primitiveWrapperMap.get(methodParameterType);
+         Class<?> parameterType = parameterTypes[i];
+         if(parameterType.isPrimitive())
+            parameterType = primitiveWrapperMap.get(parameterType);
+         if(!methodParameterType.isAssignableFrom(parameterType))
+         {
+            return false;
+         }
+      }
+      return true;
+   }
+   
    /**
     * Returns all public, private and package protected methods including
     * inherited ones.
@@ -101,13 +136,27 @@
       Method m = getDeclaredMethod(cls, methodName, params);
       if (m == null)
       {
-         throw new NoSuchMethodException("No method named " + methodName + " in " + cls + " (or super classes)");
+         throw new NoSuchMethodException("No method named " + methodName + "(" + (params != null ? Arrays.toString(params) : "") + ") in " + cls + " (or super classes)");
       }
       return m;
    }
    
    private static Method getDeclaredMethod(Class<?> cls, String methodName, Class<?> ... params)
    {
+      Method methods[] = cls.getDeclaredMethods();
+      for(Method method : methods)
+      {
+         if(method.getName().equals(methodName))
+         {
+            if(params == null)
+               return method;
+            Class<?> methodParameterTypes[] = method.getParameterTypes();
+            if(params.length != methodParameterTypes.length)
+               continue;
+            if(checkParameters(params, methodParameterTypes))
+               return method;
+         }
+      }
      try
       {
          return cls.getDeclaredMethod(methodName, params);




More information about the jboss-cvs-commits mailing list