Class Coercions


  • public class Coercions
    extends java.lang.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 {<,>,<=,>=,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 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 Summary

      Fields 
      Modifier and Type Field Description
      private static java.lang.Number ZERO  
    • Constructor Summary

      Constructors 
      Constructor Description
      Coercions()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.Object applyArithmeticOperator​(java.lang.Object pLeft, java.lang.Object pRight, ArithmeticOperator pOperator, Logger pLogger)
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      static java.lang.Object applyEqualityOperator​(java.lang.Object pLeft, java.lang.Object pRight, EqualityOperator pOperator, Logger pLogger)
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      static java.lang.Object applyRelationalOperator​(java.lang.Object pLeft, java.lang.Object pRight, RelationalOperator pOperator, Logger pLogger)
      Performs all of the necessary type conversions, then calls on the appropriate operator.
      static java.lang.Object coerce​(java.lang.Object pValue, java.lang.Class pClass, Logger pLogger)
      Coerces the given value to the specified class.
      static java.lang.Boolean coerceToBoolean​(java.lang.Object pValue, Logger pLogger)
      Coerces a value to a Boolean
      static java.lang.Character coerceToCharacter​(java.lang.Object pValue, Logger pLogger)
      Coerces a value to a Character
      static java.lang.Integer coerceToInteger​(java.lang.Object pValue, Logger pLogger)
      Coerces a value to an Integer, returning null if the coercion isn't possible.
      static java.lang.Object coerceToObject​(java.lang.Object pValue, java.lang.Class pClass, Logger pLogger)
      Coerces a value to the specified Class that is not covered by any of the above cases
      (package private) static java.lang.Number coerceToPrimitiveNumber​(double pValue, java.lang.Class pClass)
      Coerces a double to the given primitive number class
      (package private) static java.lang.Number coerceToPrimitiveNumber​(long pValue, java.lang.Class pClass)
      Coerces a long to the given primitive number class
      (package private) static java.lang.Number coerceToPrimitiveNumber​(java.lang.Number pValue, java.lang.Class pClass)
      Coerces a Number to the given primitive number class
      static java.lang.Number coerceToPrimitiveNumber​(java.lang.Object pValue, java.lang.Class pClass, Logger pLogger)
      Coerces a value to the given primitive number class
      (package private) static java.lang.Number coerceToPrimitiveNumber​(java.lang.String pValue, java.lang.Class pClass)
      Coerces a String to the given primitive number class
      static java.lang.String coerceToString​(java.lang.Object pValue, Logger pLogger)
      Coerces the specified value to a String
      static boolean isBigDecimal​(java.lang.Object pObject)
      Returns true if the given object is BigDecimal.
      static boolean isBigInteger​(java.lang.Object pObject)
      Returns true if the given object is BigInteger.
      static boolean isFloatingPointString​(java.lang.Object pObject)
      Returns true if the given string might contain a floating point number - i.e., it contains ".", "e", or "E"
      static boolean isFloatingPointType​(java.lang.Class pClass)
      Returns true if the given class is of a floating point type
      static boolean isFloatingPointType​(java.lang.Object pObject)
      Returns true if the given Object is of a floating point type
      static boolean isIntegerType​(java.lang.Class pClass)
      Returns true if the given class is of an integer type
      static boolean isIntegerType​(java.lang.Object pObject)
      Returns true if the given Object is of an integer type
      (package private) static boolean isNumberClass​(java.lang.Class pClass)
      Returns true if the given class is Byte, Short, Integer, Long, Float, Double, BigInteger, or BigDecimal
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • ZERO

        private static final java.lang.Number ZERO
    • Constructor Detail

      • Coercions

        public Coercions()
    • Method Detail

      • coerce

        public static java.lang.Object coerce​(java.lang.Object pValue,
                                              java.lang.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​(java.lang.Class pClass)
        Returns true if the given class is Byte, Short, Integer, Long, Float, Double, BigInteger, or BigDecimal
      • coerceToString

        public static java.lang.String coerceToString​(java.lang.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 java.lang.Number coerceToPrimitiveNumber​(java.lang.Object pValue,
                                                               java.lang.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 java.lang.Integer coerceToInteger​(java.lang.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 java.lang.Number coerceToPrimitiveNumber​(long pValue,
                                                        java.lang.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 java.lang.Number coerceToPrimitiveNumber​(double pValue,
                                                        java.lang.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 java.lang.Number coerceToPrimitiveNumber​(java.lang.Number pValue,
                                                        java.lang.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 java.lang.Number coerceToPrimitiveNumber​(java.lang.String pValue,
                                                        java.lang.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 java.lang.Character coerceToCharacter​(java.lang.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 java.lang.Boolean coerceToBoolean​(java.lang.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 java.lang.Object coerceToObject​(java.lang.Object pValue,
                                                      java.lang.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 java.lang.Object applyArithmeticOperator​(java.lang.Object pLeft,
                                                               java.lang.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 java.lang.Object applyRelationalOperator​(java.lang.Object pLeft,
                                                               java.lang.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 java.lang.Object applyEqualityOperator​(java.lang.Object pLeft,
                                                             java.lang.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​(java.lang.Object pObject)
        Returns true if the given Object is of a floating point type
      • isFloatingPointType

        public static boolean isFloatingPointType​(java.lang.Class pClass)
        Returns true if the given class is of a floating point type
      • isFloatingPointString

        public static boolean isFloatingPointString​(java.lang.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​(java.lang.Object pObject)
        Returns true if the given Object is of an integer type
      • isIntegerType

        public static boolean isIntegerType​(java.lang.Class pClass)
        Returns true if the given class is of an integer type
      • isBigInteger

        public static boolean isBigInteger​(java.lang.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​(java.lang.Object pObject)
        Returns true if the given object is BigDecimal.
        Parameters:
        pObject - - Object to evaluate
        Returns:
        - true if the given object is BigDecimal