You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Rahul Akolkar <ra...@gmail.com> on 2009/07/31 23:58:49 UTC

Re: [JEXL] svn commit: r799492

On Thu, Jul 30, 2009 at 10:24 PM, <se...@apache.org> wrote:
> Author: sebb
> Date: Fri Jul 31 02:24:07 2009
> New Revision: 799492
>
> URL: http://svn.apache.org/viewvc?rev=799492&view=rev
> Log:
> Initial implementation of Jexl Script engine and simple unit test
>
> Added:
>    commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java   (with props)
>    commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java   (with props)
>
> Added: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
> URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java?rev=799492&view=auto
> ==============================================================================
> --- commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java (added)
> +++ commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java Fri Jul 31 02:24:07 2009
> @@ -0,0 +1,202 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + *
> + */
> +
> +package org.apache.commons.jexl.scripting;
> +
> +import java.io.BufferedReader;
> +import java.io.IOException;
> +import java.io.Reader;
> +import java.util.Collection;
> +import java.util.Map;
> +import java.util.Set;
> +
> +import javax.script.AbstractScriptEngine;
> +import javax.script.Bindings;
> +import javax.script.ScriptContext;
> +import javax.script.ScriptEngineFactory;
> +import javax.script.ScriptException;
> +import javax.script.SimpleBindings;
> +
> +import org.apache.commons.jexl.JexlContext;
> +import org.apache.commons.jexl.JexlEngine;
> +import org.apache.commons.jexl.Script;
> +
> +// Note: this is a generated class, so won't be present until JavaCC has been run
> +import org.apache.commons.jexl.parser.ParseException;
> +
> +/**
> + * Implements the Jexl ScriptEngine for JSF-223.
> + * <p>
> + * See
> + * <a href="http://java.sun.com/javase/6/docs/api/javax/script/package-summary.html">Java Scripting API</a>
> + * Javadoc.
> + */
> +public class JexlScriptEngine extends AbstractScriptEngine {
> +
> +    private final ScriptEngineFactory factory;
> +
> +    private final JexlEngine engine;
> +
> +    public JexlScriptEngine() {
> +        this(null);
> +    }
> +
> +    public JexlScriptEngine(final ScriptEngineFactory _factory) {
> +        factory = _factory;
> +        engine = new JexlEngine();
> +    }
> +
> +    /** {@inheritDoc} */
> +    public Bindings createBindings() {
> +        return new SimpleBindings();
> +    }
> +
> +    /** {@inheritDoc} */
> +    public Object eval(Reader script, ScriptContext context) throws ScriptException {
> +        BufferedReader reader = new BufferedReader(script);
> +        StringBuilder buffer = new StringBuilder();
> +        try {
> +            String line;
> +            try {
> +                while ((line = reader.readLine()) != null) {
> +                    buffer.append(line).append('\n');
> +                }
> +            } catch (IOException e) {
> +                throw new ScriptException(e);
> +            }
> +        } finally {
> +            try {
> +                reader.close();
> +            } catch (IOException e) {
> +            }
> +        }
> +        return eval(buffer.toString(), context);
> +    }
> +
> +    /** {@inheritDoc} */
> +    @SuppressWarnings("unchecked")
> +    public Object eval(String scriptText, final ScriptContext context) throws ScriptException {
> +        if (scriptText == null) {
> +            return null;
> +        }
> +        context.setAttribute("context", context, ScriptContext.ENGINE_SCOPE);
<snip/>

Not sure what the above line is upto ...


> +        try {
> +            Script script = engine.createScript(scriptText);
> +            JexlContext ctxt = new JexlContext(){
> +                public void setVars(Map vars) {
> +                    context.setBindings(new SimpleBindings(vars), ScriptContext.ENGINE_SCOPE);
> +                }
> +
> +                public Map getVars() {
> +                    return new JexlContextWrapper(context);
> +                }
> +            };
> +
> +            ctxt.getVars().put("context", "value");
<snap/>

... but it seems related to this other line above. Please elaborate.


> +
> +            return script.execute(ctxt);
> +        } catch (ParseException e) {
> +            e.printStackTrace();
> +            throw new ScriptException(e);
> +        } catch (Exception e) {
> +            e.printStackTrace();
> +            throw new ScriptException(e.toString());
> +        }
> +    }
> +
> +    /** {@inheritDoc} */
> +    public ScriptEngineFactory getFactory() {
> +        return factory == null ? new JexlScriptEngineFactory() : factory;
> +    }
> +
> +    /**
> +     * Wrapper to convert a JSR-223 ScriptContext into a JexlContext.
> +     *
<snip/>

The above statement (and perhaps the class name itself) is a bit
misleading. Its not that the ScriptContext is converted to a
JexlContext by this wrapper, but rather that it makes it easier to
complete the said conversion. However, given this is private, not the
most important.

-Rahul



> +     * Current implementation only gives access to ENGINE_SCOPE binding.
> +     */
> +    @SuppressWarnings("unchecked")
> +    private static class JexlContextWrapper implements Map {
> +
> +        private final ScriptContext context;
> +
> +        private JexlContextWrapper (final ScriptContext _context){
> +            context = _context;
> +        }
> +
> +        public void clear() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            bnd.clear();
> +        }
> +
> +        public boolean containsKey(final Object key) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.containsKey(key);
> +        }
> +
> +        public boolean containsValue(final Object value) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.containsValue(value);
> +        }
> +
> +        public Set entrySet() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.entrySet();
> +        }
> +
> +        public Object get(final Object key) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.get(key);
> +        }
> +
> +        public boolean isEmpty() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.isEmpty();
> +        }
> +
> +        public Set keySet() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.keySet();
> +        }
> +
> +        public Object put(final Object key, final Object value) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.put(key, value);
> +        }
> +
> +        public void putAll(Map t) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            bnd.putAll(t); // N.B. SimpleBindings checks for valid keys
> +        }
> +
> +        public Object remove(Object key) {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.remove(key);
> +        }
> +
> +        public int size() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.size();
> +        }
> +
> +        public Collection values() {
> +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
> +            return bnd.values();
> +        }
> +
> +    }
> +}
>
> Propchange: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Propchange: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
> ------------------------------------------------------------------------------
>    svn:keywords = Author Date Id Revision
>
> Added: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
> URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java?rev=799492&view=auto
> ==============================================================================
> --- commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java (added)
> +++ commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java Fri Jul 31 02:24:07 2009
> @@ -0,0 +1,52 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + *
> + */
> +
> +package org.apache.commons.jexl.scripting;
> +
> +import javax.script.ScriptEngine;
> +import javax.script.ScriptEngineManager;
> +
> +import junit.framework.TestCase;
> +
> +public class JexlScriptEngineTest extends TestCase {
> +
> +    public void testScripting() throws Exception {
> +        ScriptEngineManager manager = new ScriptEngineManager();
> +        assertNotNull("Manager should not be null", manager);
> +        ScriptEngine engine = manager.getEngineByName("jexl");
> +        assertNotNull("Engine should not be null (name)", engine);
> +        engine = manager.getEngineByExtension("jexl");
> +        assertNotNull("Engine should not be null (ext)", engine);
> +        final Integer initialValue = Integer.valueOf(123);
> +        assertEquals(initialValue,engine.eval("123"));
> +        assertEquals(initialValue,engine.eval("0;123"));// multiple statements
> +        long time1 = System.currentTimeMillis();
> +        Long time2 = (Long) engine.eval("" +
> +                       "sys=context.class.forName(\"java.lang.System\");"
> +                       +"now=sys.currentTimeMillis();"
> +                       );
> +        assertTrue("Must take some time to process this",time1 <= time2.longValue());
> +        engine.put("value", initialValue);
> +        assertEquals(initialValue,engine.get("value"));
> +        final Long newValue = Long.valueOf(124);
> +        assertEquals(newValue,engine.eval("old=value;value=value+1"));
> +        assertEquals(initialValue,engine.get("old"));
> +        assertEquals(newValue,engine.get("value"));
> +    }
> +
> +}
>
> Propchange: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Propchange: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
> ------------------------------------------------------------------------------
>    svn:keywords = Author Date Id Revision
>
>
>

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


