You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2010/01/07 19:00:08 UTC

svn commit: r896944 - in /commons/proper/jexl/trunk/src: main/java/org/apache/commons/jexl2/ main/java/org/apache/commons/jexl2/parser/ test/java/org/apache/commons/jexl2/

Author: henrib
Date: Thu Jan  7 18:00:07 2010
New Revision: 896944

URL: http://svn.apache.org/viewvc?rev=896944&view=rev
Log:
JEXL-46; adding Perl-like regular-expression operators (=~ and !~)

Modified:
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt
    commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/ArithmeticTest.java

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java?rev=896944&r1=896943&r2=896944&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java Thu Jan  7 18:00:07 2010
@@ -31,6 +31,7 @@
 import org.apache.commons.jexl2.parser.ASTConstructorNode;
 import org.apache.commons.jexl2.parser.ASTDivNode;
 import org.apache.commons.jexl2.parser.ASTEQNode;
+import org.apache.commons.jexl2.parser.ASTERNode;
 import org.apache.commons.jexl2.parser.ASTEmptyFunction;
 import org.apache.commons.jexl2.parser.ASTFalseNode;
 import org.apache.commons.jexl2.parser.ASTFloatLiteral;
@@ -50,6 +51,7 @@
 import org.apache.commons.jexl2.parser.ASTModNode;
 import org.apache.commons.jexl2.parser.ASTMulNode;
 import org.apache.commons.jexl2.parser.ASTNENode;
+import org.apache.commons.jexl2.parser.ASTNRNode;
 import org.apache.commons.jexl2.parser.ASTNotNode;
 import org.apache.commons.jexl2.parser.ASTNullLiteral;
 import org.apache.commons.jexl2.parser.ASTOrNode;
@@ -361,6 +363,11 @@
     }
 
     /** {@inheritDoc} */
+    public Object visit(ASTERNode node, Object data) {
+        return infixChildren(node, " =~ ", false, data);
+    }
+
+    /** {@inheritDoc} */
     public Object visit(ASTFalseNode node, Object data) {
         return check(node, "false", data);
     }
@@ -527,6 +534,11 @@
     }
 
     /** {@inheritDoc} */
+    public Object visit(ASTNRNode node, Object data) {
+        return infixChildren(node, " !~ ", false, data);
+    }
+    
+    /** {@inheritDoc} */
     public Object visit(ASTNotNode node, Object data) {
         builder.append("!");
         accept(node.jjtGetChild(0), data);

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java?rev=896944&r1=896943&r2=896944&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java Thu Jan  7 18:00:07 2010
@@ -45,6 +45,7 @@
 import org.apache.commons.jexl2.parser.ASTConstructorNode;
 import org.apache.commons.jexl2.parser.ASTDivNode;
 import org.apache.commons.jexl2.parser.ASTEQNode;
+import org.apache.commons.jexl2.parser.ASTERNode;
 import org.apache.commons.jexl2.parser.ASTEmptyFunction;
 import org.apache.commons.jexl2.parser.ASTFalseNode;
 import org.apache.commons.jexl2.parser.ASTFunctionNode;
@@ -64,6 +65,7 @@
 import org.apache.commons.jexl2.parser.ASTModNode;
 import org.apache.commons.jexl2.parser.ASTMulNode;
 import org.apache.commons.jexl2.parser.ASTNENode;
+import org.apache.commons.jexl2.parser.ASTNRNode;
 import org.apache.commons.jexl2.parser.ASTNotNode;
 import org.apache.commons.jexl2.parser.ASTNullLiteral;
 import org.apache.commons.jexl2.parser.ASTOrNode;
@@ -659,6 +661,17 @@
     }
 
     /** {@inheritDoc} */
