Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / InstanceUtils.java @ 47378

History | View | Annotate | Download (4.46 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.lang.reflect.Method;
4
import org.apache.commons.lang3.StringUtils;
5

    
6

    
7
/**
8
 *
9
 * @author jjdelcerro
10
 */
11
public class InstanceUtils {
12
    
13
    public static Object callmethod(Object instance, String methodName, Object args[]) throws Exception {
14
        if( StringUtils.isBlank(methodName) ) {
15
            throw new NullPointerException("A method name was expected to invoke and a null was received");
16
        }
17
        if( instance==null ) {
18
            throw new NullPointerException("An object pointer was expected to invoke method "+methodName+" and a null was received");
19
        }
20
        Class<?> theClass = instance.getClass();
21
        Method method = getMethod(theClass, methodName, createParameterTypesAccurate(args));
22
        if( method == null ) {
23
            method = getMethod(theClass, methodName, createParameterTypesFuzzy(theClass, methodName, args));
24
        }
25
        if( method == null ) {
26
            method = getMethod(theClass, methodName, createParameterTypesAllObjects(args));
27
        }
28
        if( method == null ) {
29
            method = getMethod(theClass, methodName, createParameterTypesFromMethodNameAndParametersCount(theClass, methodName, args));
30
        }
31
        Object value = method.invoke(instance, args);
32
        return value;
33
    }
34
    
35
    private static Method getMethod(Class theClass, String methodName, Class[] parameterTypes) {
36
        if( parameterTypes==null ) {
37
            return null;
38
        }
39
        try {
40
            return theClass.getMethod(methodName, parameterTypes);
41
        } catch(NoSuchMethodException ex) {
42
        }
43
        return null;
44
    }
45
    
46
    private static Class[] createParameterTypesAccurate(Object[] parameters) {
47
        Class[] parameterTypes = new Class[parameters.length];
48
        for (int i = 0; i < parameters.length; i++) {
49
            Object parameter = parameters[i];
50
            parameters[i] = parameter;
51
            if( parameter==null ) {
52
                parameterTypes[i] = null;
53
            } else {
54
                parameterTypes[i] = parameter.getClass();
55
            }
56
        }
57
        return parameterTypes;
58
    }
59
    
60
    private static Class[] createParameterTypesAllObjects(Object[] parameters) {
61
        Class[] parameterTypes = new Class[parameters.length];
62
        for (int i = 0; i < parameters.length; i++) {
63
            Object parameter = parameters[i];
64
            parameters[i] = parameter;
65
            if( parameter==null ) {
66
                parameterTypes[i] = null;
67
            } else {
68
                parameterTypes[i] = Object.class;
69
            }
70
        }
71
        return parameterTypes;
72
    }
73
    
74
    private static Class[] createParameterTypesFromMethodNameAndParametersCount(Class theClass, String methodName, Object[] parameters) {
75
        for (Method m : theClass.getMethods()) {
76
            if( StringUtils.equals(m.getName(), methodName) && parameters.length == m.getParameterTypes().length) {
77
                return m.getParameterTypes();
78
            }
79
        }
80
        return null;
81
    }
82
    
83
    private static Class[] createParameterTypesFuzzy(Class theClass, String methodName, Object[] parameters) {
84
        for (Method m : theClass.getMethods()) {
85
            if( StringUtils.equals(m.getName(), methodName) && parameters.length == m.getParameterTypes().length) {
86
                int n = 0;
87
                Class[] parameterTypes = new Class[parameters.length];
88
                for (Class<?> expectedType : m.getParameterTypes()) {
89
                    Class<? extends Object> paramType = parameters[n].getClass();
90
                    if( expectedType == paramType ) {
91
                        parameterTypes[n++] = expectedType;
92
                        continue;
93
                    }
94
                    if( expectedType == Object.class ) {
95
                        parameterTypes[n++] = Object.class;
96
                        continue;
97
                    }
98
                    
99
                    //
100
                    // Aqui probablemente habria que hacer algunas otras 
101
                    // comprobaciones, por ejemplo, si expected es double y
102
                    // recibimos un entero, long o float... ? deberiamos
103
                    // aceptar ? ? Habria que convertir el valor a double ?
104
                    //
105
                    parameterTypes = null;
106
                    break;
107
                }
108
                if( parameterTypes!=null ) {
109
                    return parameterTypes;
110
                }
111
            }
112
        }
113
        return null;
114
    }
115
    
116
    
117
    
118
}