Author: henrib
Date: Thu Sep  8 16:00:32 2011
New Revision: 1166773

URL: http://svn.apache.org/viewvc?rev=1166773&view=rev
Log:
Fixed issue due to elvis operator not coercing the condition to boolean using 
the JexlArithmetic instance

Modified:
    
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
    
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
    commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IfTest.java

Modified: 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java?rev=1166773&r1=1166772&r2=1166773&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
 (original)
+++ 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
 Thu Sep  8 16:00:32 2011
@@ -1348,7 +1348,7 @@ public class Interpreter implements Pars
                 return node.jjtGetChild(2).jjtAccept(this, data);
             }
         }
-        if (condition != null && !Boolean.FALSE.equals(condition)) {
+        if (condition != null && arithmetic.toBoolean(condition)) {
             return condition;
         } else {
             return node.jjtGetChild(1).jjtAccept(this, data);

Modified: 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java?rev=1166773&r1=1166772&r2=1166773&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
 (original)
+++ 
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
 Thu Sep  8 16:00:32 2011
@@ -744,7 +744,8 @@ public class JexlArithmetic {
             double number = toDouble(val);
             return !Double.isNaN(number) && number != 0.d;
         } else if (val instanceof String) {
-            return Boolean.valueOf((String) val).booleanValue();
+            String strval = val.toString();
+            return strval.length() > 0 && !"false".equals(strval);
         }
         // TODO: is this a reasonable default?
         return false;

Modified: 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IfTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IfTest.java?rev=1166773&r1=1166772&r2=1166773&view=diff
==============================================================================
--- 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IfTest.java 
(original)
+++ 
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IfTest.java 
Thu Sep  8 16:00:32 2011
@@ -251,6 +251,62 @@ public class IfTest extends JexlTestCase
             o = jc.get("x.y.z");
             assertEquals("Should be quux", "quux", o);
         }
+        
+        jc.set("foo", Double.NaN);
+
+        for (int l = 0; l < 4; ++l) {
+            jexl.setLenient((l & 1) != 0);
+            jexl.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            assertEquals("Should be quux", "quux", o);
+        }
+                
+        jc.set("foo", "");
+
+        for (int l = 0; l < 4; ++l) {
+            jexl.setLenient((l & 1) != 0);
+            jexl.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            assertEquals("Should be quux", "quux", o);
+        }
+                        
+        jc.set("foo", "false");
+
+        for (int l = 0; l < 4; ++l) {
+            jexl.setLenient((l & 1) != 0);
+            jexl.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            assertEquals("Should be quux", "quux", o);
+        }               
+        
+        jc.set("foo", 0d);
+
+        for (int l = 0; l < 4; ++l) {
+            jexl.setLenient((l & 1) != 0);
+            jexl.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            assertEquals("Should be quux", "quux", o);
+        }
+                
+        jc.set("foo", 0);
+
+        for (int l = 0; l < 4; ++l) {
+            jexl.setLenient((l & 1) != 0);
+            jexl.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            assertEquals("Should be quux", "quux", o);
+        }
+
 
         jc.set("foo", "bar");
 
@@ -265,4 +321,5 @@ public class IfTest extends JexlTestCase
 
         debuggerCheck(jexl);
     }
+
 }


Reply via email to