commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Narendran Chakkaravarthy <nare...@gmail.com>
Subject Re: [Jexl] Return statement
Date Mon, 20 Feb 2012 17:52:27 GMT
Hello Henrib,

Thanks for trying this and sorry about the delay in response.

I am using commons-jexl-2.0.2-SNAPSHOT.jar (built ourselves from a
snapshot), so there could be difference there.

I used your same test case (with changes to use old api)

  public void test130() throws Exception {
    JexlEngine jexl = new JexlEngine();
    JexlContext ctxt = new MapContext();
    String[] items = { "foo" , "bar", "quux" };
    ctxt.set("items", items);
    ctxt.set("x", "bar");
    ctxt.set("y", "bar");
    // Script s = jexl.createScript("if(x.equals(y)) { return true; } ");
    Script s = jexl.createScript("for(a : items) { if(a.equals(y)) { return
true; } }");

    Object r = s.execute(ctxt);
    assertEquals(true, r);
    ctxt.set("y", "froboz");
    r = s.execute(ctxt);
    assertNull(r);
}

And I get the following error:

org.apache.commons.jexl2.JexlException: MyScriptTest.test130@855 !!! for(a
: items) { if(a.equals(y)) { return true; } } !!!, parsing failed
at org.apache.commons.jexl2.JexlEngine.parse(JexlEngine.java:830)
at org.apache.commons.jexl2.JexlEngine.createScript(JexlEngine.java:418)
at org.apache.commons.jexl2.JexlEngine.createScript(JexlEngine.java:401)
at MyScriptTest.test130(JexlScriptIntegrationTest.java:855)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at
org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.commons.jexl2.parser.ParseException: Ambiguous
statement @1:43, missing ';' between expressions
at
org.apache.commons.jexl2.parser.Parser.jjtreeCloseNodeScope(Parser.java:41)
at
org.apache.commons.jexl2.parser.Parser.ExpressionStatement(Parser.java:280)
at org.apache.commons.jexl2.parser.Parser.Statement(Parser.java:154)
at org.apache.commons.jexl2.parser.Parser.Block(Parser.java:204)
at org.apache.commons.jexl2.parser.Parser.Statement(Parser.java:124)
at org.apache.commons.jexl2.parser.Parser.IfStatement(Parser.java:302)
at org.apache.commons.jexl2.parser.Parser.Statement(Parser.java:128)
at org.apache.commons.jexl2.parser.Parser.Block(Parser.java:204)
at org.apache.commons.jexl2.parser.Parser.Statement(Parser.java:124)
at org.apache.commons.jexl2.parser.Parser.ForeachStatement(Parser.java:383)
at org.apache.commons.jexl2.parser.Parser.Statement(Parser.java:132)
at org.apache.commons.jexl2.parser.Parser.JexlScript(Parser.java:86)
at org.apache.commons.jexl2.parser.Parser.parse(Parser.java:24)
at org.apache.commons.jexl2.JexlEngine.parse(JexlEngine.java:823)
... 19 more

Looks like others are running into this problem as well --
http://stackoverflow.com/questions/3209439/jexl-program-have-exception

Thanks,
Naren



On Thu, Feb 16, 2012 at 5:16 AM, henrib <henrib@apache.org> wrote:

> Hi Naren,
> I've tried to reproduce your problem and failed so I must be missing
> something.
> Here is the code I tried on 2.1 trunk (added to IssuesTest.java):
>
>    public void test130() throws Exception {
>        JexlEngine jexl = new JexlEngine();
>        String[] items = { "foo" , "bar", "quux" };
>        Script s = jexl.createScript("for(var x : items) { if(x.equals(y)) {
> return true; } }", "items", "y");
>        Object r = s.execute(null, items, "bar");
>        assertEquals(true, r);
>        r = s.execute(null, items, "froboz");
>        assertNull(r);
>        JexlContext ctxt = new MapContext();
>        ctxt.set("items", items);
>        ctxt.set("y", "bar");
>        s = jexl.createScript("for(x : items) { if(x.equals(y)) { return
> true; } }");
>        r = s.execute(ctxt);
>        assertEquals(true, r);
>        ctxt.set("y", "froboz");
>        r = s.execute(ctxt);
>        assertNull(r);
>    }
>
> I've also tried with out the 'var x' and a MapContext  and with an added
> 'return false' at the end but couldn't make it fail.
> Can you post the actual code that fails on your end?
> Thanks,
> Regards
> Henrib
>
> --
> View this message in context:
> http://apache-commons.680414.n4.nabble.com/Jexl-Return-statement-tp4392635p4393882.html
> Sent from the Commons - User mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
>


-- 
~Naren

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message