You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Dmitri Blinov (JIRA)" <ji...@apache.org> on 2016/06/07 15:35:20 UTC
[jira] [Commented] (JEXL-199) An Update to the Add Method
[ https://issues.apache.org/jira/browse/JEXL-199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15318691#comment-15318691 ]
Dmitri Blinov commented on JEXL-199:
------------------------------------
In Jexl 3.0 there is a possibility to subclass the JexlArithmetic class and implement a method *add* for example
{code}
public class SpringJadeArithmetic extends JexlArithmetic {
public CharSequence add(CharSequence a, Boolean b) {
if (b == null)
return a;
if (a == null)
a = "";
return a + String.valueOf(b);
}
{code}
By the way, you can overload this method with other types, for example numbers, and you can overload other operators as well, except logical (and/or) ones.
> An Update to the Add Method
> ---------------------------
>
> Key: JEXL-199
> URL: https://issues.apache.org/jira/browse/JEXL-199
> Project: Commons JEXL
> Issue Type: Improvement
> Affects Versions: 2.1.1, 3.0
> Reporter: Dagu Ward
> Priority: Critical
> Fix For: 3.0.1
>
>
> If A String and a Boolean is passed to this method, it throws an expection and just dies.
> Booleans (True or False) should be treated just like strings and just concatenated together, so that this would not cause any problems.
> Spring jade currently uses this method when it is building html, and if a boolean is used in the string, it causes the parsing to die.
> Not sure it is fully the intended purpose, so not reported as a bug, but as a nice improvement, but it sure causing me some stress.
> You can easily put the return in the finally, check for boolean or just use the string function to return the string value
> /**
> * Add two values together.
> * <p>
> * If any numeric add fails on coercion to the appropriate type,
> * treat as Strings and do concatenation.
> * </p>
> *
> * @param left left argument
> * @param right right argument
> * @return left + right.
> */
> public Object add(Object left, Object right) {
> if (left == null && right == null) {
> return controlNullNullOperands();
> }
> /***
> Possible Fix
> if (left instanceof Boolean){
> left = (Boolean.valueOf((boolean) left).toString());
> }
> if (right instanceof Boolean){
> left = (Boolean.valueOf((boolean) right).toString());
> }
> ***/
> boolean strconcat = strict
> ? left instanceof String || right instanceof String
> : left instanceof String && right instanceof String;
> if (!strconcat) {
> try {
> // if either are bigdecimal use that type
> if (left instanceof BigDecimal || right instanceof BigDecimal) {
> BigDecimal l = toBigDecimal(left);
> BigDecimal r = toBigDecimal(right);
> BigDecimal result = l.add(r, getMathContext());
> return narrowBigDecimal(left, right, result);
> }
> // if either are floating point (double or float) use double
> if (isFloatingPointNumber(left) || isFloatingPointNumber(right)) {
> double l = toDouble(left);
> double r = toDouble(right);
> return l + r;
> }
> // otherwise treat as integers
> BigInteger l = toBigInteger(left);
> BigInteger r = toBigInteger(right);
> BigInteger result = l.add(r);
> return narrowBigInteger(left, right, result);
> } catch (java.lang.NumberFormatException nfe) {
> if (left == null || right == null) {
> controlNullOperand();
> }
> }
> }
> return toString(left).concat(toString(right));
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)