You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2006/02/15 00:48:30 UTC
svn commit: r377890 -
/jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java
Author: dion
Date: Tue Feb 14 15:48:29 2006
New Revision: 377890
URL: http://svn.apache.org/viewcvs?rev=377890&view=rev
Log:
Remove 'unwiden'ing of numeric values which was introduced to
fix Bug 32829.
A better solution is to fix the ASTMethod class to narrow the parameters,
rather than change JEXL's public 'contract' of using Long's for integer values.
Modified:
jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java
Modified: jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java?rev=377890&r1=377889&r2=377890&view=diff
==============================================================================
--- jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java (original)
+++ jakarta/commons/proper/jexl/trunk/src/java/org/apache/commons/jexl/parser/ASTMethod.java Tue Feb 14 15:48:29 2006
@@ -54,9 +54,24 @@
}
VelMethod vm = Introspector.getUberspect().getMethod(obj, methodName, params, DUMMY);
-
+ /*
+ * DG: If we can't find an exact match, narrow the parameters and try again!
+ */
if (vm == null)
- return null;
+ {
+
+ // replace all numbers with the smallest type that will fit
+ for (int i = 0; i < params.length; i++)
+ {
+ Object param = params[i];
+ if (param instanceof Number)
+ {
+ params[i] = narrow((Number)param);
+ }
+ }
+ vm = Introspector.getUberspect().getMethod(obj, methodName, params, DUMMY);
+ if (vm == null) return null;
+ }
return vm.invoke(obj, params);
}
@@ -72,4 +87,53 @@
throw e;
}
}
+
+ /**
+ * Given a Number, return back the value using the smallest type the result will fit into.
+ * This works hand in hand with parameter 'widening' in java method calls,
+ * e.g. a call to substring(int,int) with an int and a long will fail, but
+ * a call to substring(int,int) with an int and a short will succeed.
+ * @since 1.0.1
+ */
+ private Number narrow(Number original)
+ {
+ if (original == null) return null;
+ Number result = null;
+ if (original instanceof Double || original instanceof Float)
+ {
+ double value = result.doubleValue();
+ if (value <= Float.MAX_VALUE && value >= Float.MIN_VALUE)
+ {
+ result = new Float(result.floatValue());
+ }
+ else
+ {
+ // it was a double
+ result = original;
+ }
+ }
+ else
+ {
+ long value = original.longValue();
+ if (value <= Byte.MAX_VALUE && value >= Byte.MIN_VALUE)
+ {
+ // it will fit in a byte
+ result = new Byte((byte)value);
+ }
+ else if (value <= Short.MAX_VALUE && value >= Short.MIN_VALUE)
+ {
+ result = new Short((short)value);
+ }
+ else if (value <= Integer.MAX_VALUE && value >= Integer.MIN_VALUE)
+ {
+ result = new Integer((int)value);
+ }
+ else
+ {
+ result = original;
+ }
+ }
+ return result;
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org