Author: markt
Date: Fri Nov 27 18:20:12 2009
New Revision: 884938
URL: http://svn.apache.org/viewvc?rev=884938&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48289
Javadoc / generics fixes
Patch procided by sebb
Modified:
tomcat/trunk/java/org/apache/el/lang/ELSupport.java
tomcat/trunk/test/org/apache/el/TestELEvaluation.java
Modified: tomcat/trunk/java/org/apache/el/lang/ELSupport.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/lang/ELSupport.java?rev=884938&r1=884937&r2=884938&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/lang/ELSupport.java (original)
+++ tomcat/trunk/java/org/apache/el/lang/ELSupport.java Fri Nov 27 18:20:12 2009
@@ -50,10 +50,33 @@
}
/**
- * @param obj0
- * @param obj1
- * @return
- * @throws EvaluationException
+ * Compare two objects, after coercing to the same type if appropriate.
+ *
+ * If the objects are identical, or they are equal according to
+ * {...@link #equals(Object, Object)} then return 0.
+ *
+ * If either object is a BigDecimal, then coerce both to BigDecimal first.
+ * Similarly for Double(Float), BigInteger, and Long(Integer, Char, Short,
Byte).
+ *
+ * Otherwise, check that the first object is an instance of Comparable,
and compare
+ * against the second object. If that is null, return 1, otherwise
+ * return the result of comparing against the second object.
+ *
+ * Similarly, if the second object is Comparable, if the first is null,
return -1,
+ * else return the result of comparing against the first object.
+ *
+ * A null object is considered as:
+ * <ul>
+ * <li>ZERO when compared with Numbers</li>
+ * <li>the empty string for String compares</li>
+ * <li>Otherwise null is considered to be lower than anything else.</li>
+ * </ul>
+ *
+ * @param obj0 first object
+ * @param obj1 second object
+ * @return -1, 0, or 1 if this object is less than, equal to, or greater
than val.
+ * @throws ELException if neither object is Comparable
+ * @throws ClassCastException if the objects are not mutually comparable
*/
public final static int compare(final Object obj0, final Object obj1)
throws ELException {
@@ -83,20 +106,32 @@
if (obj0 instanceof String || obj1 instanceof String) {
return coerceToString(obj0).compareTo(coerceToString(obj1));
}
- if (obj0 instanceof Comparable) {
- return (obj1 != null) ? ((Comparable) obj0).compareTo(obj1) : 1;
- }
- if (obj1 instanceof Comparable) {
- return (obj0 != null) ? -((Comparable) obj1).compareTo(obj0) : -1;
+ if (obj0 instanceof Comparable<?>) {
+ @SuppressWarnings("unchecked")
+ final Comparable<Object> comparable = (Comparable<Object>) obj0;
+ return (obj1 != null) ? comparable.compareTo(obj1) : 1;
+ }
+ if (obj1 instanceof Comparable<?>) {
+ @SuppressWarnings("unchecked")
+ final Comparable<Object> comparable = (Comparable<Object>) obj1;
+ return (obj0 != null) ? -comparable.compareTo(obj0) : -1;
}
throw new ELException(MessageFactory.get("error.compare", obj0, obj1));
}
/**
- * @param obj0
- * @param obj1
- * @return
- * @throws EvaluationException
+ * Compare two objects for equality, after coercing to the same type if
appropriate.
+ *
+ * If the objects are identical (including both null) return true.
+ * If either object is null, return false.
+ * If either object is Boolean, coerce both to Boolean and check equality.
+ * Similarly for Enum, String, BigDecimal, Double(Float), Long(Integer,
Short, Byte, Character)
+ * Otherwise default to using Object.equals().
+ *
+ * @param obj0 the first object
+ * @param obj1 the second object
+ * @return true if the objects are equal
+ * @throws ELException
*/
public final static boolean equals(final Object obj0, final Object obj1)
throws ELException {
@@ -148,14 +183,17 @@
return null;
}
if (obj.getClass().isEnum()) {
- return (Enum) obj;
+ return (Enum<?>) obj;
}
return Enum.valueOf(type, obj.toString());
}
/**
- * @param obj
- * @return
+ * Convert an object to Boolean.
+ * Null and empty string are false.
+ * @param obj the object to convert
+ * @return the Boolean value of the object
+ * @throws IllegalArgumentException if object is not Boolean or String
*/
public final static Boolean coerceToBoolean(final Object obj)
throws IllegalArgumentException {
@@ -304,16 +342,17 @@
}
/**
+ * Coerce an object to a string
* @param obj
- * @return
+ * @return the String value of the object
*/
public final static String coerceToString(final Object obj) {
if (obj == null) {
return "";
} else if (obj instanceof String) {
return (String) obj;
- } else if (obj instanceof Enum) {
- return ((Enum) obj).name();
+ } else if (obj instanceof Enum<?>) {
+ return ((Enum<?>) obj).name();
} else {
return obj.toString();
}
@@ -377,8 +416,9 @@
}
/**
- * @param obj
- * @return
+ * Check if an array contains any {...@code null} entries.
+ * @param obj array to be checked
+ * @return true if the array contains a {...@code null}
*/
public final static boolean containsNulls(final Object[] obj) {
for (int i = 0; i < obj.length; i++) {
Modified: tomcat/trunk/test/org/apache/el/TestELEvaluation.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TestELEvaluation.java?rev=884938&r1=884937&r2=884938&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/TestELEvaluation.java (original)
+++ tomcat/trunk/test/org/apache/el/TestELEvaluation.java Fri Nov 27 18:20:12
2009
@@ -17,9 +17,13 @@
package org.apache.el;
+import java.io.File;
+import java.util.Date;
+
import javax.el.ValueExpression;
import org.apache.el.ExpressionFactoryImpl;
+import org.apache.el.lang.ELSupport;
import org.apache.jasper.el.ELContextImpl;
import junit.framework.TestCase;
@@ -47,6 +51,28 @@
assertEquals("\\", evaluateExpression("\\\\"));
}
+ private void compareBoth(String msg, int expected, Object o1, Object o2){
+ int i1 = ELSupport.compare(o1, o2);
+ int i2 = ELSupport.compare(o2, o1);
+ assertEquals(msg,expected, i1);
+ assertEquals(msg,expected, -i2);
+ }
+
+ public void testElSupportCompare(){
+ compareBoth("Nulls should compare equal", 0, null, null);
+ compareBoth("Null should compare equal to \"\"", 0, "", null);
+ compareBoth("Null should be less than File()",-1, null, new File(""));
+ compareBoth("Null should be less than Date()",-1, null, new Date());
+ compareBoth("Date(0) should be less than Date(1)",-1, new Date(0), new
Date(1));
+ try {
+ compareBoth("Should not compare",0, new Date(), new File(""));
+ fail("Expecting ClassCastException");
+ } catch (ClassCastException expected) {
+ // Expected
+ }
+ assertTrue(null == null);
+ }
+
// ************************************************************************
private String evaluateExpression(String expression) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]