Browse Source

finally some comparator logic that makes sense :)

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@966 50f2f4bb-b051-0410-bef5-90022cba6387
pull/1/head
Andy Clement 17 years ago
parent
commit
b46afe7e39
  1. 6
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OperatorEquality.java
  2. 7
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OperatorInequality.java
  3. 37
      org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java
  4. 4
      org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java
  5. 1
      org.springframework.expression/src/test/java/org/springframework/expression/spel/LiteralTests.java

6
org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OperatorEquality.java

@ -53,7 +53,11 @@ public class OperatorEquality extends Operator { @@ -53,7 +53,11 @@ public class OperatorEquality extends Operator {
return BooleanTypedValue.forValue(op1.intValue() == op2.intValue());
}
}
return BooleanTypedValue.forValue(state.getTypeComparator().compare(left, right) == 0);
if (left!=null && (left instanceof Comparable)) {
return BooleanTypedValue.forValue(state.getTypeComparator().compare(left, right) == 0);
} else {
return BooleanTypedValue.forValue(left==right);
}
}
}

7
org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/OperatorInequality.java

@ -53,7 +53,12 @@ public class OperatorInequality extends Operator { @@ -53,7 +53,12 @@ public class OperatorInequality extends Operator {
return BooleanTypedValue.forValue(op1.intValue() != op2.intValue());
}
}
return BooleanTypedValue.forValue(state.getTypeComparator().compare(left, right) != 0);
if (left!=null && (left instanceof Comparable)) {
return BooleanTypedValue.forValue(state.getTypeComparator().compare(left, right) != 0);
} else {
return BooleanTypedValue.forValue(left!=right);
}
}
}

37
org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeComparator.java

@ -18,6 +18,7 @@ package org.springframework.expression.spel.support; @@ -18,6 +18,7 @@ package org.springframework.expression.spel.support;
import org.springframework.expression.TypeComparator;
import org.springframework.expression.spel.SpelException;
import org.springframework.expression.spel.SpelMessages;
/**
* A simple basic TypeComparator implementation. It supports comparison of numbers and types implementing Comparable.
@ -42,36 +43,30 @@ public class StandardTypeComparator implements TypeComparator { @@ -42,36 +43,30 @@ public class StandardTypeComparator implements TypeComparator {
Number leftNumber = (Number) left;
Number rightNumber = (Number) right;
if (leftNumber instanceof Double || rightNumber instanceof Double) {
Double d1 = leftNumber.doubleValue();
Double d2 = rightNumber.doubleValue();
return d1.compareTo(d2);
}
else if (leftNumber instanceof Float || rightNumber instanceof Float) {
Float f1 = leftNumber.floatValue();
Float f2 = rightNumber.floatValue();
return f1.compareTo(f2);
}
else if (leftNumber instanceof Long || rightNumber instanceof Long) {
double d1 = leftNumber.doubleValue();
double d2 = rightNumber.doubleValue();
return Double.compare(d1,d2);
} else if (leftNumber instanceof Float || rightNumber instanceof Float) {
float f1 = leftNumber.floatValue();
float f2 = rightNumber.floatValue();
return Float.compare(f1,f2);
} else if (leftNumber instanceof Long || rightNumber instanceof Long) {
Long l1 = leftNumber.longValue();
Long l2 = rightNumber.longValue();
return l1.compareTo(l2);
}
else {
} else {
Integer i1 = leftNumber.intValue();
Integer i2 = rightNumber.intValue();
return i1.compareTo(i2);
}
}
boolean sameType = left.getClass() == right.getClass();
if (sameType) {
if (left instanceof Comparable) {
return ((Comparable) left).compareTo(right);
}
if (left instanceof Comparable) {
return ((Comparable) left).compareTo(right);
}
// TODO coerce one to be like the other?
return left==right?0:1; // identity comparison
// How do we get to this line...?
throw new SpelException(SpelMessages.NOT_COMPARABLE, left.getClass(), right.getClass());
}
public boolean canCompare(Object left, Object right) {
@ -81,7 +76,7 @@ public class StandardTypeComparator implements TypeComparator { @@ -81,7 +76,7 @@ public class StandardTypeComparator implements TypeComparator {
if (left instanceof Number && right instanceof Number) {
return true;
}
if (left.getClass() == right.getClass() && left instanceof Comparable) {
if (left instanceof Comparable) {
return true;
}
return false;

4
org.springframework.expression/src/test/java/org/springframework/expression/spel/DefaultComparatorUnitTests.java

@ -77,6 +77,8 @@ public class DefaultComparatorUnitTests extends TestCase { @@ -77,6 +77,8 @@ public class DefaultComparatorUnitTests extends TestCase {
assertTrue(comparator.canCompare(2,1));
assertTrue(comparator.canCompare("abc","def"));
assertFalse(comparator.canCompare("abc",3));
assertTrue(comparator.canCompare("abc",3));
assertFalse(comparator.canCompare(String.class,3));
}
}

1
org.springframework.expression/src/test/java/org/springframework/expression/spel/LiteralTests.java

@ -55,6 +55,7 @@ public class LiteralTests extends ExpressionTestCase { @@ -55,6 +55,7 @@ public class LiteralTests extends ExpressionTestCase {
public void testLiteralString04() {
evaluate("'Tony''s Pizza'", "Tony's Pizza", String.class);
evaluate("'Tony\\r''s Pizza'", "Tony\\r's Pizza", String.class);
}
public void testLiteralString05() {

Loading…
Cancel
Save