+    public Object visit(ASTERNode node, Object data) {
+        Object left = node.jjtGetChild(0).jjtAccept(this, data);
+        Object right = node.jjtGetChild(1).jjtAccept(this, data);
+        try {
+            return arithmetic.matches(left, right) ? Boolean.TRUE : Boolean.FALSE;
+        } catch (RuntimeException xrt) {
+            throw new JexlException(node, ">= error", xrt);
+        }
+    }
+
+    /** {@inheritDoc} */
     public Object visit(ASTIdentifier node, Object data) {
         String name = node.image;
         if (data == null) {
@@ -972,6 +985,17 @@
     }
 
     /** {@inheritDoc} */
+    public Object visit(ASTNRNode node, Object data) {
+        Object left = node.jjtGetChild(0).jjtAccept(this, data);
+        Object right = node.jjtGetChild(1).jjtAccept(this, data);
+        try {
+            return arithmetic.matches(left, right) ? Boolean.FALSE : Boolean.TRUE;
+        } catch (RuntimeException xrt) {
+            throw new JexlException(node, ">= error", xrt);
+        }
+    }
+    
+    /** {@inheritDoc} */
     public Object visit(ASTNotNode node, Object data) {
         Object val = node.jjtGetChild(0).jjtAccept(this, data);
         return arithmetic.toBoolean(val) ? Boolean.FALSE : Boolean.TRUE;

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java?rev=896944&r1=896943&r2=896944&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlArithmetic.java Thu Jan  7 18:00:07 2010
@@ -470,7 +470,31 @@
         BigInteger result = l.subtract(r);
         return narrowBigInteger(left, right, result);
     }
-    
+
+    /**
+     * Test if left regexp matches right.
+     *
+     * @param left first value
+     * @param right second value
+     * @return test result.
+     */
+    public boolean matches(Object left, Object right) {
+        if (left == null && right == null) {
+            //if both are null L == R
+            return true;
+        }
+        if (left == null || right == null) {
+            // we know both aren't null, therefore L != R
+            return false;
+        }
+        final String arg = left.toString();
+        if (right instanceof java.util.regex.Pattern) {
+            return ((java.util.regex.Pattern) right).matcher(arg).matches();
+        } else {
+            return arg.matches(right.toString());
+        }
+    }
+
     /**
      * Test if left and right are equal.
      *

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt?rev=896944&r1=896943&r2=896944&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt Thu Jan  7 18:00:07 2010
@@ -295,6 +295,10 @@
     ">=" AdditiveExpression() #GENode(2)
    |
     "ge" AdditiveExpression() #GENode(2)
+   |
+    "=~" AdditiveExpression() #ERNode(2) // equals regexp
+   |
+    "!~" AdditiveExpression() #NRNode(2) // not equals regexp
   )?
 }
 

Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/ArithmeticTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/ArithmeticTest.java?rev=896944&r1=896943&r2=896944&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/ArithmeticTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/ArithmeticTest.java Thu Jan  7 18:00:07 2010
@@ -151,7 +151,26 @@
         asserter.assertExpression("B10 / I2", new BigInteger("5"));
         asserter.assertExpression("B10 / L2", new BigInteger("5"));
     }
-    
+
+
+    public void testRegexp() throws Exception {
+        asserter.setVariable("str", "abc456");
+        asserter.assertExpression("str =~ '.*456'", Boolean.TRUE);
+        asserter.assertExpression("str !~ 'ABC.*'", Boolean.TRUE);
+        asserter.setVariable("match", "abc.*");
+        asserter.setVariable("nomatch", ".*123");
+        asserter.assertExpression("str =~ match", Boolean.TRUE);
+        asserter.assertExpression("str !~ match", Boolean.FALSE);
+        asserter.assertExpression("str !~ nomatch", Boolean.TRUE);
+        asserter.assertExpression("str =~ nomatch", Boolean.FALSE);
+        asserter.setVariable("match", java.util.regex.Pattern.compile("abc.*"));
+        asserter.setVariable("nomatch", java.util.regex.Pattern.compile(".*123"));
+        asserter.assertExpression("str =~ match", Boolean.TRUE);
+        asserter.assertExpression("str !~ match", Boolean.FALSE);
+        asserter.assertExpression("str !~ nomatch", Boolean.TRUE);
+        asserter.assertExpression("str =~ nomatch", Boolean.FALSE);
+    }
+
     /**
      *
      * if silent, all arith exception return 0.0



Re: svn commit: r896944 - in /commons/proper/jexl/trunk/src: main/java/org/apache/commons/jexl2/ main/java/org/apache/commons/jexl2/parser/ test/java/org/apache/commons/jexl2/

Posted by sebb <se...@gmail.com>.
On 07/01/2010, henrib@apache.org <he...@apache.org> wrote:
> Author: henrib
>  Date: Thu Jan  7 18:00:07 2010
>  New Revision: 896944
>
>  URL: http://svn.apache.org/viewvc?rev=896944&view=rev
>  Log:
>  JEXL-46; adding Perl-like regular-expression operators (=~ and !~)

[...]

>      /** {@inheritDoc} */
>  +    public Object visit(ASTERNode node, Object data) {
>  +        Object left = node.jjtGetChild(0).jjtAccept(this, data);
>  +        Object right = node.jjtGetChild(1).jjtAccept(this, data);
>  +        try {
>  +            return arithmetic.matches(left, right) ? Boolean.TRUE : Boolean.FALSE;

or could use

     Boolean.valueOf(arithmetic.matches(left, right));

>  +        } catch (RuntimeException xrt) {
>  +            throw new JexlException(node, ">= error", xrt);

s/>=/=~/

>  +        }
>  +    }
>  +
>  +    /** {@inheritDoc} */
>      public Object visit(ASTIdentifier node, Object data) {
>          String name = node.image;
>          if (data == null) {
>  @@ -972,6 +985,17 @@
>      }
>
>      /** {@inheritDoc} */
>  +    public Object visit(ASTNRNode node, Object data) {
>  +        Object left = node.jjtGetChild(0).jjtAccept(this, data);
>  +        Object right = node.jjtGetChild(1).jjtAccept(this, data);
>  +        try {
>  +            return arithmetic.matches(left, right) ? Boolean.FALSE : Boolean.TRUE;
>  +        } catch (RuntimeException xrt) {
>  +            throw new JexlException(node, ">= error", xrt);

s/>=/!~/

>  +        }
>  +    }
>  +
>  +    /** {@inheritDoc} */
>      public Object visit(ASTNotNode node, Object data) {
>          Object val = node.jjtGetChild(0).jjtAccept(this, data);
>          return arithmetic.toBoolean(val) ? Boolean.FALSE : Boolean.TRUE;

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org