Class Coercions

java.lang.Object
org.apache.commons.el.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 BigDecimal, coerce both to BigDecimal and then:
          if operator is +, return A.add(B)
          if operator is -, return A.subtract(B)
          if operator is *, return A.multiply(B)
        if A or B is Float, Double, or String containing ".", "e", or "E"
          if A or B is BigInteger, coerce both A and B to BigDecimal and apply operator
          coerce both A and B to Double and apply operator
        if A or B is BigInteger, coerce both to BigInteger and then:
          if operator is +, return A.add(B)
          if operator is -, return A.subtract(B)
          if operator is *, return A.multiply(B)
        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
        if A or B is a BigDecimal or BigInteger, coerce both to BigDecimal and
         return A.divide(B, BigDecimal.ROUND_HALF_UP)
        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 BigDecimal, Float, Double, or String containing ".", "e" or "E"
          coerce both to Double
          apply operator
        if A or B is BigInteger, coerce both to BigInteger and return
         A.remainder(B)
        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 BigInteger or BigDecimal, return A.negate()
        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
      if A is Collection an ((Collection) 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 {invalid input: '<',>,invalid input: '<'=,>=,lt,gt,lte,gte} B
        if A==B
          if operator is >= or invalid input: '<'=
            return true
          otherwise
            return false
        if A or B is null
          return false
        if A or B is BigDecimal, coerce both A and B to BigDecimal and use the
         return value of A.compareTo(B)
        if A or B is Float or Double
          coerce both A and B to Double
          apply operator
        if A or B is BigInteger, coerce both A and B to BigInteger and use the
         return value of A.compareTo(B)
        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 BigDecimal, coerce both A and B to BigDecimal and then:
          if operator is == or eq, return A.equals(B)
          if operator is != or ne, return !A.equals(B)
        if A or B is Float or Double
          coerce both A and B to Double
          apply operator
        if A or B is BigInteger, coerce both A and B to BigInteger and then:
          if operator is == or eq, return A.equals(B)
          if operator is != or ne, return !A.equals(B)
        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 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, coerce quietly to type N using the following algorithm
            If N is BigInteger
                If A is BigDecimal, return A.toBigInteger()
                Otherwise, return BigInteger.valueOf(A.longValue())
           if N is BigDecimal
                If A is a BigInteger, return new BigDecimal(A)
                Otherwise, return new BigDecimal(A.doubleValue())
           If N is Byte, return new Byte(A.byteValue())
           If N is Short, return new Short(A.shortValue())
           If N is Integer, return new Integer(A.integerValue())
           If N is Long, return new Long(A.longValue())
           If N is Float, return new Float(A.floatValue())
           If N is Double, return new Double(A.doubleValue())
           otherwise ERROR
        A is String
          If N is BigDecimal then:
               If new BigDecimal(A) throws an exception then ERROR
               Otherwise, return new BigDecimal(A)
          If N is BigInteger then:
               If new BigInteger(A) throws an exception, then ERROR
               Otherwise, return new BigInteger(A)
          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
    
Version:
$Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: luehe $
Author:
Nathan Abramson - Art Technology Group
  • Field Details

    • ZERO

      private static final Number ZERO
  • Constructor Details

    • Coercions

      public Coercions()
  • Method Details

    • coerce

      public static Object coerce(Object pValue, Class pClass, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces the given value to the specified class.
      Throws:
      javax.servlet.jsp.el.ELException
    • isNumberClass

      static boolean isNumberClass(Class pClass)
      Returns true if the given class is Byte, Short, Integer, Long, Float, Double, BigInteger, or BigDecimal
    • coerceToString

      public static String coerceToString(Object pValue, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces the specified value to a String
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToPrimitiveNumber

      public static Number coerceToPrimitiveNumber(Object pValue, Class pClass, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces a value to the given primitive number class
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToInteger

      public static Integer coerceToInteger(Object pValue, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces a value to an Integer, returning null if the coercion isn't possible.
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToPrimitiveNumber

      static Number coerceToPrimitiveNumber(long pValue, Class pClass) throws javax.servlet.jsp.el.ELException
      Coerces a long to the given primitive number class
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToPrimitiveNumber

      static Number coerceToPrimitiveNumber(double pValue, Class pClass) throws javax.servlet.jsp.el.ELException
      Coerces a double to the given primitive number class
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToPrimitiveNumber

      static Number coerceToPrimitiveNumber(Number pValue, Class pClass) throws javax.servlet.jsp.el.ELException
      Coerces a Number to the given primitive number class
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToPrimitiveNumber

      static Number coerceToPrimitiveNumber(String pValue, Class pClass) throws javax.servlet.jsp.el.ELException
      Coerces a String to the given primitive number class
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToCharacter

      public static Character coerceToCharacter(Object pValue, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces a value to a Character
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToBoolean

      public static Boolean coerceToBoolean(Object pValue, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces a value to a Boolean
      Throws:
      javax.servlet.jsp.el.ELException
    • coerceToObject

      public static Object coerceToObject(Object pValue, Class pClass, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Coerces a value to the specified Class that is not covered by any of the above cases
      Throws:
      javax.servlet.jsp.el.ELException
    • applyArithmeticOperator

      public static Object applyArithmeticOperator(Object pLeft, Object pRight, ArithmeticOperator pOperator, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      Throws:
      javax.servlet.jsp.el.ELException
    • applyRelationalOperator

      public static Object applyRelationalOperator(Object pLeft, Object pRight, RelationalOperator pOperator, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      Throws:
      javax.servlet.jsp.el.ELException
    • applyEqualityOperator

      public static Object applyEqualityOperator(Object pLeft, Object pRight, EqualityOperator pOperator, Logger pLogger) throws javax.servlet.jsp.el.ELException
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      Throws:
      javax.servlet.jsp.el.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
    • isBigInteger

      public static boolean isBigInteger(Object pObject)
      Returns true if the given object is BigInteger.
      Parameters:
      pObject - - Object to evaluate
      Returns:
      - true if the given object is BigInteger
    • isBigDecimal

      public static boolean isBigDecimal(Object pObject)
      Returns true if the given object is BigDecimal.
      Parameters:
      pObject - - Object to evaluate
      Returns:
      - true if the given object is BigDecimal