Author: rahul Date: Sat Aug 8 02:51:46 2009 New Revision: 802288 URL: http://svn.apache.org/viewvc?rev=802288&view=rev Log: Various MethodKey fixes: * Fix potential NPEs. * Reduce visibility of many methods * Use Void.class as a signature for null arguments * Need only one AmbiguousException Patch by Henri Biestro <hbiestro at gmail dot com>. JEXL-67
Modified: commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/IntrospectorBase.java commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodKey.java commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodMap.java Modified: commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/IntrospectorBase.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/IntrospectorBase.java?rev=802288&r1=802287&r2=802288&view=diff ============================================================================== --- commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/IntrospectorBase.java (original) +++ commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/IntrospectorBase.java Sat Aug 8 02:51:46 2009 @@ -174,7 +174,7 @@ l.add(ictor); } // try to find one - ctor = MethodKey.CONSTRUCTORS.getMostSpecific(l, key.getParameters()); + ctor = key.getMostSpecific(l); if (ctor != null) { constructorsMap.put(key, ctor); } else { Modified: commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodKey.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodKey.java?rev=802288&r1=802287&r2=802288&view=diff ============================================================================== --- commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodKey.java (original) +++ commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodKey.java Sat Aug 8 02:51:46 2009 @@ -40,7 +40,7 @@ * A key can be constructed either from arguments (array of objects) or from parameters * (array of class). * Roughly 3x faster than string key to access the map & uses less memory. - * + * * For the parameters methods: * @author <a href="mailto:jvan...@apache.org">Jason van Zyl</a> * @author <a href="mailto:b...@werken.com">Bob McWhirter</a> @@ -181,6 +181,26 @@ } /** + * Gets the most specific method that is applicable to the parameters of this key. + * @param methods a list of methods. + * @return the most specific method. + * @throws MethodKey.AmbiguousException if there is more than one. + */ + public Method getMostSpecific(List<Method> methods) { + return METHODS.getMostSpecific(methods, params); + } + + /** + * Gets the most specific constructor that is applicable to the parameters of this key. + * @param methods a list of constructors. + * @return the most specific constructor. + * @throws MethodKey.AmbiguousException if there is more than one. + */ + public Constructor<?> getMostSpecific(List<Constructor<?>> methods) { + return CONSTRUCTORS.getMostSpecific(methods, params); + } + + /** * whether a method/ctor is more specific than a previously compared one. */ private static final int MORE_SPECIFIC = 0; @@ -207,9 +227,9 @@ /** * Utility for parameters matching. - * @param <T> method or contructor + * @param <T> Method or Constructor */ - public abstract static class Parameters<T> { + private abstract static class Parameters<T> { /** * Extract the parameter types from its applicable argument. * @param app a method or constructor @@ -225,7 +245,7 @@ * @return the most specific method. * @throws MethodKey.AmbiguousException if there is more than one. */ - protected T getMostSpecific(List<T> methods, Class<?>[] classes) { + private T getMostSpecific(List<T> methods, Class<?>[] classes) { LinkedList<T> applicables = getApplicables(methods, classes); if (applicables.isEmpty()) { @@ -357,7 +377,7 @@ * formal and actual arguments matches, and argument types are assignable * to formal types through a method invocation conversion). */ - protected LinkedList<T> getApplicables(List<T> methods, Class<?>[] classes) { + private LinkedList<T> getApplicables(List<T> methods, Class<?>[] classes) { LinkedList<T> list = new LinkedList<T>(); for (Iterator<T> imethod = methods.iterator(); imethod.hasNext();) { @@ -438,13 +458,8 @@ */ private boolean isConvertible(Class<?> formal, Class<?> actual, boolean possibleVarArg) { - // if we see Void.class as the class of an argument most likely - // obtained through a MethodKey, we consider it - // as a wildcard; non primitives are thus convertible. - if (actual.equals(Void.class) && !formal.isPrimitive()) { - return true; - } - return isInvocationConvertible(formal, actual, possibleVarArg); + // if we see Void.class, the argument was null + return isInvocationConvertible(formal, actual.equals(Void.class)? null : actual, possibleVarArg); } /** @@ -458,7 +473,8 @@ */ private boolean isStrictConvertible(Class<?> formal, Class<?> actual, boolean possibleVarArg) { - return isStrictInvocationConvertible(formal, actual, possibleVarArg); + // if we see Void.class, the argument was null + return isStrictInvocationConvertible(formal, actual.equals(Void.class)? null : actual, possibleVarArg); } } @@ -531,7 +547,7 @@ /* Check for vararg conversion. */ if (possibleVarArg && formal.isArray()) { - if (actual.isArray()) { + if (actual != null && actual.isArray()) { actual = actual.getComponentType(); } return isInvocationConvertible(formal.getComponentType(), @@ -595,7 +611,7 @@ /* Check for vararg conversion. */ if (possibleVarArg && formal.isArray()) { - if (actual.isArray()) { + if (actual != null && actual.isArray()) { actual = actual.getComponentType(); } return isStrictInvocationConvertible(formal.getComponentType(), @@ -607,7 +623,7 @@ /** * The parameter matching service for methods. */ - public static final Parameters<Method> METHODS = new Parameters<Method>() { + private static final Parameters<Method> METHODS = new Parameters<Method>() { @Override protected Class<?>[] getParameterTypes(Method app) { return app.getParameterTypes(); @@ -618,7 +634,7 @@ /** * The parameter matching service for constructors. */ - public static final Parameters<Constructor<?>> CONSTRUCTORS = new Parameters<Constructor<?>>() { + private static final Parameters<Constructor<?>> CONSTRUCTORS = new Parameters<Constructor<?>>() { @Override protected Class<?>[] getParameterTypes(Constructor<?> app) { return app.getParameterTypes(); Modified: commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodMap.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodMap.java?rev=802288&r1=802287&r2=802288&view=diff ============================================================================== --- commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodMap.java (original) +++ commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/util/introspection/MethodMap.java Sat Aug 8 02:51:46 2009 @@ -122,21 +122,7 @@ if (methodList == null) { return null; } - return MethodKey.METHODS.getMostSpecific(methodList, methodKey.getParameters()); + return methodKey.getMostSpecific(methodList); } // CSON: RedundantThrows - - /** - * Simple distinguishable exception, used when - * we run across ambiguous overloading. Caught - * by the introspector. - */ - public static class AmbiguousException extends RuntimeException { - /** - * Version Id for serializable. - */ - private static final long serialVersionUID = -2314636505414551663L; - } - - } \ No newline at end of file