Class Operators

java.lang.Object
org.apache.commons.jexl3.internal.Operators

public class Operators extends Object
Helper class to deal with operator overloading and specifics.
Since:
3.0
  • Field Details

  • Constructor Details

    • Operators

      protected Operators(InterpreterBase owner)
      Constructs a new instance.
      Parameters:
      owner - the owning interpreter
  • Method Details

    • isPostfix

      private static boolean isPostfix(JexlOperator operator)
      Helper for postfix assignment operators.
      Parameters:
      operator - the operator
      Returns:
      true if operator is a postfix operator (x++, y--)
    • arguments

      private Object[] arguments(JexlOperator operator, Object... args)
      Tidy arguments based on operator arity.

      The interpreter may add a null to the arguments of operator expecting only one parameter.

      Parameters:
      operator - the operator
      args - the arguements (as seen by the interpreter)
      Returns:
      the tidied arguments
    • contains

      protected boolean contains(JexlNode node, String op, Object left, Object right)
      The 'match'/'in' operator implementation.

      Note that 'x in y' or 'x matches y' means 'y contains x' ; the JEXL operator arguments order syntax is the reverse of this method call.

      Parameters:
      node - the node
      op - the calling operator, =~ or !~
      left - the right operand
      right - the left operand
      Returns:
      true if left matches right, false otherwise
    • controlNullOperands

      protected void controlNullOperands(JexlArithmetic arithmetic, JexlOperator operator, Object... args)
      Throw a NPE if operator is strict and one of the arguments is null.
      Parameters:
      arithmetic - the JEXL arithmetic instance
      operator - the operator to check
      args - the operands
      Throws:
      JexlArithmetic.NullOperand - if operator is strict and an operand is null
    • empty

      protected Object empty(JexlNode node, Object object)
      Check for emptyness of various types: Collection, Array, Map, String, and anything that has a boolean isEmpty() method.

      Note that the result may not be a boolean.

      Parameters:
      node - the node holding the object
      object - the object to check the emptyness of
      Returns:
      the evaluation result
    • endsWith

      protected boolean endsWith(JexlNode node, String operator, Object left, Object right)
      The 'endsWith' operator implementation.
      Parameters:
      node - the node
      operator - the calling operator, ^= or ^!
      left - the left operand
      right - the right operand
      Returns:
      true if left ends with right, false otherwise
    • isArithmetic

      private boolean isArithmetic(JexlMethod vm)
      Checks whether a method is a JexlArithmetic method.
      Parameters:
      vm - the JexlMethod (may be null)
      Returns:
      true of false
    • returnsBoolean

      private boolean returnsBoolean(JexlMethod vm)
      Checks whether a method returns a boolean or a Boolean.
      Parameters:
      vm - the JexlMethod (may be null)
      Returns:
      true of false
    • returnsInteger

      private boolean returnsInteger(JexlMethod vm)
      Checks whether a method returns an int or an Integer.
      Parameters:
      vm - the JexlMethod (may be null)
      Returns:
      true of false
    • size

      protected Object size(JexlNode node, Object object)
      Calculate the size of various types: Collection, Array, Map, String, and anything that has a int size() method.

      Note that the result may not be an integer.

      Parameters:
      node - the node that gave the value to size
      object - the object to get the size of
      Returns:
      the evaluation result
    • startsWith

      protected boolean startsWith(JexlNode node, String operator, Object left, Object right)
      The 'startsWith' operator implementation.
      Parameters:
      node - the node
      operator - the calling operator, $= or $!
      left - the left operand
      right - the right operand
      Returns:
      true if left starts with right, false otherwise
    • tryAssignOverload

      protected Object tryAssignOverload(JexlNode node, JexlOperator operator, Consumer<Object> assignFun, Object... args)
      Evaluates an assign operator.

      This takes care of finding and caching the operator method when appropriate. If an overloads returns Operator.ASSIGN, it means the side-effect is complete. Otherwise, a += b <=> a = a + b

      Parameters:
      node - the syntactic node
      operator - the operator
      args - the arguments, the first one being the target of assignment
      Returns:
      JexlOperator.ASSIGN if operation assignment has been performed, JexlEngine.TRY_FAILED if no operation was performed, the value to use as the side effect argument otherwise
    • tryOverload

      protected Object tryOverload(JexlNode node, JexlOperator operator, Object... args)
      Attempts to call an operator.

      This performs the null argument control against the strictness of the operator.

      This takes care of finding and caching the operator method when appropriate.

      Parameters:
      node - the syntactic node
      operator - the operator
      args - the arguments
      Returns:
      the result of the operator evaluation or TRY_FAILED