Author: davsclaus
Date: Thu Feb 16 06:59:52 2012
New Revision: 1244859
URL: http://svn.apache.org/viewvc?rev=1244859&view=rev
Log:
CAMEL-5004: Improved simple langauge working with floating point numbers.
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java?rev=1244859&r1=1244858&r2=1244859&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/language/simple/SimpleTokenizer.java
Thu Feb 16 06:59:52 2012
@@ -16,7 +16,9 @@
*/
package org.apache.camel.language.simple;
+import java.awt.font.NumericShaper;
import java.util.List;
+import java.util.Locale;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.camel.language.simple.types.SimpleToken;
@@ -146,6 +148,17 @@ public final class SimpleTokenizer {
char ch = expression.charAt(index);
sb.append(ch);
index++;
+ continue;
+ }
+ // is it a dot or comma as part of a floating point number
+ boolean decimalSeparator = '.' == expression.charAt(index) ||
',' == expression.charAt(index);
+ if (decimalSeparator && sb.length() > 0) {
+ char ch = expression.charAt(index);
+ sb.append(ch);
+ index++;
+ // assume its still a digit
+ digit = true;
+ continue;
}
}
if (sb.length() > 0) {
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=1244859&r1=1244858&r2=1244859&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
Thu Feb 16 06:59:52 2012
@@ -131,6 +131,13 @@ public final class ObjectHelper {
return leftNum.compareTo(rightNum);
}
+ // also try with floating point numbers
+ Double leftDouble = converter.convertTo(Double.class, leftValue);
+ Double rightDouble = converter.convertTo(Double.class, rightValue);
+ if (leftDouble != null && rightDouble != null) {
+ return leftDouble.compareTo(rightDouble);
+ }
+
// prefer to NOT coerce to String so use the type which is not String
// for example if we are comparing String vs Integer then prefer to
coerce to Integer
// as all types can be converted to String which does not work well
for comparison
Modified:
camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java?rev=1244859&r1=1244858&r2=1244859&view=diff
==============================================================================
---
camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
(original)
+++
camel/trunk/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java
Thu Feb 16 06:59:52 2012
@@ -148,6 +148,25 @@ public class SimpleOperatorTest extends
assertPredicate("${in.header.bar} != '1'", true);
}
+ public void testFloatingNumber() throws Exception {
+ // set a String value
+ exchange.getIn().setBody("0.02");
+
+ assertPredicate("${body} > 0", true);
+ assertPredicate("${body} < 0", false);
+
+ assertPredicate("${body} > 0.00", true);
+ assertPredicate("${body} < 0.00", false);
+
+ assertPredicate("${body} > 0.01", true);
+ assertPredicate("${body} < 0.01", false);
+
+ assertPredicate("${body} > 0.02", false);
+ assertPredicate("${body} < 0.02", false);
+
+ assertPredicate("${body} == 0.02", true);
+ }
+
public void testGreaterThanOperator() throws Exception {
// string to string comparison
assertPredicate("${in.header.foo} > 'aaa'", true);
@@ -380,7 +399,7 @@ public class SimpleOperatorTest extends
assertPredicate("${in.header.foo} range 100.200", false);
fail("Should have thrown an exception");
} catch (SimpleIllegalSyntaxException e) {
- assertEquals(26, e.getIndex());
+ assertEquals(30, e.getIndex());
}
assertPredicate("${in.header.bar} range '100..200' && ${in.header.foo}
== 'abc'" , true);
@@ -417,7 +436,7 @@ public class SimpleOperatorTest extends
assertPredicate("${in.header.foo} not range 100.200", false);
fail("Should have thrown an exception");
} catch (SimpleIllegalSyntaxException e) {
- assertEquals(30, e.getIndex());
+ assertEquals(34, e.getIndex());
}
}