[jboss-svn-commits] JBL Code SVN: r7022 - labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 23 10:49:58 EDT 2006


Author: mark.proctor at jboss.com
Date: 2006-10-23 10:49:57 -0400 (Mon, 23 Oct 2006)
New Revision: 7022

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/MethodResolver.java
Log:
-Temporarily restored MethodResolver to make things compile

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/MethodResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/MethodResolver.java	2006-10-23 14:48:53 UTC (rev 7021)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/MethodResolver.java	2006-10-23 14:49:57 UTC (rev 7022)
@@ -0,0 +1,166 @@
+package org.drools.semantics.java;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.resolvers.LiteralValue;
+import org.drools.base.resolvers.ValueHandler;
+
+/**
+ * Determines the method to call, based on the given values
+ *
+ */
+public class MethodResolver {
+
+    private final Class  clazz;
+    private final String name;
+    private boolean      staticMethod;
+
+    public MethodResolver(Class clazz,
+                          String name) {
+        super();
+        this.clazz = clazz;
+        this.name = name;
+    }
+
+    public Class getClazz() {
+        return this.clazz;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public boolean isStaticMethod() {
+        return this.staticMethod;
+    }
+
+    public Method resolveMethod(ValueHandler[] params) {
+        Class[]  classes  = new Class[params.length];
+        for ( int i = 0, length  = params.length; i  < length; i++ )  {
+            classes[i]   = params[i].getExtractToClass();
+        }
+        
+        return  resolveMethod(classes);
+    }
+    
+    public Method resolveMethod(Class[] params) {
+        Method method = null;
+        
+        boolean allDefined = true;
+
+        //check for null params, so we know if all the types are defined
+        for ( int i = 0, length = params.length; i < length; i++ ) {
+            if ( params[i] == null ) {
+                allDefined = false;
+            }
+        } 
+        
+        if ( allDefined ) {
+            method = getMethod( this.clazz,
+                                this.name,
+                                params );
+        } else {
+            // For some reason all the types are not specified, so just match the first method with the same
+            // number of arguments
+            Method[] methods = getMethods( this.clazz, this.name, params.length );
+            if ( methods != null && methods.length != 0 ) {
+                method = methods[0];
+            }
+        }
+        
+        
+        if ( method != null && (method.getModifiers() & Modifier.STATIC) == Modifier.STATIC ) {
+            this.staticMethod = true;
+        }
+
+// @todo We could potentially output a warning here        
+//        if ( (method.getModifiers() & Modifier.PUBLIC) != Modifier.PUBLIC ) {
+//            throw new RuntimeDroolsException( "Unable to call the private method [" + name + "] on class [" + clazz.getName() + "] for parameters " + arrayToString( params ) );
+//        }
+        return method;
+    }
+
+    /**
+     * work out what method we will be calling at runtime, based on the name and number of parameters.
+     */
+    private Method getMethod(Class clazz,
+                             String methodName,
+                             Class[] args) {   
+
+        // Fist get methods with same number of arguments
+        Method[] methods = getMethods( clazz, methodName, args.length );
+        if ( methods.length == 0 ) {
+            return null;
+        }
+
+        // now iterate to find correct method
+        for ( int i = 0, length = methods.length; i < length; i++ ) {
+            if ( matchesTypes( methods[i].getParameterTypes(),
+                               args ) ) {
+                return methods[i];
+            }
+        }
+        
+        // Casting hasn't worked, so just return the first method with the same number of params
+        return methods[0];
+    }
+    
+    private Method[] getMethods(Class clazz,
+                                String methodName,
+                                int length) {
+        List list = new ArrayList();     
+        Method[] methods = clazz.getMethods();
+        for ( int i = 0; i < methods.length; i++ ) {
+            if ( methods[i].getName().equals( methodName ) ) {
+                if ( methods[i].getParameterTypes().length == length ) {
+                    list.add( methods[i] );
+                }
+            }
+        }     
+        return ( Method[] ) list.toArray( new Method[ list.size() ] );
+    }
+
+    private boolean matchesTypes(Class[] methodClasses,
+                                 Class[] argumentClasses) {
+        for ( int i = 0, length = methodClasses.length; i < length; i++ ) {
+            Class methodClass = methodClasses[i];
+            Class argumentClass = argumentClasses[i];
+            if ( methodClasses[i].isPrimitive() ) {
+                // try matching to primitive
+                if ( methodClass == int.class && argumentClass == Integer.class ) {
+                    continue;
+                } else if ( methodClass == long.class && argumentClass == Long.class ) {
+                    continue;
+                } else if ( methodClass == float.class && argumentClass == Float.class ) {
+                    continue;
+                } else if ( methodClass == double.class && argumentClass == Double.class ) {
+                    continue;
+                } else {
+                    return false;
+                }
+            } else if ( methodClasses[i] != argumentClasses[i] ) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private String arrayToString(Object[] values) {
+        StringBuffer args = new StringBuffer();
+        for ( int i = 0, length = values.length; i < length; i++ ) {
+            args.append( "[" );
+            args.append( values[i].getClass() );
+            args.append( "]" );
+            if ( i < length - 1 ) {
+                args.append( ", " );
+            }
+        }
+        return args.toString();
+    }
+    
+}




More information about the jboss-svn-commits mailing list