org.apache.taglibs.standard.lang.jstl
Class Coercions

java.lang.Object
  extended by org.apache.taglibs.standard.lang.jstl.Coercions

public class Coercions
extends Object

This class contains the logic for coercing data types before operators are applied to them.

The following is the list of rules applied for various type conversions.

 Applying arithmetic operator
   Binary operator - A {+,-,*} B
     if A and B are null
       return 0
     if A or B is Float, Double, or String containing ".", "e", or "E"
       coerce both A and B to Double
       apply operator
     otherwise
       coerce both A and B to Long
       apply operator
     if operator results in exception (such as divide by 0), error

   Binary operator - A {/,div} B
     if A and B are null
       return 0
     otherwise
       coerce both A and B to Double
       apply operator
     if operator results in exception (such as divide by 0), error

   Binary operator - A {%,mod} B
     if A and B are null
       return 0
     if A or B is Float, Double, or String containing ".", "e" or "E"
       coerce both to Double
       apply operator
     otherwise
       coerce both A and B to Long
       apply operator
     if operator results in exception (such as divide by 0), error

   Unary minus operator - -A
     if A is null
       return 0
     if A is String
       if A contains ".", "e", or "E"
         coerce to Double, apply operator
       otherwise
         coerce to a Long and apply operator
     if A is Byte,Short,Integer,Long,Float,Double
       retain type, apply operator
     if operator results in exception, error
     otherwise
       error

 Applying "empty" operator - empty A
   if A is null
     return true
   if A is zero-length String
     return true
   if A is zero-length array
     return true
   if A is List and ((List) A).isEmpty()
     return true
   if A is Map and ((Map) A).isEmpty()
     return true
   otherwise
     return false

 Applying logical operators
   Binary operator - A {and,or} B
     coerce both A and B to Boolean, apply operator
   NOTE - operator stops as soon as expression can be determined, i.e.,
     A and B and C and D - if B is false, then only A and B is evaluated
   Unary not operator - not A
     coerce A to Boolean, apply operator

 Applying relational operator
   A {<,>,<=,>=,lt,gt,lte,gte} B
     if A==B
       if operator is >= or <=
         return true
       otherwise
         return false
     if A or B is null
       return false
     if A or B is Float or Double
       coerce both A and B to Double
       apply operator
     if A or B is Byte,Short,Character,Integer,Long
       coerce both A and B to Long
       apply operator
     if A or B is String
       coerce both A and B to String, compare lexically
     if A is Comparable
       if A.compareTo (B) throws exception
         error
       otherwise
         use result of A.compareTo(B)
     if B is Comparable
       if B.compareTo (A) throws exception
         error
       otherwise
         use result of B.compareTo(A)
     otherwise
       error

 Applying equality operator
   A {==,!=} B
     if A==B
       apply operator
     if A or B is null
       return false for ==, true for !=
     if A or B is Float or Double
       coerce both A and B to Double
       apply operator
     if A or B is Byte,Short,Character,Integer,Long
       coerce both A and B to Long
       apply operator
     if A or B is Boolean
       coerce both A and B to Boolean
       apply operator
     if A or B is String
       coerce both A and B to String, compare lexically
     otherwise
       if an error occurs while calling A.equals(B)
         error
       apply operator to result of A.equals(B)

 coercions

   coerce A to String
     A is String
       return A
     A is null
       return ""
     A.toString throws exception
       error
     otherwise
       return A.toString

   coerce A to primitive Number type N
     A is null or ""
       return 0
     A is Character
       convert to short, apply following rules
     A is Boolean
       error
     A is Number type N
       return A
     A is Number with less precision than N
       coerce quietly
     A is Number with greater precision than N
       coerce quietly
     A is String
       new N.valueOf(A) throws exception
         error
       return N.valueOf(A)
     otherwise
       error

   coerce A to Character should be
     A is null or ""
       return (char) 0
     A is Character
       return A
     A is Boolean
       error
     A is Number with less precision than short
       coerce quietly - return (char) A
     A is Number with greater precision than short
       coerce quietly - return (char) A
     A is String
       return A.charAt (0)
     otherwise
       error

   coerce A to Boolean
     A is null or ""
       return false
     A is Boolean
       return A
     A is String
       Boolean.valueOf(A) throws exception
         error
       return Boolean.valueOf(A)
     otherwise
       error

   coerce A to any other type T
     A is null
       return null
     A is assignable to T
       coerce quietly
     A is String
       T has no PropertyEditor
         if A is "", return null
         otherwise error
       T's PropertyEditor throws exception
         if A is "", return null
         otherwise error
       otherwise
         apply T's PropertyEditor
     otherwise
       error
 

Author:
Nathan Abramson - Art Technology Group

