Class 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 Detail

      • Coercions

        public Coercions()
    • Method Detail

      • 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
      • 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
      • 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