Re: [JEXL] svn commit: r799492

Posted by sebb <se...@gmail.com>.
On 31/07/2009, Rahul Akolkar <ra...@gmail.com> wrote:
> On Thu, Jul 30, 2009 at 10:24 PM, <se...@apache.org> wrote:
>  > Author: sebb
>  > Date: Fri Jul 31 02:24:07 2009
>  > New Revision: 799492
>  >
>  > URL: http://svn.apache.org/viewvc?rev=799492&view=rev
>  > Log:
>  > Initial implementation of Jexl Script engine and simple unit test
>  >
>  > Added:
>  >    commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java   (with props)
>  >    commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java   (with props)
>  >
>  > Added: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
>  > URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java?rev=799492&view=auto
>  > ==============================================================================
>  > --- commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java (added)
>  > +++ commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java Fri Jul 31 02:24:07 2009
>  > @@ -0,0 +1,202 @@
>  > +/*
>  > + * Licensed to the Apache Software Foundation (ASF) under one or more
>  > + * contributor license agreements.  See the NOTICE file distributed with
>  > + * this work for additional information regarding copyright ownership.
>  > + * The ASF licenses this file to You under the Apache License, Version 2.0
>  > + * (the "License"); you may not use this file except in compliance with
>  > + * the License.  You may obtain a copy of the License at
>  > + *
>  > + *   http://www.apache.org/licenses/LICENSE-2.0
>  > + *
>  > + * Unless required by applicable law or agreed to in writing, software
>  > + * distributed under the License is distributed on an "AS IS" BASIS,
>  > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>  > + * See the License for the specific language governing permissions and
>  > + * limitations under the License.
>  > + *
>  > + */
>  > +
>  > +package org.apache.commons.jexl.scripting;
>  > +
>  > +import java.io.BufferedReader;
>  > +import java.io.IOException;
>  > +import java.io.Reader;
>  > +import java.util.Collection;
>  > +import java.util.Map;
>  > +import java.util.Set;
>  > +
>  > +import javax.script.AbstractScriptEngine;
>  > +import javax.script.Bindings;
>  > +import javax.script.ScriptContext;
>  > +import javax.script.ScriptEngineFactory;
>  > +import javax.script.ScriptException;
>  > +import javax.script.SimpleBindings;
>  > +
>  > +import org.apache.commons.jexl.JexlContext;
>  > +import org.apache.commons.jexl.JexlEngine;
>  > +import org.apache.commons.jexl.Script;
>  > +
>  > +// Note: this is a generated class, so won't be present until JavaCC has been run
>  > +import org.apache.commons.jexl.parser.ParseException;
>  > +
>  > +/**
>  > + * Implements the Jexl ScriptEngine for JSF-223.
>  > + * <p>
>  > + * See
>  > + * <a href="http://java.sun.com/javase/6/docs/api/javax/script/package-summary.html">Java Scripting API</a>
>  > + * Javadoc.
>  > + */
>  > +public class JexlScriptEngine extends AbstractScriptEngine {
>  > +
>  > +    private final ScriptEngineFactory factory;
>  > +
>  > +    private final JexlEngine engine;
>  > +
>  > +    public JexlScriptEngine() {
>  > +        this(null);
>  > +    }
>  > +
>  > +    public JexlScriptEngine(final ScriptEngineFactory _factory) {
>  > +        factory = _factory;
>  > +        engine = new JexlEngine();
>  > +    }
>  > +
>  > +    /** {@inheritDoc} */
>  > +    public Bindings createBindings() {
>  > +        return new SimpleBindings();
>  > +    }
>  > +
>  > +    /** {@inheritDoc} */
>  > +    public Object eval(Reader script, ScriptContext context) throws ScriptException {
>  > +        BufferedReader reader = new BufferedReader(script);
>  > +        StringBuilder buffer = new StringBuilder();
>  > +        try {
>  > +            String line;
>  > +            try {
>  > +                while ((line = reader.readLine()) != null) {
>  > +                    buffer.append(line).append('\n');
>  > +                }
>  > +            } catch (IOException e) {
>  > +                throw new ScriptException(e);
>  > +            }
>  > +        } finally {
>  > +            try {
>  > +                reader.close();
>  > +            } catch (IOException e) {
>  > +            }
>  > +        }
>  > +        return eval(buffer.toString(), context);
>  > +    }
>  > +
>  > +    /** {@inheritDoc} */
>  > +    @SuppressWarnings("unchecked")
>  > +    public Object eval(String scriptText, final ScriptContext context) throws ScriptException {
>  > +        if (scriptText == null) {
>  > +            return null;
>  > +        }
>  > +        context.setAttribute("context", context, ScriptContext.ENGINE_SCOPE);
>  <snip/>
>
>  Not sure what the above line is upto ...
>

JSR-223 mandates that:

>>>
In all cases, the ScriptContext used during a script execution must be
a value in the Engine Scope of the ScriptEngine whose key is the
String “context”.
<<<

Will document.

>  > +        try {
>  > +            Script script = engine.createScript(scriptText);
>  > +            JexlContext ctxt = new JexlContext(){
>  > +                public void setVars(Map vars) {
>  > +                    context.setBindings(new SimpleBindings(vars), ScriptContext.ENGINE_SCOPE);
>  > +                }
>  > +
>  > +                public Map getVars() {
>  > +                    return new JexlContextWrapper(context);
>  > +                }
>  > +            };
>  > +
>  > +            ctxt.getVars().put("context", "value");
>  <snap/>
>
>  ... but it seems related to this other line above. Please elaborate.
>

Oops, the last line is a bug. Will fix.

>  > +
>  > +            return script.execute(ctxt);
>  > +        } catch (ParseException e) {
>  > +            e.printStackTrace();
>  > +            throw new ScriptException(e);
>  > +        } catch (Exception e) {
>  > +            e.printStackTrace();
>  > +            throw new ScriptException(e.toString());
>  > +        }
>  > +    }
>  > +
>  > +    /** {@inheritDoc} */
>  > +    public ScriptEngineFactory getFactory() {
>  > +        return factory == null ? new JexlScriptEngineFactory() : factory;
>  > +    }
>  > +
>  > +    /**
>  > +     * Wrapper to convert a JSR-223 ScriptContext into a JexlContext.
>  > +     *
>  <snip/>
>
>  The above statement (and perhaps the class name itself) is a bit
>  misleading. Its not that the ScriptContext is converted to a
>  JexlContext by this wrapper, but rather that it makes it easier to
>  complete the said conversion. However, given this is private, not the
>  most important.

OK, will clarify.

>  -Rahul
>
>
>
>  > +     * Current implementation only gives access to ENGINE_SCOPE binding.
>  > +     */
>  > +    @SuppressWarnings("unchecked")
>  > +    private static class JexlContextWrapper implements Map {
>  > +
>  > +        private final ScriptContext context;
>  > +
>  > +        private JexlContextWrapper (final ScriptContext _context){
>  > +            context = _context;
>  > +        }
>  > +
>  > +        public void clear() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            bnd.clear();
>  > +        }
>  > +
>  > +        public boolean containsKey(final Object key) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.containsKey(key);
>  > +        }
>  > +
>  > +        public boolean containsValue(final Object value) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.containsValue(value);
>  > +        }
>  > +
>  > +        public Set entrySet() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.entrySet();
>  > +        }
>  > +
>  > +        public Object get(final Object key) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.get(key);
>  > +        }
>  > +
>  > +        public boolean isEmpty() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.isEmpty();
>  > +        }
>  > +
>  > +        public Set keySet() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.keySet();
>  > +        }
>  > +
>  > +        public Object put(final Object key, final Object value) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.put(key, value);
>  > +        }
>  > +
>  > +        public void putAll(Map t) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            bnd.putAll(t); // N.B. SimpleBindings checks for valid keys
>  > +        }
>  > +
>  > +        public Object remove(Object key) {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.remove(key);
>  > +        }
>  > +
>  > +        public int size() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.size();
>  > +        }
>  > +
>  > +        public Collection values() {
>  > +            Bindings bnd = context.getBindings(ScriptContext.ENGINE_SCOPE);
>  > +            return bnd.values();
>  > +        }
>  > +
>  > +    }
>  > +}
>  >
>  > Propchange: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
>  > ------------------------------------------------------------------------------
>  >    svn:eol-style = native
>  >
>  > Propchange: commons/proper/jexl/branches/2.0/src/java/org/apache/commons/jexl/scripting/JexlScriptEngine.java
>  > ------------------------------------------------------------------------------
>  >    svn:keywords = Author Date Id Revision
>  >
>  > Added: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
>  > URL: http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java?rev=799492&view=auto
>  > ==============================================================================
>  > --- commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java (added)
>  > +++ commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java Fri Jul 31 02:24:07 2009
>  > @@ -0,0 +1,52 @@
>  > +/*
>  > + * Licensed to the Apache Software Foundation (ASF) under one or more
>  > + * contributor license agreements.  See the NOTICE file distributed with
>  > + * this work for additional information regarding copyright ownership.
>  > + * The ASF licenses this file to You under the Apache License, Version 2.0
>  > + * (the "License"); you may not use this file except in compliance with
>  > + * the License.  You may obtain a copy of the License at
>  > + *
>  > + *   http://www.apache.org/licenses/LICENSE-2.0
>  > + *
>  > + * Unless required by applicable law or agreed to in writing, software
>  > + * distributed under the License is distributed on an "AS IS" BASIS,
>  > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>  > + * See the License for the specific language governing permissions and
>  > + * limitations under the License.
>  > + *
>  > + */
>  > +
>  > +package org.apache.commons.jexl.scripting;
>  > +
>  > +import javax.script.ScriptEngine;
>  > +import javax.script.ScriptEngineManager;
>  > +
>  > +import junit.framework.TestCase;
>  > +
>  > +public class JexlScriptEngineTest extends TestCase {
>  > +
>  > +    public void testScripting() throws Exception {
>  > +        ScriptEngineManager manager = new ScriptEngineManager();
>  > +        assertNotNull("Manager should not be null", manager);
>  > +        ScriptEngine engine = manager.getEngineByName("jexl");
>  > +        assertNotNull("Engine should not be null (name)", engine);
>  > +        engine = manager.getEngineByExtension("jexl");
>  > +        assertNotNull("Engine should not be null (ext)", engine);
>  > +        final Integer initialValue = Integer.valueOf(123);
>  > +        assertEquals(initialValue,engine.eval("123"));
>  > +        assertEquals(initialValue,engine.eval("0;123"));// multiple statements
>  > +        long time1 = System.currentTimeMillis();
>  > +        Long time2 = (Long) engine.eval("" +
>  > +                       "sys=context.class.forName(\"java.lang.System\");"
>  > +                       +"now=sys.currentTimeMillis();"
>  > +                       );
>  > +        assertTrue("Must take some time to process this",time1 <= time2.longValue());
>  > +        engine.put("value", initialValue);
>  > +        assertEquals(initialValue,engine.get("value"));
>  > +        final Long newValue = Long.valueOf(124);
>  > +        assertEquals(newValue,engine.eval("old=value;value=value+1"));
>  > +        assertEquals(initialValue,engine.get("old"));
>  > +        assertEquals(newValue,engine.get("value"));
>  > +    }
>  > +
>  > +}
>  >
>  > Propchange: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
>  > ------------------------------------------------------------------------------
>  >    svn:eol-style = native
>  >
>  > Propchange: commons/proper/jexl/branches/2.0/src/test/org/apache/commons/jexl/scripting/JexlScriptEngineTest.java
>  > ------------------------------------------------------------------------------
>  >    svn:keywords = Author Date Id Revision
>  >
>  >
>  >
>
>  ---------------------------------------------------------------------
>  To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>  For additional commands, e-mail: dev-help@commons.apache.org
>
>

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