Constructor Summary
Coercions()
           
 
Method Summary
static Object applyArithmeticOperator(Object pLeft, Object pRight, ArithmeticOperator pOperator, Logger pLogger)
          Performs all of the necessary type conversions, then calls on the appropriate operator.
static Object applyEqualityOperator(Object pLeft, Object pRight, EqualityOperator pOperator, Logger pLogger)
          Performs all of the necessary type conversions, then calls on the appropriate operator.
static Object applyRelationalOperator(Object pLeft, Object pRight, RelationalOperator pOperator, Logger pLogger)
          Performs all of the necessary type conversions, then calls on the appropriate operator.
static Object coerce(Object pValue, Class pClass, Logger pLogger)
          Coerces the given value to the specified class.
static Boolean coerceToBoolean(Object pValue, Logger pLogger)
          Coerces a value to a Boolean
static Character coerceToCharacter(Object pValue, Logger pLogger)
          Coerces a value to a Character
static Integer coerceToInteger(Object pValue, Logger pLogger)
          Coerces a value to an Integer, returning null if the coercion isn't possible.
static Object coerceToObject(Object pValue, Class pClass, Logger pLogger)
          Coerces a value to the specified Class that is not covered by any of the above cases
static Number coerceToPrimitiveNumber(Object pValue, Class pClass, Logger pLogger)
          Coerces a value to the given primitive number class
static String coerceToString(Object pValue, Logger pLogger)
          Coerces the specified value to a String
static boolean isFloatingPointString(Object pObject)
          Returns true if the given string might contain a floating point number - i.e., it contains ".", "e", or "E"
static boolean isFloatingPointType(Class pClass)
          Returns true if the given class is of a floating point type
static boolean isFloatingPointType(Object pObject)
          Returns true if the given Object is of a floating point type
static boolean isIntegerType(Class pClass)
          Returns true if the given class is of an integer type
static boolean isIntegerType(Object pObject)
          Returns true if the given Object is of an integer type
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Coercions

public Coercions()
Method Detail

coerce

public static Object coerce(Object pValue,
                            Class pClass,
                            Logger pLogger)
                     throws ELException
Coerces the given value to the specified class.

Throws:
ELException

coerceToString

public static String coerceToString(Object pValue,
                                    Logger pLogger)
                             throws ELException
Coerces the specified value to a String

Throws:
ELException

coerceToPrimitiveNumber

public static Number coerceToPrimitiveNumber(Object pValue,
                                             Class pClass,
                                             Logger pLogger)
                                      throws ELException
Coerces a value to the given primitive number class

Throws:
ELException

coerceToInteger

public static Integer coerceToInteger(Object pValue,
                                      Logger pLogger)
                               throws ELException
Coerces a value to an Integer, returning null if the coercion isn't possible.

Throws:
ELException

coerceToCharacter

public static Character coerceToCharacter(Object pValue,
                                          Logger pLogger)
                                   throws ELException
Coerces a value to a Character

Throws:
ELException

coerceToBoolean

public static Boolean coerceToBoolean(Object pValue,
                                      Logger pLogger)
                               throws ELException
Coerces a value to a Boolean

Throws:
ELException

coerceToObject

public static Object coerceToObject(Object pValue,
                                    Class pClass,
                                    Logger pLogger)
                             throws ELException
Coerces a value to the specified Class that is not covered by any of the above cases

Throws:
ELException

applyArithmeticOperator

public static Object applyArithmeticOperator(Object pLeft,
                                             Object pRight,
                                             ArithmeticOperator pOperator,
                                             Logger pLogger)
                                      throws ELException
Performs all of the necessary type conversions, then calls on the appropriate operator.

Throws:
ELException

applyRelationalOperator

public static Object applyRelationalOperator(Object pLeft,
                                             Object pRight,
                                             RelationalOperator pOperator,
                                             Logger pLogger)
                                      throws ELException
Performs all of the necessary type conversions, then calls on the appropriate operator.

Throws:
ELException

applyEqualityOperator

public static Object applyEqualityOperator(Object pLeft,
                                           Object pRight,
                                           EqualityOperator pOperator,
                                           Logger pLogger)
                                    throws ELException
Performs all of the necessary type conversions, then calls on the appropriate operator.

Throws:
ELException

isFloatingPointType

public static boolean isFloatingPointType(Object pObject)
Returns true if the given Object is of a floating point type


isFloatingPointType

public static boolean isFloatingPointType(Class pClass)
Returns true if the given class is of a floating point type


isFloatingPointString

public static boolean isFloatingPointString(Object pObject)
Returns true if the given string might contain a floating point number - i.e., it contains ".", "e", or "E"


isIntegerType

public static boolean isIntegerType(Object pObject)
Returns true if the given Object is of an integer type


isIntegerType

public static boolean isIntegerType(Class pClass)
Returns true if the given class is of an integer type



Copyright © 2001-2015 The Apache Software Foundation. All Rights Reserved.