You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by sebb <se...@gmail.com> on 2016/01/21 21:19:10 UTC

Re: svn commit: r1725955 - in /jmeter/trunk: ./ lib/ licenses/bin/ res/maven/ src/functions/org/apache/jmeter/functions/ test/src/org/apache/jmeter/functions/ xdocs/ xdocs/usermanual/

On 21 January 2016 at 14:10,  <pm...@apache.org> wrote:
> Author: pmouawad
> Date: Thu Jan 21 14:10:43 2016
> New Revision: 1725955
>
> URL: http://svn.apache.org/viewvc?rev=1725955&view=rev
> Log:
> Bug 58903 - Provide __jexl3 function that uses commons-jexl3 and deprecated __jexl (1.1) function
> Add also JUnit tests for jexl2 and jexl3
> Bugzilla Id: 58903
>
> Added:
>     jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java   (with props)
>     jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java   (contents, props changed)
>       - copied, changed from r1719809, jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
>     jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java   (with props)
> Modified:
>     jmeter/trunk/build.properties
>     jmeter/trunk/build.xml
>     jmeter/trunk/eclipse.classpath
>     jmeter/trunk/lib/   (props changed)
>     jmeter/trunk/lib/aareadme.txt
>     jmeter/trunk/licenses/bin/README.txt
>     jmeter/trunk/res/maven/ApacheJMeter_parent.pom
>     jmeter/trunk/xdocs/changes.xml
>     jmeter/trunk/xdocs/usermanual/functions.xml
>
> Modified: jmeter/trunk/build.properties
> URL: http://svn.apache.org/viewvc/jmeter/trunk/build.properties?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/build.properties (original)
> +++ jmeter/trunk/build.properties Thu Jan 21 14:10:43 2016
> @@ -110,6 +110,11 @@ commons-jexl2.jar           = commons-je
>  commons-jexl2.loc           = ${maven2.repo}/org/apache/commons/commons-jexl/${commons-jexl2.version}
>  commons-jexl2.md5           = 4ad8f5c161dd3a50e190334555675db9
>
> +commons-jexl3.version       = 3.0
> +commons-jexl3.jar           = commons-jexl3-${commons-jexl3.version}.jar
> +commons-jexl3.loc           = ${maven2.repo}/org/apache/commons/commons-jexl3/${commons-jexl3.version}
> +commons-jexl3.md5           = 81041b5b058a2ccff0046386bc7e23f8
> +
>  commons-lang3.version       = 3.4
>  commons-lang3.jar           = commons-lang3-${commons-lang3.version}.jar
>  commons-lang3.loc           = ${maven2.repo}/org/apache/commons/commons-lang3/${commons-lang3.version}
>
> Modified: jmeter/trunk/build.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/build.xml (original)
> +++ jmeter/trunk/build.xml Thu Jan 21 14:10:43 2016
> @@ -370,6 +370,7 @@
>      <include name="${lib.dir}/${commons-io.jar}"/>
>      <include name="${lib.dir}/${commons-jexl.jar}"/>
>      <include name="${lib.dir}/${commons-jexl2.jar}"/>
> +       <include name="${lib.dir}/${commons-jexl3.jar}"/>
>      <include name="${lib.dir}/${commons-lang3.jar}"/>
>      <include name="${lib.dir}/${commons-logging.jar}"/>
>      <include name="${lib.dir}/${commons-math3.jar}"/>
> @@ -444,6 +445,7 @@
>      <pathelement location="${lib.dir}/${commons-io.jar}"/>
>      <pathelement location="${lib.dir}/${commons-jexl.jar}"/>
>      <pathelement location="${lib.dir}/${commons-jexl2.jar}"/>
> +       <pathelement location="${lib.dir}/${commons-jexl3.jar}"/>
>      <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
>      <pathelement location="${lib.dir}/${commons-logging.jar}"/>
>      <pathelement location="${lib.dir}/${commons-math3.jar}"/>
> @@ -2844,6 +2846,7 @@ run JMeter unless all the JMeter jars ar
>          <process_jarfile jarname="commons-io"/>
>          <process_jarfile jarname="commons-jexl"/>
>          <process_jarfile jarname="commons-jexl2"/>
> +       <process_jarfile jarname="commons-jexl3"/>
>          <process_jarfile jarname="commons-lang3"/>
>          <process_jarfile jarname="commons-logging"/>
>          <process_jarfile jarname="commons-math3"/>
>
> Modified: jmeter/trunk/eclipse.classpath
> URL: http://svn.apache.org/viewvc/jmeter/trunk/eclipse.classpath?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/eclipse.classpath (original)
> +++ jmeter/trunk/eclipse.classpath Thu Jan 21 14:10:43 2016
> @@ -53,6 +53,7 @@
>         <classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
>         <classpathentry kind="lib" path="lib/commons-jexl-1.1.jar"/>
>         <classpathentry kind="lib" path="lib/commons-jexl-2.1.1.jar"/>
> +       <classpathentry kind="lib" path="lib/commons-jexl3-3.0.jar"/>
>         <classpathentry kind="lib" path="lib/commons-lang3-3.4.jar"/>
>         <classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
>         <classpathentry kind="lib" path="lib/commons-math3-3.5.jar"/>
>
> Propchange: jmeter/trunk/lib/
> ------------------------------------------------------------------------------
> --- svn:ignore (original)
> +++ svn:ignore Thu Jan 21 14:10:43 2016
> @@ -11,6 +11,7 @@ commons-httpclient-3.1.jar
>  commons-io-2.4.jar
>  commons-jexl-1.1.jar
>  commons-jexl-2.1.1.jar
> +commons-jexl3-3.0.jar
>  commons-lang3-3.4.jar
>  commons-logging-1.2.jar
>  commons-math3-3.5.jar
>
> Modified: jmeter/trunk/lib/aareadme.txt
> URL: http://svn.apache.org/viewvc/jmeter/trunk/lib/aareadme.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/lib/aareadme.txt (original)
> +++ jmeter/trunk/lib/aareadme.txt Thu Jan 21 14:10:43 2016
> @@ -51,7 +51,7 @@ commons-io-2.4
>  http://commons.apache.org/downloads/download_io.cgi
>  - FTPSampler
>
> -commons-jexl-1.1
> +commons-jexl-1.1, commons-jexl-2.1.1, commons-jexl3-3.0
>  ----------------
>  http://commons.apache.org/downloads/download_jexl.cgi
>  - Jexl function and BSF test elements
>
> Modified: jmeter/trunk/licenses/bin/README.txt
> URL: http://svn.apache.org/viewvc/jmeter/trunk/licenses/bin/README.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/licenses/bin/README.txt (original)
> +++ jmeter/trunk/licenses/bin/README.txt Thu Jan 21 14:10:43 2016
> @@ -12,6 +12,7 @@ commons-httpclient-3.1.jar
>  commons-io-2.4.jar
>  commons-jexl-1.1.jar
>  commons-jexl-2.1.1.jar
> +commons-jexl3-3.0.jar
>  commons-lang3-3.4.jar
>  commons-logging-1.2.jar
>  commons-math3-3.5.jar
>
> Modified: jmeter/trunk/res/maven/ApacheJMeter_parent.pom
> URL: http://svn.apache.org/viewvc/jmeter/trunk/res/maven/ApacheJMeter_parent.pom?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/res/maven/ApacheJMeter_parent.pom (original)
> +++ jmeter/trunk/res/maven/ApacheJMeter_parent.pom Thu Jan 21 14:10:43 2016
> @@ -65,6 +65,7 @@ under the License.
>        <commons-io.version>2.4</commons-io.version>
>        <commons-jexl.version>1.1</commons-jexl.version>
>        <commons-jexl2.version>2.1.1</commons-jexl2.version>
> +      <commons-jexl3.version>3.0</commons-jexl3.version>
>        <commons-lang3.version>3.4</commons-lang3.version>
>        <commons-logging.version>1.2</commons-logging.version>
>        <commons-math3.version>3.5</commons-math3.version>
> @@ -177,6 +178,11 @@ under the License.
>        </dependency>
>        <dependency>
>          <groupId>org.apache.commons</groupId>
> +        <artifactId>commons-jexl3</artifactId>
> +        <version>${commons-jexl3.version}</version>
> +      </dependency>
> +      <dependency>
> +        <groupId>org.apache.commons</groupId>
>          <artifactId>commons-lang3</artifactId>
>          <version>${commons-lang3.version}</version>
>        </dependency>
>
> Added: jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java?rev=1725955&view=auto
> ==============================================================================
> --- jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java (added)
> +++ jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java Thu Jan 21 14:10:43 2016
> @@ -0,0 +1,164 @@
> +/*
> + * 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.jmeter.functions;
> +
> +import java.util.Collection;
> +import java.util.LinkedList;
> +import java.util.List;
> +
> +import org.apache.commons.jexl3.JexlBuilder;
> +import org.apache.commons.jexl3.JexlContext;
> +import org.apache.commons.jexl3.JexlEngine;
> +import org.apache.commons.jexl3.JexlExpression;
> +import org.apache.commons.jexl3.MapContext;
> +import org.apache.jmeter.engine.util.CompoundVariable;
> +import org.apache.jmeter.samplers.SampleResult;
> +import org.apache.jmeter.samplers.Sampler;
> +import org.apache.jmeter.testelement.ThreadListener;
> +import org.apache.jmeter.threads.JMeterContext;
> +import org.apache.jmeter.threads.JMeterContextService;
> +import org.apache.jmeter.threads.JMeterVariables;
> +import org.apache.jmeter.util.JMeterUtils;
> +import org.apache.jorphan.logging.LoggingManager;
> +import org.apache.log.Logger;
> +
> +/**
> + * A function which understands Commons JEXL3
> + * @since 3.0
> + */
> +// For unit tests, see TestJexlFunction
> +public class Jexl3Function extends AbstractFunction implements ThreadListener {
> +
> +    private static final Logger log = LoggingManager.getLoggerForClass();
> +
> +    private static final String KEY = "__jexl3"; //$NON-NLS-1$
> +
> +    private static final List<String> desc = new LinkedList<>();
> +
> +    private static final ThreadLocal<JexlEngine> threadLocalJexl = new ThreadLocal<>();
> +
> +    static
> +    {
> +        desc.add(JMeterUtils.getResString("jexl_expression")); //$NON-NLS-1$
> +        desc.add(JMeterUtils.getResString("function_name_paropt"));// $NON-NLS1$
> +    }
> +
> +    private Object[] values;
> +
> +    /** {@inheritDoc} */
> +    @Override
> +    public String execute(SampleResult previousResult, Sampler currentSampler)
> +            throws InvalidVariableException
> +    {
> +        String str = ""; //$NON-NLS-1$
> +
> +        CompoundVariable var = (CompoundVariable) values[0];
> +        String exp = var.execute();
> +
> +        String varName = ""; //$NON-NLS-1$
> +        if (values.length > 1) {
> +            varName = ((CompoundVariable) values[1]).execute().trim();
> +        }
> +
> +        JMeterContext jmctx = JMeterContextService.getContext();
> +        JMeterVariables vars = jmctx.getVariables();
> +
> +        try
> +        {
> +            JexlContext jc = new MapContext();
> +            jc.set("log", log); //$NON-NLS-1$
> +            jc.set("ctx", jmctx); //$NON-NLS-1$
> +            jc.set("vars", vars); //$NON-NLS-1$
> +            jc.set("props", JMeterUtils.getJMeterProperties()); //$NON-NLS-1$
> +            // Previously mis-spelt as theadName
> +            jc.set("threadName", Thread.currentThread().getName()); //$NON-NLS-1$
> +            jc.set("sampler", currentSampler); //$NON-NLS-1$ (may be null)
> +            jc.set("sampleResult", previousResult); //$NON-NLS-1$ (may be null)
> +            jc.set("OUT", System.out);//$NON-NLS-1$
> +
> +            // Now evaluate the script, getting the result
> +            JexlExpression e = getJexlEngine().createExpression( exp );
> +            Object o = e.evaluate(jc);
> +            if (o != null)
> +            {
> +                str = o.toString();
> +            }
> +            if (vars != null && varName.length() > 0) {// vars will be null on TestPlan
> +                vars.put(varName, str);
> +            }
> +        } catch (Exception e)
> +        {
> +            log.error("An error occurred while evaluating the expression \""
> +                    + exp + "\"\n",e);
> +        }
> +        return str;
> +    }
> +
> +    /**
> +     * Get JexlEngine from ThreadLocal
> +     * @return JexlEngine
> +     */
> +    private static JexlEngine getJexlEngine() {
> +        JexlEngine engine = threadLocalJexl.get();
> +        if(engine == null) {
> +            engine = new JexlBuilder()
> +                    .cache(512)
> +                    .silent(true)
> +                    .strict(true)
> +                    .create();
> +            threadLocalJexl.set(engine);
> +        }
> +        return engine;
> +    }
> +
> +    /** {@inheritDoc} */
> +    @Override
> +    public List<String> getArgumentDesc()
> +    {
> +        return desc;
> +    }
> +
> +    /** {@inheritDoc} */
> +    @Override
> +    public String getReferenceKey()
> +    {
> +        return KEY;
> +    }
> +
> +    /** {@inheritDoc} */
> +    @Override
> +    public void setParameters(Collection<CompoundVariable> parameters)
> +            throws InvalidVariableException
> +    {
> +        checkParameterCount(parameters, 1, 2);
> +        values = parameters.toArray();
> +    }
> +
> +    @Override
> +    public void threadStarted() {
> +    }
> +
> +    @Override
> +    public void threadFinished() {
> +        JexlEngine engine = threadLocalJexl.get();
> +        if(engine != null) {
> +            engine.clearCache();
> +            threadLocalJexl.remove();
> +        }
> +    }
> +
> +}
>
> Propchange: jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Copied: jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java (from r1719809, jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java)
> URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java?p2=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java&p1=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java&r1=1719809&r2=1725955&rev=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java (original)
> +++ jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java Thu Jan 21 14:10:43 2016
> @@ -28,8 +28,8 @@ import org.apache.jmeter.threads.JMeterC
>  import org.apache.jmeter.threads.JMeterContextService;
>  import org.apache.jmeter.threads.JMeterVariables;
>
> -public class TestJexlFunction extends JMeterTestCase {
> -    private JexlFunction function;
> +public class TestJexl2Function extends JMeterTestCase {
> +    protected AbstractFunction function;
>
>      private SampleResult result;
>
> @@ -39,13 +39,13 @@ public class TestJexlFunction extends JM
>
>      private JMeterContext jmctx;
>
> -    public TestJexlFunction(String name) {
> +    public TestJexl2Function(String name) {
>          super(name);
>      }
>
>      @Override
>      public void setUp() {
> -        function = new JexlFunction();
> +        function = new Jexl2Function();
>          result = new SampleResult();
>          jmctx = JMeterContextService.getContext();
>          String data = "The quick brown fox";
>
> Propchange: jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> ------------------------------------------------------------------------------
>     svn:keywords = Author Date Id Revision
>
> Added: jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java?rev=1725955&view=auto
> ==============================================================================
> --- jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java (added)
> +++ jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java Thu Jan 21 14:10:43 2016
> @@ -0,0 +1,33 @@
> +/*
> + * 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.jmeter.functions;
> +
> +
> +public class TestJexl3Function extends TestJexl2Function {
> +
> +    public TestJexl3Function(String name) {
> +        super(name);
> +    }
> +
> +    @Override
> +    public void setUp() {
> +        super.setUp();
> +        function = new Jexl3Function();
> +    }
> +}
>
> Propchange: jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Modified: jmeter/trunk/xdocs/changes.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/xdocs/changes.xml (original)
> +++ jmeter/trunk/xdocs/changes.xml Thu Jan 21 14:10:43 2016
> @@ -85,7 +85,8 @@ Summary
>      <li>MongoDB elements (MongoDB Source Config, MongoDB Script) have been deprecated and will be removed in next version of jmeter. They do not appear anymore in the menu, if you need them modify <code>not_in_menu</code> property. JMeter team advises not to use them anymore. See <bugzilla>58772</bugzilla></li>
>      <li>Summariser listener now outputs a formated duration in HH:mm:ss (Hour:Minute:Second), it previously outputed seconds. See <bugzilla>58776</bugzilla></li>
>      <li>WebService(SOAP) Request and HTML Parameter Mask which were deprecated in 2.13 version, have now been removed following our <a href="./usermanual/best-practices.html#deprecation">deprecation strategy</a></li>
> -    <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap signature has changed, if you use it ensure you update your code. See <bugzilla>58845</bugzilla></li>
> +    <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap signature has changed, if you use it ensure you update your code. See <bugzilla>58845</bugzilla></li>
> +    <li><code>__jexl</code> function has been deprecated and will be removed in next version. See <bugzilla>58903</bugzilla></li>
>  </ul>
>
>  <!-- =================== Improvements =================== -->
> @@ -148,6 +149,7 @@ Summary
>  <h3>Functions</h3>
>  <ul>
>      <li><bug>58477</bug> __javaScript function : Allow use of Nashorn engine for Java8 and later versions</li>
> +    <li><bug>58903</bug>Provide __jexl3 function that uses commons-jexl3 and deprecated __jexl (1.1) function</li>
>  </ul>
>
>  <h3>I18N</h3>
>
> Modified: jmeter/trunk/xdocs/usermanual/functions.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/functions.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> ==============================================================================
> --- jmeter/trunk/xdocs/usermanual/functions.xml (original)
> +++ jmeter/trunk/xdocs/usermanual/functions.xml Thu Jan 21 14:10:43 2016
> @@ -125,7 +125,8 @@ Alternatively, just use <code>/</code> i
>          <tr><td>Calculation</td><td> <a href="#__UUID">UUID</a></td><td>generate a random type 4 UUID</td><td>2.9</td></tr>
>          <tr><td>Scripting</td><td> <a href="#__BeanShell">BeanShell</a></td><td>run a BeanShell script</td><td>1.X</td></tr>
>          <tr><td>Scripting</td><td> <a href="#__javaScript">javaScript</a></td><td>process JavaScript (Mozilla Rhino)</td><td>1.9</td></tr>
> -        <tr><td>Scripting</td><td> <a href="#__jexl">jexl, jexl2</a></td><td>evaluate a Commons Jexl expression</td><td>jexl(2.2), jexl2(2.6)</td></tr>

-1, this breaks the tests.

The __jexl function must continue to be documented even though it is deprecated.

> +        <tr><td>Scripting</td><td> <a href="#__jexl2">jexl2</a></td><td>evaluate a Commons Jexl2 expression</td><td>jexl2(2.6)</td></tr>
> +        <tr><td>Scripting</td><td> <a href="#__jexl3">jexl3</a></td><td>evaluate a Commons Jexl3 expression</td><td>jexl3 (3.0)</td></tr>
>          <tr><td>Properties</td><td> <a href="#__property">property</a> </td><td>read a property</td><td>2.0</td></tr>
>          <tr><td>Properties</td><td> <a href="#__P">P</a></td><td>read a property (shorthand method)</td><td>2.0</td></tr>
>          <tr><td>Properties</td><td> <a href="#__setProperty">setProperty</a></td><td>set a JMeter property</td><td>2.1</td></tr>
> @@ -992,16 +993,16 @@ The following shorthand aliases are prov
>  </p>
>  </component>
>
> -<component index="&sect-num;.5.18" name="__jexl" tag="__jexl2">

-1, the alias must remain until the function is removed entirely

> +<component index="&sect-num;.5.18" name="__jexl2" >
>  <description>
>      <p>The jexl function returns the result of evaluating a
>      <a href="http://commons.apache.org/jexl">Commons JEXL expression</a>.
>      See links below for more information on JEXL expressions.
>      </p>
> -    <p>The <code>__jexl</code> function uses Commons JEXL 1, and the <code>__jexl2</code> function uses Commons JEXL 2</p>
> +    <p>The <code>__jexl2</code> function uses Commons JEXL 2</p>
>      <ul>
> -    <li><a href="http://commons.apache.org/jexl/reference/syntax.html">JEXL syntax description</a></li>
> -    <li><a href="http://commons.apache.org/jexl/reference/examples.html#Example_Expressions">JEXL examples</a></li>
> +    <li><a href="http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL syntax description</a></li>
> +    <li><a href="http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL examples</a></li>
>      </ul>
>      </description>
>
> @@ -1043,7 +1044,58 @@ i.intValue(); // or use i.longValue()
>      <note>JMeter allows the expression to contain multiple statements.</note>
>  </component>
>
> -<component index="&sect-num;.5.19" name="__V">
> +<component index="&sect-num;.5.19" name="__jexl3" >
> +<description>
> +    <p>The jexl function returns the result of evaluating a
> +    <a href="http://commons.apache.org/proper/commons-jexl/">Commons JEXL expression</a>.
> +    See links below for more information on JEXL expressions.
> +    </p>
> +    <p>The <code>__jexl3</code> function uses Commons JEXL 3</p>
> +    <ul>
> +    <li><a href="http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL syntax description</a></li>
> +    <li><a href="http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL examples</a></li>
> +    </ul>
> +    </description>
> +
> +<properties>
> +        <property name="Expression" required="Yes">
> +        The expression to be evaluated. For example, <code>6*(5+2)</code>
> +        </property>
> +        <property name="Name of variable" required="No">The name of the variable to set.</property>
> +</properties>
> +<p>
> +The following variables are made available to the script:
> +</p>
> +<ul>
> +<li><code>log</code> - the logger for the function</li>
> +<li><code>ctx</code> - JMeterContext object</li>
> +<li><code>vars</code> - JMeterVariables object</li>
> +<li><code>props</code> - JMeter Properties object</li>
> +<li><code>threadName</code> - String containing the current thread name (in 2.3.2 it was misspelt as "<code>theadName</code>")</li>
> +<li><code>sampler</code> - current Sampler object (if any)</li>
> +<li><code>sampleResult</code> - previous SampleResult object (if any)</li>
> +<li><code>OUT</code> - System.out - e.g. <code>OUT.println("message")</code></li>
> +</ul>
> +    <p>
> +    Jexl can also create classes and call methods on them, for example:
> +    </p>
> +    <p>
> +    <source>
> +Systemclass=log.class.forName("java.lang.System");
> +now=Systemclass.currentTimeMillis();
> +</source>
> +    Note that the Jexl documentation on the web-site wrongly suggests that "<code>div</code>" does integer division.
> +    In fact "<code>div</code>" and "<code>/</code>" both perform normal division. One can get the same effect
> +    as follows:
> +    <source>
> +i= 5 / 2;
> +i.intValue(); // or use i.longValue()
> +</source>
> +    </p>
> +    <note>JMeter allows the expression to contain multiple statements.</note>
> +</component>
> +
> +<component index="&sect-num;.5.20" name="__V">
>  <description>
>      <p>The V (variable) function returns the result of evaluating a variable name expression.
>      This can be used to evaluate nested variable references (which are not currently supported).
> @@ -1063,7 +1115,7 @@ i.intValue(); // or use i.longValue()
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.20" name="__evalVar">
> +<component index="&sect-num;.5.21" name="__evalVar">
>  <description>
>      <p>The eval function returns the result of evaluating an expression stored in a variable.
>      </p>
> @@ -1081,7 +1133,7 @@ i.intValue(); // or use i.longValue()
>          </property>
>  </properties>
>  </component>
> -<component index="&sect-num;.5.21" name="__eval">
> +<component index="&sect-num;.5.22" name="__eval">
>  <description>
>      <p>The eval function returns the result of evaluating a string expression.
>      </p>
> @@ -1110,7 +1162,7 @@ i.intValue(); // or use i.longValue()
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.22" name="__char">
> +<component index="&sect-num;.5.23" name="__char">
>  <description>
>      <p>
>      The char function returns the result of evaluating a list of numbers as Unicode characters.
> @@ -1134,7 +1186,7 @@ i.intValue(); // or use i.longValue()
>   </p>
>  </component>
>
> -<component index="&sect-num;.5.23" name="__unescape">
> +<component index="&sect-num;.5.24" name="__unescape">
>  <description>
>      <p>
>      The unescape function returns the result of evaluating a Java-escaped string. See also <code>__char()</code> above.
> @@ -1157,7 +1209,7 @@ i.intValue(); // or use i.longValue()
>   </p>
>  </component>
>
> -<component index="&sect-num;.5.24" name="__unescapeHtml">
> +<component index="&sect-num;.5.25" name="__unescapeHtml">
>  <description>
>      <p>
>  Function to unescape a string containing HTML entity escapes
> @@ -1184,7 +1236,7 @@ e.g. <code>"&amp;gt;&amp;zzzz;x"</code>
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.25" name="__escapeHtml">
> +<component index="&sect-num;.5.26" name="__escapeHtml">
>  <description>
>      <p>
>  Function which escapes the characters in a String using HTML entities.
> @@ -1207,7 +1259,7 @@ becomes:
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.26" name="__urldecode">
> +<component index="&sect-num;.5.27" name="__urldecode">
>  <description>
>      <p>
>  Function to decode a <code>application/x-www-form-urlencoded</code> string.
> @@ -1229,7 +1281,7 @@ For example, the string <code>Word+%22sc
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.27" name="__urlencode">
> +<component index="&sect-num;.5.28" name="__urlencode">
>  <description>
>      <p>
>  Function to encode a string to a <code>application/x-www-form-urlencoded</code> string.
> @@ -1250,7 +1302,7 @@ For example, the string <code>Word &quot
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.28" name="__FileToString">
> +<component index="&sect-num;.5.29" name="__FileToString">
>
>  <description>
>      <p>
> @@ -1274,7 +1326,7 @@ A reference name - <code>refName</code>
>  <p>The file name, encoding and reference name parameters are resolved every time the function is executed.</p>
>  </component>
>
> -<component index="&sect-num;.5.29" name="__samplerName">
> +<component index="&sect-num;.5.30" name="__samplerName">
>
>  <description>
>      <p>
> @@ -1297,7 +1349,7 @@ A reference name - <code>refName</code>
>  </properties>
>  </component>
>
> -<component index="&sect-num;.5.30" name="__TestPlanName">
> +<component index="&sect-num;.5.31" name="__TestPlanName">
>
>  <description>
>      <p>
> @@ -1310,7 +1362,7 @@ A reference name - <code>refName</code>
>  </p>
>  </component>
>
> -<component index="&sect-num;.5.31" name="__escapeOroRegexpChars">
> +<component index="&sect-num;.5.32" name="__escapeOroRegexpChars">
>  <description>
>      <p>
>  Function which escapes the ORO Regexp meta characters, it is the equivalent of <code>\Q</code> <code>\E</code> in Java Regexp Engine.
>
>

Re: svn commit: r1725955 - in /jmeter/trunk: ./ lib/ licenses/bin/ res/maven/ src/functions/org/apache/jmeter/functions/ test/src/org/apache/jmeter/functions/ xdocs/ xdocs/usermanual/

Posted by Philippe Mouawad <ph...@gmail.com>.
I fixed it although tag is not clear for me

On Thursday, January 21, 2016, sebb <se...@gmail.com> wrote:

> On 21 January 2016 at 20:32, Philippe Mouawad
> <philippe.mouawad@gmail.com <javascript:;>> wrote:
> > On Thu, Jan 21, 2016 at 9:19 PM, sebb <sebbaz@gmail.com <javascript:;>>
> wrote:
> >
> >> On 21 January 2016 at 14:10,  <pmouawad@apache.org <javascript:;>>
> wrote:
> >> > Author: pmouawad
> >> > Date: Thu Jan 21 14:10:43 2016
> >> > New Revision: 1725955
> >> >
> >> > URL: http://svn.apache.org/viewvc?rev=1725955&view=rev
> >> > Log:
> >> > Bug 58903 - Provide __jexl3 function that uses commons-jexl3 and
> >> deprecated __jexl (1.1) function
> >> > Add also JUnit tests for jexl2 and jexl3
> >> > Bugzilla Id: 58903
> >> >
> >> > Added:
> >> >
> >>
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >>  (with props)
> >> >
> >>
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >>  (contents, props changed)
> >> >       - copied, changed from r1719809,
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
> >> >
> >>
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >>  (with props)
> >> > Modified:
> >> >     jmeter/trunk/build.properties
> >> >     jmeter/trunk/build.xml
> >> >     jmeter/trunk/eclipse.classpath
> >> >     jmeter/trunk/lib/   (props changed)
> >> >     jmeter/trunk/lib/aareadme.txt
> >> >     jmeter/trunk/licenses/bin/README.txt
> >> >     jmeter/trunk/res/maven/ApacheJMeter_parent.pom
> >> >     jmeter/trunk/xdocs/changes.xml
> >> >     jmeter/trunk/xdocs/usermanual/functions.xml
> >> >
> >> > Modified: jmeter/trunk/build.properties
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/build.properties?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/build.properties (original)
> >> > +++ jmeter/trunk/build.properties Thu Jan 21 14:10:43 2016
> >> > @@ -110,6 +110,11 @@ commons-jexl2.jar           = commons-je
> >> >  commons-jexl2.loc           =
> >> ${maven2.repo}/org/apache/commons/commons-jexl/${commons-jexl2.version}
> >> >  commons-jexl2.md5           = 4ad8f5c161dd3a50e190334555675db9
> >> >
> >> > +commons-jexl3.version       = 3.0
> >> > +commons-jexl3.jar           =
> commons-jexl3-${commons-jexl3.version}.jar
> >> > +commons-jexl3.loc           =
> >> ${maven2.repo}/org/apache/commons/commons-jexl3/${commons-jexl3.version}
> >> > +commons-jexl3.md5           = 81041b5b058a2ccff0046386bc7e23f8
> >> > +
> >> >  commons-lang3.version       = 3.4
> >> >  commons-lang3.jar           =
> commons-lang3-${commons-lang3.version}.jar
> >> >  commons-lang3.loc           =
> >> ${maven2.repo}/org/apache/commons/commons-lang3/${commons-lang3.version}
> >> >
> >> > Modified: jmeter/trunk/build.xml
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/build.xml (original)
> >> > +++ jmeter/trunk/build.xml Thu Jan 21 14:10:43 2016
> >> > @@ -370,6 +370,7 @@
> >> >      <include name="${lib.dir}/${commons-io.jar}"/>
> >> >      <include name="${lib.dir}/${commons-jexl.jar}"/>
> >> >      <include name="${lib.dir}/${commons-jexl2.jar}"/>
> >> > +       <include name="${lib.dir}/${commons-jexl3.jar}"/>
> >> >      <include name="${lib.dir}/${commons-lang3.jar}"/>
> >> >      <include name="${lib.dir}/${commons-logging.jar}"/>
> >> >      <include name="${lib.dir}/${commons-math3.jar}"/>
> >> > @@ -444,6 +445,7 @@
> >> >      <pathelement location="${lib.dir}/${commons-io.jar}"/>
> >> >      <pathelement location="${lib.dir}/${commons-jexl.jar}"/>
> >> >      <pathelement location="${lib.dir}/${commons-jexl2.jar}"/>
> >> > +       <pathelement location="${lib.dir}/${commons-jexl3.jar}"/>
> >> >      <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
> >> >      <pathelement location="${lib.dir}/${commons-logging.jar}"/>
> >> >      <pathelement location="${lib.dir}/${commons-math3.jar}"/>
> >> > @@ -2844,6 +2846,7 @@ run JMeter unless all the JMeter jars ar
> >> >          <process_jarfile jarname="commons-io"/>
> >> >          <process_jarfile jarname="commons-jexl"/>
> >> >          <process_jarfile jarname="commons-jexl2"/>
> >> > +       <process_jarfile jarname="commons-jexl3"/>
> >> >          <process_jarfile jarname="commons-lang3"/>
> >> >          <process_jarfile jarname="commons-logging"/>
> >> >          <process_jarfile jarname="commons-math3"/>
> >> >
> >> > Modified: jmeter/trunk/eclipse.classpath
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/eclipse.classpath?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/eclipse.classpath (original)
> >> > +++ jmeter/trunk/eclipse.classpath Thu Jan 21 14:10:43 2016
> >> > @@ -53,6 +53,7 @@
> >> >         <classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
> >> >         <classpathentry kind="lib" path="lib/commons-jexl-1.1.jar"/>
> >> >         <classpathentry kind="lib" path="lib/commons-jexl-2.1.1.jar"/>
> >> > +       <classpathentry kind="lib" path="lib/commons-jexl3-3.0.jar"/>
> >> >         <classpathentry kind="lib" path="lib/commons-lang3-3.4.jar"/>
> >> >         <classpathentry kind="lib"
> path="lib/commons-logging-1.2.jar"/>
> >> >         <classpathentry kind="lib" path="lib/commons-math3-3.5.jar"/>
> >> >
> >> > Propchange: jmeter/trunk/lib/
> >> >
> >>
> ------------------------------------------------------------------------------
> >> > --- svn:ignore (original)
> >> > +++ svn:ignore Thu Jan 21 14:10:43 2016
> >> > @@ -11,6 +11,7 @@ commons-httpclient-3.1.jar
> >> >  commons-io-2.4.jar
> >> >  commons-jexl-1.1.jar
> >> >  commons-jexl-2.1.1.jar
> >> > +commons-jexl3-3.0.jar
> >> >  commons-lang3-3.4.jar
> >> >  commons-logging-1.2.jar
> >> >  commons-math3-3.5.jar
> >> >
> >> > Modified: jmeter/trunk/lib/aareadme.txt
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/lib/aareadme.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/lib/aareadme.txt (original)
> >> > +++ jmeter/trunk/lib/aareadme.txt Thu Jan 21 14:10:43 2016
> >> > @@ -51,7 +51,7 @@ commons-io-2.4
> >> >  http://commons.apache.org/downloads/download_io.cgi
> >> >  - FTPSampler
> >> >
> >> > -commons-jexl-1.1
> >> > +commons-jexl-1.1, commons-jexl-2.1.1, commons-jexl3-3.0
> >> >  ----------------
> >> >  http://commons.apache.org/downloads/download_jexl.cgi
> >> >  - Jexl function and BSF test elements
> >> >
> >> > Modified: jmeter/trunk/licenses/bin/README.txt
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/licenses/bin/README.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/licenses/bin/README.txt (original)
> >> > +++ jmeter/trunk/licenses/bin/README.txt Thu Jan 21 14:10:43 2016
> >> > @@ -12,6 +12,7 @@ commons-httpclient-3.1.jar
> >> >  commons-io-2.4.jar
> >> >  commons-jexl-1.1.jar
> >> >  commons-jexl-2.1.1.jar
> >> > +commons-jexl3-3.0.jar
> >> >  commons-lang3-3.4.jar
> >> >  commons-logging-1.2.jar
> >> >  commons-math3-3.5.jar
> >> >
> >> > Modified: jmeter/trunk/res/maven/ApacheJMeter_parent.pom
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/res/maven/ApacheJMeter_parent.pom?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/res/maven/ApacheJMeter_parent.pom (original)
> >> > +++ jmeter/trunk/res/maven/ApacheJMeter_parent.pom Thu Jan 21 14:10:43
> >> 2016
> >> > @@ -65,6 +65,7 @@ under the License.
> >> >        <commons-io.version>2.4</commons-io.version>
> >> >        <commons-jexl.version>1.1</commons-jexl.version>
> >> >        <commons-jexl2.version>2.1.1</commons-jexl2.version>
> >> > +      <commons-jexl3.version>3.0</commons-jexl3.version>
> >> >        <commons-lang3.version>3.4</commons-lang3.version>
> >> >        <commons-logging.version>1.2</commons-logging.version>
> >> >        <commons-math3.version>3.5</commons-math3.version>
> >> > @@ -177,6 +178,11 @@ under the License.
> >> >        </dependency>
> >> >        <dependency>
> >> >          <groupId>org.apache.commons</groupId>
> >> > +        <artifactId>commons-jexl3</artifactId>
> >> > +        <version>${commons-jexl3.version}</version>
> >> > +      </dependency>
> >> > +      <dependency>
> >> > +        <groupId>org.apache.commons</groupId>
> >> >          <artifactId>commons-lang3</artifactId>
> >> >          <version>${commons-lang3.version}</version>
> >> >        </dependency>
> >> >
> >> > Added:
> >>
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java?rev=1725955&view=auto
> >> >
> >>
> ==============================================================================
> >> > ---
> >>
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >> (added)
> >> > +++
> >>
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >> Thu Jan 21 14:10:43 2016
> >> > @@ -0,0 +1,164 @@
> >> > +/*
> >> > + * 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.jmeter.functions;
> >> > +
> >> > +import java.util.Collection;
> >> > +import java.util.LinkedList;
> >> > +import java.util.List;
> >> > +
> >> > +import org.apache.commons.jexl3.JexlBuilder;
> >> > +import org.apache.commons.jexl3.JexlContext;
> >> > +import org.apache.commons.jexl3.JexlEngine;
> >> > +import org.apache.commons.jexl3.JexlExpression;
> >> > +import org.apache.commons.jexl3.MapContext;
> >> > +import org.apache.jmeter.engine.util.CompoundVariable;
> >> > +import org.apache.jmeter.samplers.SampleResult;
> >> > +import org.apache.jmeter.samplers.Sampler;
> >> > +import org.apache.jmeter.testelement.ThreadListener;
> >> > +import org.apache.jmeter.threads.JMeterContext;
> >> > +import org.apache.jmeter.threads.JMeterContextService;
> >> > +import org.apache.jmeter.threads.JMeterVariables;
> >> > +import org.apache.jmeter.util.JMeterUtils;
> >> > +import org.apache.jorphan.logging.LoggingManager;
> >> > +import org.apache.log.Logger;
> >> > +
> >> > +/**
> >> > + * A function which understands Commons JEXL3
> >> > + * @since 3.0
> >> > + */
> >> > +// For unit tests, see TestJexlFunction
> >> > +public class Jexl3Function extends AbstractFunction implements
> >> ThreadListener {
> >> > +
> >> > +    private static final Logger log =
> >> LoggingManager.getLoggerForClass();
> >> > +
> >> > +    private static final String KEY = "__jexl3"; //$NON-NLS-1$
> >> > +
> >> > +    private static final List<String> desc = new LinkedList<>();
> >> > +
> >> > +    private static final ThreadLocal<JexlEngine> threadLocalJexl =
> new
> >> ThreadLocal<>();
> >> > +
> >> > +    static
> >> > +    {
> >> > +        desc.add(JMeterUtils.getResString("jexl_expression"));
> >> //$NON-NLS-1$
> >> > +        desc.add(JMeterUtils.getResString("function_name_paropt"));//
> >> $NON-NLS1$
> >> > +    }
> >> > +
> >> > +    private Object[] values;
> >> > +
> >> > +    /** {@inheritDoc} */
> >> > +    @Override
> >> > +    public String execute(SampleResult previousResult, Sampler
> >> currentSampler)
> >> > +            throws InvalidVariableException
> >> > +    {
> >> > +        String str = ""; //$NON-NLS-1$
> >> > +
> >> > +        CompoundVariable var = (CompoundVariable) values[0];
> >> > +        String exp = var.execute();
> >> > +
> >> > +        String varName = ""; //$NON-NLS-1$
> >> > +        if (values.length > 1) {
> >> > +            varName = ((CompoundVariable)
> values[1]).execute().trim();
> >> > +        }
> >> > +
> >> > +        JMeterContext jmctx = JMeterContextService.getContext();
> >> > +        JMeterVariables vars = jmctx.getVariables();
> >> > +
> >> > +        try
> >> > +        {
> >> > +            JexlContext jc = new MapContext();
> >> > +            jc.set("log", log); //$NON-NLS-1$
> >> > +            jc.set("ctx", jmctx); //$NON-NLS-1$
> >> > +            jc.set("vars", vars); //$NON-NLS-1$
> >> > +            jc.set("props", JMeterUtils.getJMeterProperties());
> >> //$NON-NLS-1$
> >> > +            // Previously mis-spelt as theadName
> >> > +            jc.set("threadName", Thread.currentThread().getName());
> >> //$NON-NLS-1$
> >> > +            jc.set("sampler", currentSampler); //$NON-NLS-1$ (may be
> >> null)
> >> > +            jc.set("sampleResult", previousResult); //$NON-NLS-1$
> (may
> >> be null)
> >> > +            jc.set("OUT", System.out);//$NON-NLS-1$
> >> > +
> >> > +            // Now evaluate the script, getting the result
> >> > +            JexlExpression e = getJexlEngine().createExpression( exp
> );
> >> > +            Object o = e.evaluate(jc);
> >> > +            if (o != null)
> >> > +            {
> >> > +                str = o.toString();
> >> > +            }
> >> > +            if (vars != null && varName.length() > 0) {// vars will
> be
> >> null on TestPlan
> >> > +                vars.put(varName, str);
> >> > +            }
> >> > +        } catch (Exception e)
> >> > +        {
> >> > +            log.error("An error occurred while evaluating the
> >> expression \""
> >> > +                    + exp + "\"\n",e);
> >> > +        }
> >> > +        return str;
> >> > +    }
> >> > +
> >> > +    /**
> >> > +     * Get JexlEngine from ThreadLocal
> >> > +     * @return JexlEngine
> >> > +     */
> >> > +    private static JexlEngine getJexlEngine() {
> >> > +        JexlEngine engine = threadLocalJexl.get();
> >> > +        if(engine == null) {
> >> > +            engine = new JexlBuilder()
> >> > +                    .cache(512)
> >> > +                    .silent(true)
> >> > +                    .strict(true)
> >> > +                    .create();
> >> > +            threadLocalJexl.set(engine);
> >> > +        }
> >> > +        return engine;
> >> > +    }
> >> > +
> >> > +    /** {@inheritDoc} */
> >> > +    @Override
> >> > +    public List<String> getArgumentDesc()
> >> > +    {
> >> > +        return desc;
> >> > +    }
> >> > +
> >> > +    /** {@inheritDoc} */
> >> > +    @Override
> >> > +    public String getReferenceKey()
> >> > +    {
> >> > +        return KEY;
> >> > +    }
> >> > +
> >> > +    /** {@inheritDoc} */
> >> > +    @Override
> >> > +    public void setParameters(Collection<CompoundVariable>
> parameters)
> >> > +            throws InvalidVariableException
> >> > +    {
> >> > +        checkParameterCount(parameters, 1, 2);
> >> > +        values = parameters.toArray();
> >> > +    }
> >> > +
> >> > +    @Override
> >> > +    public void threadStarted() {
> >> > +    }
> >> > +
> >> > +    @Override
> >> > +    public void threadFinished() {
> >> > +        JexlEngine engine = threadLocalJexl.get();
> >> > +        if(engine != null) {
> >> > +            engine.clearCache();
> >> > +            threadLocalJexl.remove();
> >> > +        }
> >> > +    }
> >> > +
> >> > +}
> >> >
> >> > Propchange:
> >>
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >> >
> >>
> ------------------------------------------------------------------------------
> >> >     svn:mime-type = text/plain
> >> >
> >> > Copied:
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >> (from r1719809,
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java)
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java?p2=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java&p1=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java&r1=1719809&r2=1725955&rev=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > ---
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
> >> (original)
> >> > +++
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >> Thu Jan 21 14:10:43 2016
> >> > @@ -28,8 +28,8 @@ import org.apache.jmeter.threads.JMeterC
> >> >  import org.apache.jmeter.threads.JMeterContextService;
> >> >  import org.apache.jmeter.threads.JMeterVariables;
> >> >
> >> > -public class TestJexlFunction extends JMeterTestCase {
> >> > -    private JexlFunction function;
> >> > +public class TestJexl2Function extends JMeterTestCase {
> >> > +    protected AbstractFunction function;
> >> >
> >> >      private SampleResult result;
> >> >
> >> > @@ -39,13 +39,13 @@ public class TestJexlFunction extends JM
> >> >
> >> >      private JMeterContext jmctx;
> >> >
> >> > -    public TestJexlFunction(String name) {
> >> > +    public TestJexl2Function(String name) {
> >> >          super(name);
> >> >      }
> >> >
> >> >      @Override
> >> >      public void setUp() {
> >> > -        function = new JexlFunction();
> >> > +        function = new Jexl2Function();
> >> >          result = new SampleResult();
> >> >          jmctx = JMeterContextService.getContext();
> >> >          String data = "The quick brown fox";
> >> >
> >> > Propchange:
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >> >
> >>
> ------------------------------------------------------------------------------
> >> >     svn:eol-style = native
> >> >
> >> > Propchange:
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >> >
> >>
> ------------------------------------------------------------------------------
> >> >     svn:keywords = Author Date Id Revision
> >> >
> >> > Added:
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java?rev=1725955&view=auto
> >> >
> >>
> ==============================================================================
> >> > ---
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >> (added)
> >> > +++
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >> Thu Jan 21 14:10:43 2016
> >> > @@ -0,0 +1,33 @@
> >> > +/*
> >> > + * 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.jmeter.functions;
> >> > +
> >> > +
> >> > +public class TestJexl3Function extends TestJexl2Function {
> >> > +
> >> > +    public TestJexl3Function(String name) {
> >> > +        super(name);
> >> > +    }
> >> > +
> >> > +    @Override
> >> > +    public void setUp() {
> >> > +        super.setUp();
> >> > +        function = new Jexl3Function();
> >> > +    }
> >> > +}
> >> >
> >> > Propchange:
> >> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >> >
> >>
> ------------------------------------------------------------------------------
> >> >     svn:mime-type = text/plain
> >> >
> >> > Modified: jmeter/trunk/xdocs/changes.xml
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/xdocs/changes.xml (original)
> >> > +++ jmeter/trunk/xdocs/changes.xml Thu Jan 21 14:10:43 2016
> >> > @@ -85,7 +85,8 @@ Summary
> >> >      <li>MongoDB elements (MongoDB Source Config, MongoDB Script) have
> >> been deprecated and will be removed in next version of jmeter. They do
> not
> >> appear anymore in the menu, if you need them modify
> >> <code>not_in_menu</code> property. JMeter team advises not to use them
> >> anymore. See <bugzilla>58772</bugzilla></li>
> >> >      <li>Summariser listener now outputs a formated duration in
> HH:mm:ss
> >> (Hour:Minute:Second), it previously outputed seconds. See
> >> <bugzilla>58776</bugzilla></li>
> >> >      <li>WebService(SOAP) Request and HTML Parameter Mask which were
> >> deprecated in 2.13 version, have now been removed following our <a
> >> href="./usermanual/best-practices.html#deprecation">deprecation
> >> strategy</a></li>
> >> > -
> >>
> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
> >> signature has changed, if you use it ensure you update your code. See
> >> <bugzilla>58845</bugzilla></li>
> >> > +
> >>
> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
> >> signature has changed, if you use it ensure you update your code. See
> >> <bugzilla>58845</bugzilla></li>
> >> > +    <li><code>__jexl</code> function has been deprecated and will be
> >> removed in next version. See <bugzilla>58903</bugzilla></li>
> >> >  </ul>
> >> >
> >> >  <!-- =================== Improvements =================== -->
> >> > @@ -148,6 +149,7 @@ Summary
> >> >  <h3>Functions</h3>
> >> >  <ul>
> >> >      <li><bug>58477</bug> __javaScript function : Allow use of Nashorn
> >> engine for Java8 and later versions</li>
> >> > +    <li><bug>58903</bug>Provide __jexl3 function that uses
> >> commons-jexl3 and deprecated __jexl (1.1) function</li>
> >> >  </ul>
> >> >
> >> >  <h3>I18N</h3>
> >> >
> >> > Modified: jmeter/trunk/xdocs/usermanual/functions.xml
> >> > URL:
> >>
> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/functions.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >> >
> >>
> ==============================================================================
> >> > --- jmeter/trunk/xdocs/usermanual/functions.xml (original)
> >> > +++ jmeter/trunk/xdocs/usermanual/functions.xml Thu Jan 21 14:10:43
> 2016
> >> > @@ -125,7 +125,8 @@ Alternatively, just use <code>/</code> i
> >> >          <tr><td>Calculation</td><td> <a
> >> href="#__UUID">UUID</a></td><td>generate a random type 4
> >> UUID</td><td>2.9</td></tr>
> >> >          <tr><td>Scripting</td><td> <a
> >> href="#__BeanShell">BeanShell</a></td><td>run a BeanShell
> >> script</td><td>1.X</td></tr>
> >> >          <tr><td>Scripting</td><td> <a
> >> href="#__javaScript">javaScript</a></td><td>process JavaScript (Mozilla
> >> Rhino)</td><td>1.9</td></tr>
> >> > -        <tr><td>Scripting</td><td> <a href="#__jexl">jexl,
> >> jexl2</a></td><td>evaluate a Commons Jexl expression</td><td>jexl(2.2),
> >> jexl2(2.6)</td></tr>
> >>
> >> -1, this breaks the tests.
> >>
> >> The __jexl function must continue to be documented even though it is
> >> deprecated.
> >>
> >
> > Can
> >
> >
> >>
> >> > +        <tr><td>Scripting</td><td> <a
> >> href="#__jexl2">jexl2</a></td><td>evaluate a Commons Jexl2
> >> expression</td><td>jexl2(2.6)</td></tr>
> >> > +        <tr><td>Scripting</td><td> <a
> >> href="#__jexl3">jexl3</a></td><td>evaluate a Commons Jexl3
> >> expression</td><td>jexl3 (3.0)</td></tr>
> >> >          <tr><td>Properties</td><td> <a
> href="#__property">property</a>
> >> </td><td>read a property</td><td>2.0</td></tr>
> >> >          <tr><td>Properties</td><td> <a
> href="#__P">P</a></td><td>read a
> >> property (shorthand method)</td><td>2.0</td></tr>
> >> >          <tr><td>Properties</td><td> <a
> >> href="#__setProperty">setProperty</a></td><td>set a JMeter
> >> property</td><td>2.1</td></tr>
> >> > @@ -992,16 +993,16 @@ The following shorthand aliases are prov
> >> >  </p>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.18" name="__jexl" tag="__jexl2">
> >>
> >> -1, the alias must remain until the function is removed entirely
> >>
> > Can you explain this tag thing ?
> > I don't understand what it means although I think it allows reusing
> > documentation of a component for another one (what you call an alias)
>
> Yes, it is effectively an alias.
>
> The point is that the commit broke the tests.
>
> Also, a deprecated function is still usable and must still be documented.
> Though of course one should add a note that it is deprecated.
>
> >>
> >> > +<component index="&sect-num;.5.18" name="__jexl2" >
> >> >  <description>
> >> >      <p>The jexl function returns the result of evaluating a
> >> >      <a href="http://commons.apache.org/jexl">Commons JEXL
> >> expression</a>.
> >> >      See links below for more information on JEXL expressions.
> >> >      </p>
> >> > -    <p>The <code>__jexl</code> function uses Commons JEXL 1, and the
> >> <code>__jexl2</code> function uses Commons JEXL 2</p>
> >> > +    <p>The <code>__jexl2</code> function uses Commons JEXL 2</p>
> >> >      <ul>
> >> > -    <li><a href="
> http://commons.apache.org/jexl/reference/syntax.html">JEXL
> >> syntax description</a></li>
> >> > -    <li><a href="
> >>
> http://commons.apache.org/jexl/reference/examples.html#Example_Expressions
> ">JEXL
> >> examples</a></li>
> >> > +    <li><a href="
> >> http://commons.apache.org/proper/commons-jexl/reference/syntax.html
> ">JEXL
> >> syntax description</a></li>
> >> > +    <li><a href="
> >>
> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions
> ">JEXL
> >> examples</a></li>
> >> >      </ul>
> >> >      </description>
> >> >
> >> > @@ -1043,7 +1044,58 @@ i.intValue(); // or use i.longValue()
> >> >      <note>JMeter allows the expression to contain multiple
> >> statements.</note>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.19" name="__V">
> >> > +<component index="&sect-num;.5.19" name="__jexl3" >
> >> > +<description>
> >> > +    <p>The jexl function returns the result of evaluating a
> >> > +    <a href="http://commons.apache.org/proper/commons-jexl/">Commons
> >> JEXL expression</a>.
> >> > +    See links below for more information on JEXL expressions.
> >> > +    </p>
> >> > +    <p>The <code>__jexl3</code> function uses Commons JEXL 3</p>
> >> > +    <ul>
> >> > +    <li><a href="
> >> http://commons.apache.org/proper/commons-jexl/reference/syntax.html
> ">JEXL
> >> syntax description</a></li>
> >> > +    <li><a href="
> >>
> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions
> ">JEXL
> >> examples</a></li>
> >> > +    </ul>
> >> > +    </description>
> >> > +
> >> > +<properties>
> >> > +        <property name="Expression" required="Yes">
> >> > +        The expression to be evaluated. For example,
> >> <code>6*(5+2)</code>
> >> > +        </property>
> >> > +        <property name="Name of variable" required="No">The name of
> the
> >> variable to set.</property>
> >> > +</properties>
> >> > +<p>
> >> > +The following variables are made available to the script:
> >> > +</p>
> >> > +<ul>
> >> > +<li><code>log</code> - the logger for the function</li>
> >> > +<li><code>ctx</code> - JMeterContext object</li>
> >> > +<li><code>vars</code> - JMeterVariables object</li>
> >> > +<li><code>props</code> - JMeter Properties object</li>
> >> > +<li><code>threadName</code> - String containing the current thread
> name
> >> (in 2.3.2 it was misspelt as "<code>theadName</code>")</li>
> >> > +<li><code>sampler</code> - current Sampler object (if any)</li>
> >> > +<li><code>sampleResult</code> - previous SampleResult object (if
> >> any)</li>
> >> > +<li><code>OUT</code> - System.out - e.g.
> >> <code>OUT.println("message")</code></li>
> >> > +</ul>
> >> > +    <p>
> >> > +    Jexl can also create classes and call methods on them, for
> example:
> >> > +    </p>
> >> > +    <p>
> >> > +    <source>
> >> > +Systemclass=log.class.forName("java.lang.System");
> >> > +now=Systemclass.currentTimeMillis();
> >> > +</source>
> >> > +    Note that the Jexl documentation on the web-site wrongly suggests
> >> that "<code>div</code>" does integer division.
> >> > +    In fact "<code>div</code>" and "<code>/</code>" both perform
> normal
> >> division. One can get the same effect
> >> > +    as follows:
> >> > +    <source>
> >> > +i= 5 / 2;
> >> > +i.intValue(); // or use i.longValue()
> >> > +</source>
> >> > +    </p>
> >> > +    <note>JMeter allows the expression to contain multiple
> >> statements.</note>
> >> > +</component>
> >> > +
> >> > +<component index="&sect-num;.5.20" name="__V">
> >> >  <description>
> >> >      <p>The V (variable) function returns the result of evaluating a
> >> variable name expression.
> >> >      This can be used to evaluate nested variable references (which
> are
> >> not currently supported).
> >> > @@ -1063,7 +1115,7 @@ i.intValue(); // or use i.longValue()
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.20" name="__evalVar">
> >> > +<component index="&sect-num;.5.21" name="__evalVar">
> >> >  <description>
> >> >      <p>The eval function returns the result of evaluating an
> expression
> >> stored in a variable.
> >> >      </p>
> >> > @@ -1081,7 +1133,7 @@ i.intValue(); // or use i.longValue()
> >> >          </property>
> >> >  </properties>
> >> >  </component>
> >> > -<component index="&sect-num;.5.21" name="__eval">
> >> > +<component index="&sect-num;.5.22" name="__eval">
> >> >  <description>
> >> >      <p>The eval function returns the result of evaluating a string
> >> expression.
> >> >      </p>
> >> > @@ -1110,7 +1162,7 @@ i.intValue(); // or use i.longValue()
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.22" name="__char">
> >> > +<component index="&sect-num;.5.23" name="__char">
> >> >  <description>
> >> >      <p>
> >> >      The char function returns the result of evaluating a list of
> >> numbers as Unicode characters.
> >> > @@ -1134,7 +1186,7 @@ i.intValue(); // or use i.longValue()
> >> >   </p>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.23" name="__unescape">
> >> > +<component index="&sect-num;.5.24" name="__unescape">
> >> >  <description>
> >> >      <p>
> >> >      The unescape function returns the result of evaluating a
> >> Java-escaped string. See also <code>__char()</code> above.
> >> > @@ -1157,7 +1209,7 @@ i.intValue(); // or use i.longValue()
> >> >   </p>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.24" name="__unescapeHtml">
> >> > +<component index="&sect-num;.5.25" name="__unescapeHtml">
> >> >  <description>
> >> >      <p>
> >> >  Function to unescape a string containing HTML entity escapes
> >> > @@ -1184,7 +1236,7 @@ e.g. <code>"&amp;gt;&amp;zzzz;x"</code>
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.25" name="__escapeHtml">
> >> > +<component index="&sect-num;.5.26" name="__escapeHtml">
> >> >  <description>
> >> >      <p>
> >> >  Function which escapes the characters in a String using HTML
> entities.
> >> > @@ -1207,7 +1259,7 @@ becomes:
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.26" name="__urldecode">
> >> > +<component index="&sect-num;.5.27" name="__urldecode">
> >> >  <description>
> >> >      <p>
> >> >  Function to decode a <code>application/x-www-form-urlencoded</code>
> >> string.
> >> > @@ -1229,7 +1281,7 @@ For example, the string <code>Word+%22sc
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.27" name="__urlencode">
> >> > +<component index="&sect-num;.5.28" name="__urlencode">
> >> >  <description>
> >> >      <p>
> >> >  Function to encode a string to a
> >> <code>application/x-www-form-urlencoded</code> string.
> >> > @@ -1250,7 +1302,7 @@ For example, the string <code>Word &quot
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.28" name="__FileToString">
> >> > +<component index="&sect-num;.5.29" name="__FileToString">
> >> >
> >> >  <description>
> >> >      <p>
> >> > @@ -1274,7 +1326,7 @@ A reference name - <code>refName</code>
> >> >  <p>The file name, encoding and reference name parameters are resolved
> >> every time the function is executed.</p>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.29" name="__samplerName">
> >> > +<component index="&sect-num;.5.30" name="__samplerName">
> >> >
> >> >  <description>
> >> >      <p>
> >> > @@ -1297,7 +1349,7 @@ A reference name - <code>refName</code>
> >> >  </properties>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.30" name="__TestPlanName">
> >> > +<component index="&sect-num;.5.31" name="__TestPlanName">
> >> >
> >> >  <description>
> >> >      <p>
> >> > @@ -1310,7 +1362,7 @@ A reference name - <code>refName</code>
> >> >  </p>
> >> >  </component>
> >> >
> >> > -<component index="&sect-num;.5.31" name="__escapeOroRegexpChars">
> >> > +<component index="&sect-num;.5.32" name="__escapeOroRegexpChars">
> >> >  <description>
> >> >      <p>
> >> >  Function which escapes the ORO Regexp meta characters, it is the
> >> equivalent of <code>\Q</code> <code>\E</code> in Java Regexp Engine.
> >> >
> >> >
> >>
> >
> >
> >
> > --
> > Cordialement.
> > Philippe Mouawad.
>


-- 
Cordialement.
Philippe Mouawad.

Re: svn commit: r1725955 - in /jmeter/trunk: ./ lib/ licenses/bin/ res/maven/ src/functions/org/apache/jmeter/functions/ test/src/org/apache/jmeter/functions/ xdocs/ xdocs/usermanual/

Posted by sebb <se...@gmail.com>.
On 21 January 2016 at 20:32, Philippe Mouawad
<ph...@gmail.com> wrote:
> On Thu, Jan 21, 2016 at 9:19 PM, sebb <se...@gmail.com> wrote:
>
>> On 21 January 2016 at 14:10,  <pm...@apache.org> wrote:
>> > Author: pmouawad
>> > Date: Thu Jan 21 14:10:43 2016
>> > New Revision: 1725955
>> >
>> > URL: http://svn.apache.org/viewvc?rev=1725955&view=rev
>> > Log:
>> > Bug 58903 - Provide __jexl3 function that uses commons-jexl3 and
>> deprecated __jexl (1.1) function
>> > Add also JUnit tests for jexl2 and jexl3
>> > Bugzilla Id: 58903
>> >
>> > Added:
>> >
>>  jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>>  (with props)
>> >
>>  jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>>  (contents, props changed)
>> >       - copied, changed from r1719809,
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
>> >
>>  jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>>  (with props)
>> > Modified:
>> >     jmeter/trunk/build.properties
>> >     jmeter/trunk/build.xml
>> >     jmeter/trunk/eclipse.classpath
>> >     jmeter/trunk/lib/   (props changed)
>> >     jmeter/trunk/lib/aareadme.txt
>> >     jmeter/trunk/licenses/bin/README.txt
>> >     jmeter/trunk/res/maven/ApacheJMeter_parent.pom
>> >     jmeter/trunk/xdocs/changes.xml
>> >     jmeter/trunk/xdocs/usermanual/functions.xml
>> >
>> > Modified: jmeter/trunk/build.properties
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/build.properties?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/build.properties (original)
>> > +++ jmeter/trunk/build.properties Thu Jan 21 14:10:43 2016
>> > @@ -110,6 +110,11 @@ commons-jexl2.jar           = commons-je
>> >  commons-jexl2.loc           =
>> ${maven2.repo}/org/apache/commons/commons-jexl/${commons-jexl2.version}
>> >  commons-jexl2.md5           = 4ad8f5c161dd3a50e190334555675db9
>> >
>> > +commons-jexl3.version       = 3.0
>> > +commons-jexl3.jar           = commons-jexl3-${commons-jexl3.version}.jar
>> > +commons-jexl3.loc           =
>> ${maven2.repo}/org/apache/commons/commons-jexl3/${commons-jexl3.version}
>> > +commons-jexl3.md5           = 81041b5b058a2ccff0046386bc7e23f8
>> > +
>> >  commons-lang3.version       = 3.4
>> >  commons-lang3.jar           = commons-lang3-${commons-lang3.version}.jar
>> >  commons-lang3.loc           =
>> ${maven2.repo}/org/apache/commons/commons-lang3/${commons-lang3.version}
>> >
>> > Modified: jmeter/trunk/build.xml
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/build.xml (original)
>> > +++ jmeter/trunk/build.xml Thu Jan 21 14:10:43 2016
>> > @@ -370,6 +370,7 @@
>> >      <include name="${lib.dir}/${commons-io.jar}"/>
>> >      <include name="${lib.dir}/${commons-jexl.jar}"/>
>> >      <include name="${lib.dir}/${commons-jexl2.jar}"/>
>> > +       <include name="${lib.dir}/${commons-jexl3.jar}"/>
>> >      <include name="${lib.dir}/${commons-lang3.jar}"/>
>> >      <include name="${lib.dir}/${commons-logging.jar}"/>
>> >      <include name="${lib.dir}/${commons-math3.jar}"/>
>> > @@ -444,6 +445,7 @@
>> >      <pathelement location="${lib.dir}/${commons-io.jar}"/>
>> >      <pathelement location="${lib.dir}/${commons-jexl.jar}"/>
>> >      <pathelement location="${lib.dir}/${commons-jexl2.jar}"/>
>> > +       <pathelement location="${lib.dir}/${commons-jexl3.jar}"/>
>> >      <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
>> >      <pathelement location="${lib.dir}/${commons-logging.jar}"/>
>> >      <pathelement location="${lib.dir}/${commons-math3.jar}"/>
>> > @@ -2844,6 +2846,7 @@ run JMeter unless all the JMeter jars ar
>> >          <process_jarfile jarname="commons-io"/>
>> >          <process_jarfile jarname="commons-jexl"/>
>> >          <process_jarfile jarname="commons-jexl2"/>
>> > +       <process_jarfile jarname="commons-jexl3"/>
>> >          <process_jarfile jarname="commons-lang3"/>
>> >          <process_jarfile jarname="commons-logging"/>
>> >          <process_jarfile jarname="commons-math3"/>
>> >
>> > Modified: jmeter/trunk/eclipse.classpath
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/eclipse.classpath?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/eclipse.classpath (original)
>> > +++ jmeter/trunk/eclipse.classpath Thu Jan 21 14:10:43 2016
>> > @@ -53,6 +53,7 @@
>> >         <classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
>> >         <classpathentry kind="lib" path="lib/commons-jexl-1.1.jar"/>
>> >         <classpathentry kind="lib" path="lib/commons-jexl-2.1.1.jar"/>
>> > +       <classpathentry kind="lib" path="lib/commons-jexl3-3.0.jar"/>
>> >         <classpathentry kind="lib" path="lib/commons-lang3-3.4.jar"/>
>> >         <classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
>> >         <classpathentry kind="lib" path="lib/commons-math3-3.5.jar"/>
>> >
>> > Propchange: jmeter/trunk/lib/
>> >
>> ------------------------------------------------------------------------------
>> > --- svn:ignore (original)
>> > +++ svn:ignore Thu Jan 21 14:10:43 2016
>> > @@ -11,6 +11,7 @@ commons-httpclient-3.1.jar
>> >  commons-io-2.4.jar
>> >  commons-jexl-1.1.jar
>> >  commons-jexl-2.1.1.jar
>> > +commons-jexl3-3.0.jar
>> >  commons-lang3-3.4.jar
>> >  commons-logging-1.2.jar
>> >  commons-math3-3.5.jar
>> >
>> > Modified: jmeter/trunk/lib/aareadme.txt
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/lib/aareadme.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/lib/aareadme.txt (original)
>> > +++ jmeter/trunk/lib/aareadme.txt Thu Jan 21 14:10:43 2016
>> > @@ -51,7 +51,7 @@ commons-io-2.4
>> >  http://commons.apache.org/downloads/download_io.cgi
>> >  - FTPSampler
>> >
>> > -commons-jexl-1.1
>> > +commons-jexl-1.1, commons-jexl-2.1.1, commons-jexl3-3.0
>> >  ----------------
>> >  http://commons.apache.org/downloads/download_jexl.cgi
>> >  - Jexl function and BSF test elements
>> >
>> > Modified: jmeter/trunk/licenses/bin/README.txt
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/licenses/bin/README.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/licenses/bin/README.txt (original)
>> > +++ jmeter/trunk/licenses/bin/README.txt Thu Jan 21 14:10:43 2016
>> > @@ -12,6 +12,7 @@ commons-httpclient-3.1.jar
>> >  commons-io-2.4.jar
>> >  commons-jexl-1.1.jar
>> >  commons-jexl-2.1.1.jar
>> > +commons-jexl3-3.0.jar
>> >  commons-lang3-3.4.jar
>> >  commons-logging-1.2.jar
>> >  commons-math3-3.5.jar
>> >
>> > Modified: jmeter/trunk/res/maven/ApacheJMeter_parent.pom
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/res/maven/ApacheJMeter_parent.pom?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/res/maven/ApacheJMeter_parent.pom (original)
>> > +++ jmeter/trunk/res/maven/ApacheJMeter_parent.pom Thu Jan 21 14:10:43
>> 2016
>> > @@ -65,6 +65,7 @@ under the License.
>> >        <commons-io.version>2.4</commons-io.version>
>> >        <commons-jexl.version>1.1</commons-jexl.version>
>> >        <commons-jexl2.version>2.1.1</commons-jexl2.version>
>> > +      <commons-jexl3.version>3.0</commons-jexl3.version>
>> >        <commons-lang3.version>3.4</commons-lang3.version>
>> >        <commons-logging.version>1.2</commons-logging.version>
>> >        <commons-math3.version>3.5</commons-math3.version>
>> > @@ -177,6 +178,11 @@ under the License.
>> >        </dependency>
>> >        <dependency>
>> >          <groupId>org.apache.commons</groupId>
>> > +        <artifactId>commons-jexl3</artifactId>
>> > +        <version>${commons-jexl3.version}</version>
>> > +      </dependency>
>> > +      <dependency>
>> > +        <groupId>org.apache.commons</groupId>
>> >          <artifactId>commons-lang3</artifactId>
>> >          <version>${commons-lang3.version}</version>
>> >        </dependency>
>> >
>> > Added:
>> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java?rev=1725955&view=auto
>> >
>> ==============================================================================
>> > ---
>> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>> (added)
>> > +++
>> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>> Thu Jan 21 14:10:43 2016
>> > @@ -0,0 +1,164 @@
>> > +/*
>> > + * 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.jmeter.functions;
>> > +
>> > +import java.util.Collection;
>> > +import java.util.LinkedList;
>> > +import java.util.List;
>> > +
>> > +import org.apache.commons.jexl3.JexlBuilder;
>> > +import org.apache.commons.jexl3.JexlContext;
>> > +import org.apache.commons.jexl3.JexlEngine;
>> > +import org.apache.commons.jexl3.JexlExpression;
>> > +import org.apache.commons.jexl3.MapContext;
>> > +import org.apache.jmeter.engine.util.CompoundVariable;
>> > +import org.apache.jmeter.samplers.SampleResult;
>> > +import org.apache.jmeter.samplers.Sampler;
>> > +import org.apache.jmeter.testelement.ThreadListener;
>> > +import org.apache.jmeter.threads.JMeterContext;
>> > +import org.apache.jmeter.threads.JMeterContextService;
>> > +import org.apache.jmeter.threads.JMeterVariables;
>> > +import org.apache.jmeter.util.JMeterUtils;
>> > +import org.apache.jorphan.logging.LoggingManager;
>> > +import org.apache.log.Logger;
>> > +
>> > +/**
>> > + * A function which understands Commons JEXL3
>> > + * @since 3.0
>> > + */
>> > +// For unit tests, see TestJexlFunction
>> > +public class Jexl3Function extends AbstractFunction implements
>> ThreadListener {
>> > +
>> > +    private static final Logger log =
>> LoggingManager.getLoggerForClass();
>> > +
>> > +    private static final String KEY = "__jexl3"; //$NON-NLS-1$
>> > +
>> > +    private static final List<String> desc = new LinkedList<>();
>> > +
>> > +    private static final ThreadLocal<JexlEngine> threadLocalJexl = new
>> ThreadLocal<>();
>> > +
>> > +    static
>> > +    {
>> > +        desc.add(JMeterUtils.getResString("jexl_expression"));
>> //$NON-NLS-1$
>> > +        desc.add(JMeterUtils.getResString("function_name_paropt"));//
>> $NON-NLS1$
>> > +    }
>> > +
>> > +    private Object[] values;
>> > +
>> > +    /** {@inheritDoc} */
>> > +    @Override
>> > +    public String execute(SampleResult previousResult, Sampler
>> currentSampler)
>> > +            throws InvalidVariableException
>> > +    {
>> > +        String str = ""; //$NON-NLS-1$
>> > +
>> > +        CompoundVariable var = (CompoundVariable) values[0];
>> > +        String exp = var.execute();
>> > +
>> > +        String varName = ""; //$NON-NLS-1$
>> > +        if (values.length > 1) {
>> > +            varName = ((CompoundVariable) values[1]).execute().trim();
>> > +        }
>> > +
>> > +        JMeterContext jmctx = JMeterContextService.getContext();
>> > +        JMeterVariables vars = jmctx.getVariables();
>> > +
>> > +        try
>> > +        {
>> > +            JexlContext jc = new MapContext();
>> > +            jc.set("log", log); //$NON-NLS-1$
>> > +            jc.set("ctx", jmctx); //$NON-NLS-1$
>> > +            jc.set("vars", vars); //$NON-NLS-1$
>> > +            jc.set("props", JMeterUtils.getJMeterProperties());
>> //$NON-NLS-1$
>> > +            // Previously mis-spelt as theadName
>> > +            jc.set("threadName", Thread.currentThread().getName());
>> //$NON-NLS-1$
>> > +            jc.set("sampler", currentSampler); //$NON-NLS-1$ (may be
>> null)
>> > +            jc.set("sampleResult", previousResult); //$NON-NLS-1$ (may
>> be null)
>> > +            jc.set("OUT", System.out);//$NON-NLS-1$
>> > +
>> > +            // Now evaluate the script, getting the result
>> > +            JexlExpression e = getJexlEngine().createExpression( exp );
>> > +            Object o = e.evaluate(jc);
>> > +            if (o != null)
>> > +            {
>> > +                str = o.toString();
>> > +            }
>> > +            if (vars != null && varName.length() > 0) {// vars will be
>> null on TestPlan
>> > +                vars.put(varName, str);
>> > +            }
>> > +        } catch (Exception e)
>> > +        {
>> > +            log.error("An error occurred while evaluating the
>> expression \""
>> > +                    + exp + "\"\n",e);
>> > +        }
>> > +        return str;
>> > +    }
>> > +
>> > +    /**
>> > +     * Get JexlEngine from ThreadLocal
>> > +     * @return JexlEngine
>> > +     */
>> > +    private static JexlEngine getJexlEngine() {
>> > +        JexlEngine engine = threadLocalJexl.get();
>> > +        if(engine == null) {
>> > +            engine = new JexlBuilder()
>> > +                    .cache(512)
>> > +                    .silent(true)
>> > +                    .strict(true)
>> > +                    .create();
>> > +            threadLocalJexl.set(engine);
>> > +        }
>> > +        return engine;
>> > +    }
>> > +
>> > +    /** {@inheritDoc} */
>> > +    @Override
>> > +    public List<String> getArgumentDesc()
>> > +    {
>> > +        return desc;
>> > +    }
>> > +
>> > +    /** {@inheritDoc} */
>> > +    @Override
>> > +    public String getReferenceKey()
>> > +    {
>> > +        return KEY;
>> > +    }
>> > +
>> > +    /** {@inheritDoc} */
>> > +    @Override
>> > +    public void setParameters(Collection<CompoundVariable> parameters)
>> > +            throws InvalidVariableException
>> > +    {
>> > +        checkParameterCount(parameters, 1, 2);
>> > +        values = parameters.toArray();
>> > +    }
>> > +
>> > +    @Override
>> > +    public void threadStarted() {
>> > +    }
>> > +
>> > +    @Override
>> > +    public void threadFinished() {
>> > +        JexlEngine engine = threadLocalJexl.get();
>> > +        if(engine != null) {
>> > +            engine.clearCache();
>> > +            threadLocalJexl.remove();
>> > +        }
>> > +    }
>> > +
>> > +}
>> >
>> > Propchange:
>> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>> >
>> ------------------------------------------------------------------------------
>> >     svn:mime-type = text/plain
>> >
>> > Copied:
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>> (from r1719809,
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java)
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java?p2=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java&p1=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java&r1=1719809&r2=1725955&rev=1725955&view=diff
>> >
>> ==============================================================================
>> > ---
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
>> (original)
>> > +++
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>> Thu Jan 21 14:10:43 2016
>> > @@ -28,8 +28,8 @@ import org.apache.jmeter.threads.JMeterC
>> >  import org.apache.jmeter.threads.JMeterContextService;
>> >  import org.apache.jmeter.threads.JMeterVariables;
>> >
>> > -public class TestJexlFunction extends JMeterTestCase {
>> > -    private JexlFunction function;
>> > +public class TestJexl2Function extends JMeterTestCase {
>> > +    protected AbstractFunction function;
>> >
>> >      private SampleResult result;
>> >
>> > @@ -39,13 +39,13 @@ public class TestJexlFunction extends JM
>> >
>> >      private JMeterContext jmctx;
>> >
>> > -    public TestJexlFunction(String name) {
>> > +    public TestJexl2Function(String name) {
>> >          super(name);
>> >      }
>> >
>> >      @Override
>> >      public void setUp() {
>> > -        function = new JexlFunction();
>> > +        function = new Jexl2Function();
>> >          result = new SampleResult();
>> >          jmctx = JMeterContextService.getContext();
>> >          String data = "The quick brown fox";
>> >
>> > Propchange:
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>> >
>> ------------------------------------------------------------------------------
>> >     svn:eol-style = native
>> >
>> > Propchange:
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>> >
>> ------------------------------------------------------------------------------
>> >     svn:keywords = Author Date Id Revision
>> >
>> > Added:
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java?rev=1725955&view=auto
>> >
>> ==============================================================================
>> > ---
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>> (added)
>> > +++
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>> Thu Jan 21 14:10:43 2016
>> > @@ -0,0 +1,33 @@
>> > +/*
>> > + * 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.jmeter.functions;
>> > +
>> > +
>> > +public class TestJexl3Function extends TestJexl2Function {
>> > +
>> > +    public TestJexl3Function(String name) {
>> > +        super(name);
>> > +    }
>> > +
>> > +    @Override
>> > +    public void setUp() {
>> > +        super.setUp();
>> > +        function = new Jexl3Function();
>> > +    }
>> > +}
>> >
>> > Propchange:
>> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>> >
>> ------------------------------------------------------------------------------
>> >     svn:mime-type = text/plain
>> >
>> > Modified: jmeter/trunk/xdocs/changes.xml
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/xdocs/changes.xml (original)
>> > +++ jmeter/trunk/xdocs/changes.xml Thu Jan 21 14:10:43 2016
>> > @@ -85,7 +85,8 @@ Summary
>> >      <li>MongoDB elements (MongoDB Source Config, MongoDB Script) have
>> been deprecated and will be removed in next version of jmeter. They do not
>> appear anymore in the menu, if you need them modify
>> <code>not_in_menu</code> property. JMeter team advises not to use them
>> anymore. See <bugzilla>58772</bugzilla></li>
>> >      <li>Summariser listener now outputs a formated duration in HH:mm:ss
>> (Hour:Minute:Second), it previously outputed seconds. See
>> <bugzilla>58776</bugzilla></li>
>> >      <li>WebService(SOAP) Request and HTML Parameter Mask which were
>> deprecated in 2.13 version, have now been removed following our <a
>> href="./usermanual/best-practices.html#deprecation">deprecation
>> strategy</a></li>
>> > -
>> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
>> signature has changed, if you use it ensure you update your code. See
>> <bugzilla>58845</bugzilla></li>
>> > +
>> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
>> signature has changed, if you use it ensure you update your code. See
>> <bugzilla>58845</bugzilla></li>
>> > +    <li><code>__jexl</code> function has been deprecated and will be
>> removed in next version. See <bugzilla>58903</bugzilla></li>
>> >  </ul>
>> >
>> >  <!-- =================== Improvements =================== -->
>> > @@ -148,6 +149,7 @@ Summary
>> >  <h3>Functions</h3>
>> >  <ul>
>> >      <li><bug>58477</bug> __javaScript function : Allow use of Nashorn
>> engine for Java8 and later versions</li>
>> > +    <li><bug>58903</bug>Provide __jexl3 function that uses
>> commons-jexl3 and deprecated __jexl (1.1) function</li>
>> >  </ul>
>> >
>> >  <h3>I18N</h3>
>> >
>> > Modified: jmeter/trunk/xdocs/usermanual/functions.xml
>> > URL:
>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/functions.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
>> >
>> ==============================================================================
>> > --- jmeter/trunk/xdocs/usermanual/functions.xml (original)
>> > +++ jmeter/trunk/xdocs/usermanual/functions.xml Thu Jan 21 14:10:43 2016
>> > @@ -125,7 +125,8 @@ Alternatively, just use <code>/</code> i
>> >          <tr><td>Calculation</td><td> <a
>> href="#__UUID">UUID</a></td><td>generate a random type 4
>> UUID</td><td>2.9</td></tr>
>> >          <tr><td>Scripting</td><td> <a
>> href="#__BeanShell">BeanShell</a></td><td>run a BeanShell
>> script</td><td>1.X</td></tr>
>> >          <tr><td>Scripting</td><td> <a
>> href="#__javaScript">javaScript</a></td><td>process JavaScript (Mozilla
>> Rhino)</td><td>1.9</td></tr>
>> > -        <tr><td>Scripting</td><td> <a href="#__jexl">jexl,
>> jexl2</a></td><td>evaluate a Commons Jexl expression</td><td>jexl(2.2),
>> jexl2(2.6)</td></tr>
>>
>> -1, this breaks the tests.
>>
>> The __jexl function must continue to be documented even though it is
>> deprecated.
>>
>
> Can
>
>
>>
>> > +        <tr><td>Scripting</td><td> <a
>> href="#__jexl2">jexl2</a></td><td>evaluate a Commons Jexl2
>> expression</td><td>jexl2(2.6)</td></tr>
>> > +        <tr><td>Scripting</td><td> <a
>> href="#__jexl3">jexl3</a></td><td>evaluate a Commons Jexl3
>> expression</td><td>jexl3 (3.0)</td></tr>
>> >          <tr><td>Properties</td><td> <a href="#__property">property</a>
>> </td><td>read a property</td><td>2.0</td></tr>
>> >          <tr><td>Properties</td><td> <a href="#__P">P</a></td><td>read a
>> property (shorthand method)</td><td>2.0</td></tr>
>> >          <tr><td>Properties</td><td> <a
>> href="#__setProperty">setProperty</a></td><td>set a JMeter
>> property</td><td>2.1</td></tr>
>> > @@ -992,16 +993,16 @@ The following shorthand aliases are prov
>> >  </p>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.18" name="__jexl" tag="__jexl2">
>>
>> -1, the alias must remain until the function is removed entirely
>>
> Can you explain this tag thing ?
> I don't understand what it means although I think it allows reusing
> documentation of a component for another one (what you call an alias)

Yes, it is effectively an alias.

The point is that the commit broke the tests.

Also, a deprecated function is still usable and must still be documented.
Though of course one should add a note that it is deprecated.

>>
>> > +<component index="&sect-num;.5.18" name="__jexl2" >
>> >  <description>
>> >      <p>The jexl function returns the result of evaluating a
>> >      <a href="http://commons.apache.org/jexl">Commons JEXL
>> expression</a>.
>> >      See links below for more information on JEXL expressions.
>> >      </p>
>> > -    <p>The <code>__jexl</code> function uses Commons JEXL 1, and the
>> <code>__jexl2</code> function uses Commons JEXL 2</p>
>> > +    <p>The <code>__jexl2</code> function uses Commons JEXL 2</p>
>> >      <ul>
>> > -    <li><a href="http://commons.apache.org/jexl/reference/syntax.html">JEXL
>> syntax description</a></li>
>> > -    <li><a href="
>> http://commons.apache.org/jexl/reference/examples.html#Example_Expressions">JEXL
>> examples</a></li>
>> > +    <li><a href="
>> http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL
>> syntax description</a></li>
>> > +    <li><a href="
>> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL
>> examples</a></li>
>> >      </ul>
>> >      </description>
>> >
>> > @@ -1043,7 +1044,58 @@ i.intValue(); // or use i.longValue()
>> >      <note>JMeter allows the expression to contain multiple
>> statements.</note>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.19" name="__V">
>> > +<component index="&sect-num;.5.19" name="__jexl3" >
>> > +<description>
>> > +    <p>The jexl function returns the result of evaluating a
>> > +    <a href="http://commons.apache.org/proper/commons-jexl/">Commons
>> JEXL expression</a>.
>> > +    See links below for more information on JEXL expressions.
>> > +    </p>
>> > +    <p>The <code>__jexl3</code> function uses Commons JEXL 3</p>
>> > +    <ul>
>> > +    <li><a href="
>> http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL
>> syntax description</a></li>
>> > +    <li><a href="
>> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL
>> examples</a></li>
>> > +    </ul>
>> > +    </description>
>> > +
>> > +<properties>
>> > +        <property name="Expression" required="Yes">
>> > +        The expression to be evaluated. For example,
>> <code>6*(5+2)</code>
>> > +        </property>
>> > +        <property name="Name of variable" required="No">The name of the
>> variable to set.</property>
>> > +</properties>
>> > +<p>
>> > +The following variables are made available to the script:
>> > +</p>
>> > +<ul>
>> > +<li><code>log</code> - the logger for the function</li>
>> > +<li><code>ctx</code> - JMeterContext object</li>
>> > +<li><code>vars</code> - JMeterVariables object</li>
>> > +<li><code>props</code> - JMeter Properties object</li>
>> > +<li><code>threadName</code> - String containing the current thread name
>> (in 2.3.2 it was misspelt as "<code>theadName</code>")</li>
>> > +<li><code>sampler</code> - current Sampler object (if any)</li>
>> > +<li><code>sampleResult</code> - previous SampleResult object (if
>> any)</li>
>> > +<li><code>OUT</code> - System.out - e.g.
>> <code>OUT.println("message")</code></li>
>> > +</ul>
>> > +    <p>
>> > +    Jexl can also create classes and call methods on them, for example:
>> > +    </p>
>> > +    <p>
>> > +    <source>
>> > +Systemclass=log.class.forName("java.lang.System");
>> > +now=Systemclass.currentTimeMillis();
>> > +</source>
>> > +    Note that the Jexl documentation on the web-site wrongly suggests
>> that "<code>div</code>" does integer division.
>> > +    In fact "<code>div</code>" and "<code>/</code>" both perform normal
>> division. One can get the same effect
>> > +    as follows:
>> > +    <source>
>> > +i= 5 / 2;
>> > +i.intValue(); // or use i.longValue()
>> > +</source>
>> > +    </p>
>> > +    <note>JMeter allows the expression to contain multiple
>> statements.</note>
>> > +</component>
>> > +
>> > +<component index="&sect-num;.5.20" name="__V">
>> >  <description>
>> >      <p>The V (variable) function returns the result of evaluating a
>> variable name expression.
>> >      This can be used to evaluate nested variable references (which are
>> not currently supported).
>> > @@ -1063,7 +1115,7 @@ i.intValue(); // or use i.longValue()
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.20" name="__evalVar">
>> > +<component index="&sect-num;.5.21" name="__evalVar">
>> >  <description>
>> >      <p>The eval function returns the result of evaluating an expression
>> stored in a variable.
>> >      </p>
>> > @@ -1081,7 +1133,7 @@ i.intValue(); // or use i.longValue()
>> >          </property>
>> >  </properties>
>> >  </component>
>> > -<component index="&sect-num;.5.21" name="__eval">
>> > +<component index="&sect-num;.5.22" name="__eval">
>> >  <description>
>> >      <p>The eval function returns the result of evaluating a string
>> expression.
>> >      </p>
>> > @@ -1110,7 +1162,7 @@ i.intValue(); // or use i.longValue()
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.22" name="__char">
>> > +<component index="&sect-num;.5.23" name="__char">
>> >  <description>
>> >      <p>
>> >      The char function returns the result of evaluating a list of
>> numbers as Unicode characters.
>> > @@ -1134,7 +1186,7 @@ i.intValue(); // or use i.longValue()
>> >   </p>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.23" name="__unescape">
>> > +<component index="&sect-num;.5.24" name="__unescape">
>> >  <description>
>> >      <p>
>> >      The unescape function returns the result of evaluating a
>> Java-escaped string. See also <code>__char()</code> above.
>> > @@ -1157,7 +1209,7 @@ i.intValue(); // or use i.longValue()
>> >   </p>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.24" name="__unescapeHtml">
>> > +<component index="&sect-num;.5.25" name="__unescapeHtml">
>> >  <description>
>> >      <p>
>> >  Function to unescape a string containing HTML entity escapes
>> > @@ -1184,7 +1236,7 @@ e.g. <code>"&amp;gt;&amp;zzzz;x"</code>
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.25" name="__escapeHtml">
>> > +<component index="&sect-num;.5.26" name="__escapeHtml">
>> >  <description>
>> >      <p>
>> >  Function which escapes the characters in a String using HTML entities.
>> > @@ -1207,7 +1259,7 @@ becomes:
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.26" name="__urldecode">
>> > +<component index="&sect-num;.5.27" name="__urldecode">
>> >  <description>
>> >      <p>
>> >  Function to decode a <code>application/x-www-form-urlencoded</code>
>> string.
>> > @@ -1229,7 +1281,7 @@ For example, the string <code>Word+%22sc
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.27" name="__urlencode">
>> > +<component index="&sect-num;.5.28" name="__urlencode">
>> >  <description>
>> >      <p>
>> >  Function to encode a string to a
>> <code>application/x-www-form-urlencoded</code> string.
>> > @@ -1250,7 +1302,7 @@ For example, the string <code>Word &quot
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.28" name="__FileToString">
>> > +<component index="&sect-num;.5.29" name="__FileToString">
>> >
>> >  <description>
>> >      <p>
>> > @@ -1274,7 +1326,7 @@ A reference name - <code>refName</code>
>> >  <p>The file name, encoding and reference name parameters are resolved
>> every time the function is executed.</p>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.29" name="__samplerName">
>> > +<component index="&sect-num;.5.30" name="__samplerName">
>> >
>> >  <description>
>> >      <p>
>> > @@ -1297,7 +1349,7 @@ A reference name - <code>refName</code>
>> >  </properties>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.30" name="__TestPlanName">
>> > +<component index="&sect-num;.5.31" name="__TestPlanName">
>> >
>> >  <description>
>> >      <p>
>> > @@ -1310,7 +1362,7 @@ A reference name - <code>refName</code>
>> >  </p>
>> >  </component>
>> >
>> > -<component index="&sect-num;.5.31" name="__escapeOroRegexpChars">
>> > +<component index="&sect-num;.5.32" name="__escapeOroRegexpChars">
>> >  <description>
>> >      <p>
>> >  Function which escapes the ORO Regexp meta characters, it is the
>> equivalent of <code>\Q</code> <code>\E</code> in Java Regexp Engine.
>> >
>> >
>>
>
>
>
> --
> Cordialement.
> Philippe Mouawad.

Re: svn commit: r1725955 - in /jmeter/trunk: ./ lib/ licenses/bin/ res/maven/ src/functions/org/apache/jmeter/functions/ test/src/org/apache/jmeter/functions/ xdocs/ xdocs/usermanual/

Posted by Philippe Mouawad <ph...@gmail.com>.
On Thu, Jan 21, 2016 at 9:19 PM, sebb <se...@gmail.com> wrote:

> On 21 January 2016 at 14:10,  <pm...@apache.org> wrote:
> > Author: pmouawad
> > Date: Thu Jan 21 14:10:43 2016
> > New Revision: 1725955
> >
> > URL: http://svn.apache.org/viewvc?rev=1725955&view=rev
> > Log:
> > Bug 58903 - Provide __jexl3 function that uses commons-jexl3 and
> deprecated __jexl (1.1) function
> > Add also JUnit tests for jexl2 and jexl3
> > Bugzilla Id: 58903
> >
> > Added:
> >
>  jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
>  (with props)
> >
>  jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
>  (contents, props changed)
> >       - copied, changed from r1719809,
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
> >
>  jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
>  (with props)
> > Modified:
> >     jmeter/trunk/build.properties
> >     jmeter/trunk/build.xml
> >     jmeter/trunk/eclipse.classpath
> >     jmeter/trunk/lib/   (props changed)
> >     jmeter/trunk/lib/aareadme.txt
> >     jmeter/trunk/licenses/bin/README.txt
> >     jmeter/trunk/res/maven/ApacheJMeter_parent.pom
> >     jmeter/trunk/xdocs/changes.xml
> >     jmeter/trunk/xdocs/usermanual/functions.xml
> >
> > Modified: jmeter/trunk/build.properties
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/build.properties?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/build.properties (original)
> > +++ jmeter/trunk/build.properties Thu Jan 21 14:10:43 2016
> > @@ -110,6 +110,11 @@ commons-jexl2.jar           = commons-je
> >  commons-jexl2.loc           =
> ${maven2.repo}/org/apache/commons/commons-jexl/${commons-jexl2.version}
> >  commons-jexl2.md5           = 4ad8f5c161dd3a50e190334555675db9
> >
> > +commons-jexl3.version       = 3.0
> > +commons-jexl3.jar           = commons-jexl3-${commons-jexl3.version}.jar
> > +commons-jexl3.loc           =
> ${maven2.repo}/org/apache/commons/commons-jexl3/${commons-jexl3.version}
> > +commons-jexl3.md5           = 81041b5b058a2ccff0046386bc7e23f8
> > +
> >  commons-lang3.version       = 3.4
> >  commons-lang3.jar           = commons-lang3-${commons-lang3.version}.jar
> >  commons-lang3.loc           =
> ${maven2.repo}/org/apache/commons/commons-lang3/${commons-lang3.version}
> >
> > Modified: jmeter/trunk/build.xml
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/build.xml (original)
> > +++ jmeter/trunk/build.xml Thu Jan 21 14:10:43 2016
> > @@ -370,6 +370,7 @@
> >      <include name="${lib.dir}/${commons-io.jar}"/>
> >      <include name="${lib.dir}/${commons-jexl.jar}"/>
> >      <include name="${lib.dir}/${commons-jexl2.jar}"/>
> > +       <include name="${lib.dir}/${commons-jexl3.jar}"/>
> >      <include name="${lib.dir}/${commons-lang3.jar}"/>
> >      <include name="${lib.dir}/${commons-logging.jar}"/>
> >      <include name="${lib.dir}/${commons-math3.jar}"/>
> > @@ -444,6 +445,7 @@
> >      <pathelement location="${lib.dir}/${commons-io.jar}"/>
> >      <pathelement location="${lib.dir}/${commons-jexl.jar}"/>
> >      <pathelement location="${lib.dir}/${commons-jexl2.jar}"/>
> > +       <pathelement location="${lib.dir}/${commons-jexl3.jar}"/>
> >      <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
> >      <pathelement location="${lib.dir}/${commons-logging.jar}"/>
> >      <pathelement location="${lib.dir}/${commons-math3.jar}"/>
> > @@ -2844,6 +2846,7 @@ run JMeter unless all the JMeter jars ar
> >          <process_jarfile jarname="commons-io"/>
> >          <process_jarfile jarname="commons-jexl"/>
> >          <process_jarfile jarname="commons-jexl2"/>
> > +       <process_jarfile jarname="commons-jexl3"/>
> >          <process_jarfile jarname="commons-lang3"/>
> >          <process_jarfile jarname="commons-logging"/>
> >          <process_jarfile jarname="commons-math3"/>
> >
> > Modified: jmeter/trunk/eclipse.classpath
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/eclipse.classpath?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/eclipse.classpath (original)
> > +++ jmeter/trunk/eclipse.classpath Thu Jan 21 14:10:43 2016
> > @@ -53,6 +53,7 @@
> >         <classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
> >         <classpathentry kind="lib" path="lib/commons-jexl-1.1.jar"/>
> >         <classpathentry kind="lib" path="lib/commons-jexl-2.1.1.jar"/>
> > +       <classpathentry kind="lib" path="lib/commons-jexl3-3.0.jar"/>
> >         <classpathentry kind="lib" path="lib/commons-lang3-3.4.jar"/>
> >         <classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
> >         <classpathentry kind="lib" path="lib/commons-math3-3.5.jar"/>
> >
> > Propchange: jmeter/trunk/lib/
> >
> ------------------------------------------------------------------------------
> > --- svn:ignore (original)
> > +++ svn:ignore Thu Jan 21 14:10:43 2016
> > @@ -11,6 +11,7 @@ commons-httpclient-3.1.jar
> >  commons-io-2.4.jar
> >  commons-jexl-1.1.jar
> >  commons-jexl-2.1.1.jar
> > +commons-jexl3-3.0.jar
> >  commons-lang3-3.4.jar
> >  commons-logging-1.2.jar
> >  commons-math3-3.5.jar
> >
> > Modified: jmeter/trunk/lib/aareadme.txt
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/lib/aareadme.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/lib/aareadme.txt (original)
> > +++ jmeter/trunk/lib/aareadme.txt Thu Jan 21 14:10:43 2016
> > @@ -51,7 +51,7 @@ commons-io-2.4
> >  http://commons.apache.org/downloads/download_io.cgi
> >  - FTPSampler
> >
> > -commons-jexl-1.1
> > +commons-jexl-1.1, commons-jexl-2.1.1, commons-jexl3-3.0
> >  ----------------
> >  http://commons.apache.org/downloads/download_jexl.cgi
> >  - Jexl function and BSF test elements
> >
> > Modified: jmeter/trunk/licenses/bin/README.txt
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/licenses/bin/README.txt?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/licenses/bin/README.txt (original)
> > +++ jmeter/trunk/licenses/bin/README.txt Thu Jan 21 14:10:43 2016
> > @@ -12,6 +12,7 @@ commons-httpclient-3.1.jar
> >  commons-io-2.4.jar
> >  commons-jexl-1.1.jar
> >  commons-jexl-2.1.1.jar
> > +commons-jexl3-3.0.jar
> >  commons-lang3-3.4.jar
> >  commons-logging-1.2.jar
> >  commons-math3-3.5.jar
> >
> > Modified: jmeter/trunk/res/maven/ApacheJMeter_parent.pom
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/res/maven/ApacheJMeter_parent.pom?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/res/maven/ApacheJMeter_parent.pom (original)
> > +++ jmeter/trunk/res/maven/ApacheJMeter_parent.pom Thu Jan 21 14:10:43
> 2016
> > @@ -65,6 +65,7 @@ under the License.
> >        <commons-io.version>2.4</commons-io.version>
> >        <commons-jexl.version>1.1</commons-jexl.version>
> >        <commons-jexl2.version>2.1.1</commons-jexl2.version>
> > +      <commons-jexl3.version>3.0</commons-jexl3.version>
> >        <commons-lang3.version>3.4</commons-lang3.version>
> >        <commons-logging.version>1.2</commons-logging.version>
> >        <commons-math3.version>3.5</commons-math3.version>
> > @@ -177,6 +178,11 @@ under the License.
> >        </dependency>
> >        <dependency>
> >          <groupId>org.apache.commons</groupId>
> > +        <artifactId>commons-jexl3</artifactId>
> > +        <version>${commons-jexl3.version}</version>
> > +      </dependency>
> > +      <dependency>
> > +        <groupId>org.apache.commons</groupId>
> >          <artifactId>commons-lang3</artifactId>
> >          <version>${commons-lang3.version}</version>
> >        </dependency>
> >
> > Added:
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java?rev=1725955&view=auto
> >
> ==============================================================================
> > ---
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> (added)
> > +++
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> Thu Jan 21 14:10:43 2016
> > @@ -0,0 +1,164 @@
> > +/*
> > + * 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.jmeter.functions;
> > +
> > +import java.util.Collection;
> > +import java.util.LinkedList;
> > +import java.util.List;
> > +
> > +import org.apache.commons.jexl3.JexlBuilder;
> > +import org.apache.commons.jexl3.JexlContext;
> > +import org.apache.commons.jexl3.JexlEngine;
> > +import org.apache.commons.jexl3.JexlExpression;
> > +import org.apache.commons.jexl3.MapContext;
> > +import org.apache.jmeter.engine.util.CompoundVariable;
> > +import org.apache.jmeter.samplers.SampleResult;
> > +import org.apache.jmeter.samplers.Sampler;
> > +import org.apache.jmeter.testelement.ThreadListener;
> > +import org.apache.jmeter.threads.JMeterContext;
> > +import org.apache.jmeter.threads.JMeterContextService;
> > +import org.apache.jmeter.threads.JMeterVariables;
> > +import org.apache.jmeter.util.JMeterUtils;
> > +import org.apache.jorphan.logging.LoggingManager;
> > +import org.apache.log.Logger;
> > +
> > +/**
> > + * A function which understands Commons JEXL3
> > + * @since 3.0
> > + */
> > +// For unit tests, see TestJexlFunction
> > +public class Jexl3Function extends AbstractFunction implements
> ThreadListener {
> > +
> > +    private static final Logger log =
> LoggingManager.getLoggerForClass();
> > +
> > +    private static final String KEY = "__jexl3"; //$NON-NLS-1$
> > +
> > +    private static final List<String> desc = new LinkedList<>();
> > +
> > +    private static final ThreadLocal<JexlEngine> threadLocalJexl = new
> ThreadLocal<>();
> > +
> > +    static
> > +    {
> > +        desc.add(JMeterUtils.getResString("jexl_expression"));
> //$NON-NLS-1$
> > +        desc.add(JMeterUtils.getResString("function_name_paropt"));//
> $NON-NLS1$
> > +    }
> > +
> > +    private Object[] values;
> > +
> > +    /** {@inheritDoc} */
> > +    @Override
> > +    public String execute(SampleResult previousResult, Sampler
> currentSampler)
> > +            throws InvalidVariableException
> > +    {
> > +        String str = ""; //$NON-NLS-1$
> > +
> > +        CompoundVariable var = (CompoundVariable) values[0];
> > +        String exp = var.execute();
> > +
> > +        String varName = ""; //$NON-NLS-1$
> > +        if (values.length > 1) {
> > +            varName = ((CompoundVariable) values[1]).execute().trim();
> > +        }
> > +
> > +        JMeterContext jmctx = JMeterContextService.getContext();
> > +        JMeterVariables vars = jmctx.getVariables();
> > +
> > +        try
> > +        {
> > +            JexlContext jc = new MapContext();
> > +            jc.set("log", log); //$NON-NLS-1$
> > +            jc.set("ctx", jmctx); //$NON-NLS-1$
> > +            jc.set("vars", vars); //$NON-NLS-1$
> > +            jc.set("props", JMeterUtils.getJMeterProperties());
> //$NON-NLS-1$
> > +            // Previously mis-spelt as theadName
> > +            jc.set("threadName", Thread.currentThread().getName());
> //$NON-NLS-1$
> > +            jc.set("sampler", currentSampler); //$NON-NLS-1$ (may be
> null)
> > +            jc.set("sampleResult", previousResult); //$NON-NLS-1$ (may
> be null)
> > +            jc.set("OUT", System.out);//$NON-NLS-1$
> > +
> > +            // Now evaluate the script, getting the result
> > +            JexlExpression e = getJexlEngine().createExpression( exp );
> > +            Object o = e.evaluate(jc);
> > +            if (o != null)
> > +            {
> > +                str = o.toString();
> > +            }
> > +            if (vars != null && varName.length() > 0) {// vars will be
> null on TestPlan
> > +                vars.put(varName, str);
> > +            }
> > +        } catch (Exception e)
> > +        {
> > +            log.error("An error occurred while evaluating the
> expression \""
> > +                    + exp + "\"\n",e);
> > +        }
> > +        return str;
> > +    }
> > +
> > +    /**
> > +     * Get JexlEngine from ThreadLocal
> > +     * @return JexlEngine
> > +     */
> > +    private static JexlEngine getJexlEngine() {
> > +        JexlEngine engine = threadLocalJexl.get();
> > +        if(engine == null) {
> > +            engine = new JexlBuilder()
> > +                    .cache(512)
> > +                    .silent(true)
> > +                    .strict(true)
> > +                    .create();
> > +            threadLocalJexl.set(engine);
> > +        }
> > +        return engine;
> > +    }
> > +
> > +    /** {@inheritDoc} */
> > +    @Override
> > +    public List<String> getArgumentDesc()
> > +    {
> > +        return desc;
> > +    }
> > +
> > +    /** {@inheritDoc} */
> > +    @Override
> > +    public String getReferenceKey()
> > +    {
> > +        return KEY;
> > +    }
> > +
> > +    /** {@inheritDoc} */
> > +    @Override
> > +    public void setParameters(Collection<CompoundVariable> parameters)
> > +            throws InvalidVariableException
> > +    {
> > +        checkParameterCount(parameters, 1, 2);
> > +        values = parameters.toArray();
> > +    }
> > +
> > +    @Override
> > +    public void threadStarted() {
> > +    }
> > +
> > +    @Override
> > +    public void threadFinished() {
> > +        JexlEngine engine = threadLocalJexl.get();
> > +        if(engine != null) {
> > +            engine.clearCache();
> > +            threadLocalJexl.remove();
> > +        }
> > +    }
> > +
> > +}
> >
> > Propchange:
> jmeter/trunk/src/functions/org/apache/jmeter/functions/Jexl3Function.java
> >
> ------------------------------------------------------------------------------
> >     svn:mime-type = text/plain
> >
> > Copied:
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> (from r1719809,
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java)
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java?p2=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java&p1=jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java&r1=1719809&r2=1725955&rev=1725955&view=diff
> >
> ==============================================================================
> > ---
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexlFunction.java
> (original)
> > +++
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> Thu Jan 21 14:10:43 2016
> > @@ -28,8 +28,8 @@ import org.apache.jmeter.threads.JMeterC
> >  import org.apache.jmeter.threads.JMeterContextService;
> >  import org.apache.jmeter.threads.JMeterVariables;
> >
> > -public class TestJexlFunction extends JMeterTestCase {
> > -    private JexlFunction function;
> > +public class TestJexl2Function extends JMeterTestCase {
> > +    protected AbstractFunction function;
> >
> >      private SampleResult result;
> >
> > @@ -39,13 +39,13 @@ public class TestJexlFunction extends JM
> >
> >      private JMeterContext jmctx;
> >
> > -    public TestJexlFunction(String name) {
> > +    public TestJexl2Function(String name) {
> >          super(name);
> >      }
> >
> >      @Override
> >      public void setUp() {
> > -        function = new JexlFunction();
> > +        function = new Jexl2Function();
> >          result = new SampleResult();
> >          jmctx = JMeterContextService.getContext();
> >          String data = "The quick brown fox";
> >
> > Propchange:
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >
> ------------------------------------------------------------------------------
> >     svn:eol-style = native
> >
> > Propchange:
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl2Function.java
> >
> ------------------------------------------------------------------------------
> >     svn:keywords = Author Date Id Revision
> >
> > Added:
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java?rev=1725955&view=auto
> >
> ==============================================================================
> > ---
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> (added)
> > +++
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> Thu Jan 21 14:10:43 2016
> > @@ -0,0 +1,33 @@
> > +/*
> > + * 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.jmeter.functions;
> > +
> > +
> > +public class TestJexl3Function extends TestJexl2Function {
> > +
> > +    public TestJexl3Function(String name) {
> > +        super(name);
> > +    }
> > +
> > +    @Override
> > +    public void setUp() {
> > +        super.setUp();
> > +        function = new Jexl3Function();
> > +    }
> > +}
> >
> > Propchange:
> jmeter/trunk/test/src/org/apache/jmeter/functions/TestJexl3Function.java
> >
> ------------------------------------------------------------------------------
> >     svn:mime-type = text/plain
> >
> > Modified: jmeter/trunk/xdocs/changes.xml
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/xdocs/changes.xml (original)
> > +++ jmeter/trunk/xdocs/changes.xml Thu Jan 21 14:10:43 2016
> > @@ -85,7 +85,8 @@ Summary
> >      <li>MongoDB elements (MongoDB Source Config, MongoDB Script) have
> been deprecated and will be removed in next version of jmeter. They do not
> appear anymore in the menu, if you need them modify
> <code>not_in_menu</code> property. JMeter team advises not to use them
> anymore. See <bugzilla>58772</bugzilla></li>
> >      <li>Summariser listener now outputs a formated duration in HH:mm:ss
> (Hour:Minute:Second), it previously outputed seconds. See
> <bugzilla>58776</bugzilla></li>
> >      <li>WebService(SOAP) Request and HTML Parameter Mask which were
> deprecated in 2.13 version, have now been removed following our <a
> href="./usermanual/best-practices.html#deprecation">deprecation
> strategy</a></li>
> > -
> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
> signature has changed, if you use it ensure you update your code. See
> <bugzilla>58845</bugzilla></li>
> > +
> <li>org.apache.jmeter.protocol.http.visualizers.RequestViewHTTP.getQueryMap
> signature has changed, if you use it ensure you update your code. See
> <bugzilla>58845</bugzilla></li>
> > +    <li><code>__jexl</code> function has been deprecated and will be
> removed in next version. See <bugzilla>58903</bugzilla></li>
> >  </ul>
> >
> >  <!-- =================== Improvements =================== -->
> > @@ -148,6 +149,7 @@ Summary
> >  <h3>Functions</h3>
> >  <ul>
> >      <li><bug>58477</bug> __javaScript function : Allow use of Nashorn
> engine for Java8 and later versions</li>
> > +    <li><bug>58903</bug>Provide __jexl3 function that uses
> commons-jexl3 and deprecated __jexl (1.1) function</li>
> >  </ul>
> >
> >  <h3>I18N</h3>
> >
> > Modified: jmeter/trunk/xdocs/usermanual/functions.xml
> > URL:
> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/functions.xml?rev=1725955&r1=1725954&r2=1725955&view=diff
> >
> ==============================================================================
> > --- jmeter/trunk/xdocs/usermanual/functions.xml (original)
> > +++ jmeter/trunk/xdocs/usermanual/functions.xml Thu Jan 21 14:10:43 2016
> > @@ -125,7 +125,8 @@ Alternatively, just use <code>/</code> i
> >          <tr><td>Calculation</td><td> <a
> href="#__UUID">UUID</a></td><td>generate a random type 4
> UUID</td><td>2.9</td></tr>
> >          <tr><td>Scripting</td><td> <a
> href="#__BeanShell">BeanShell</a></td><td>run a BeanShell
> script</td><td>1.X</td></tr>
> >          <tr><td>Scripting</td><td> <a
> href="#__javaScript">javaScript</a></td><td>process JavaScript (Mozilla
> Rhino)</td><td>1.9</td></tr>
> > -        <tr><td>Scripting</td><td> <a href="#__jexl">jexl,
> jexl2</a></td><td>evaluate a Commons Jexl expression</td><td>jexl(2.2),
> jexl2(2.6)</td></tr>
>
> -1, this breaks the tests.
>
> The __jexl function must continue to be documented even though it is
> deprecated.
>

Can


>
> > +        <tr><td>Scripting</td><td> <a
> href="#__jexl2">jexl2</a></td><td>evaluate a Commons Jexl2
> expression</td><td>jexl2(2.6)</td></tr>
> > +        <tr><td>Scripting</td><td> <a
> href="#__jexl3">jexl3</a></td><td>evaluate a Commons Jexl3
> expression</td><td>jexl3 (3.0)</td></tr>
> >          <tr><td>Properties</td><td> <a href="#__property">property</a>
> </td><td>read a property</td><td>2.0</td></tr>
> >          <tr><td>Properties</td><td> <a href="#__P">P</a></td><td>read a
> property (shorthand method)</td><td>2.0</td></tr>
> >          <tr><td>Properties</td><td> <a
> href="#__setProperty">setProperty</a></td><td>set a JMeter
> property</td><td>2.1</td></tr>
> > @@ -992,16 +993,16 @@ The following shorthand aliases are prov
> >  </p>
> >  </component>
> >
> > -<component index="&sect-num;.5.18" name="__jexl" tag="__jexl2">
>
> -1, the alias must remain until the function is removed entirely
>
Can you explain this tag thing ?
I don't understand what it means although I think it allows reusing
documentation of a component for another one (what you call an alias)

>
> > +<component index="&sect-num;.5.18" name="__jexl2" >
> >  <description>
> >      <p>The jexl function returns the result of evaluating a
> >      <a href="http://commons.apache.org/jexl">Commons JEXL
> expression</a>.
> >      See links below for more information on JEXL expressions.
> >      </p>
> > -    <p>The <code>__jexl</code> function uses Commons JEXL 1, and the
> <code>__jexl2</code> function uses Commons JEXL 2</p>
> > +    <p>The <code>__jexl2</code> function uses Commons JEXL 2</p>
> >      <ul>
> > -    <li><a href="http://commons.apache.org/jexl/reference/syntax.html">JEXL
> syntax description</a></li>
> > -    <li><a href="
> http://commons.apache.org/jexl/reference/examples.html#Example_Expressions">JEXL
> examples</a></li>
> > +    <li><a href="
> http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL
> syntax description</a></li>
> > +    <li><a href="
> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL
> examples</a></li>
> >      </ul>
> >      </description>
> >
> > @@ -1043,7 +1044,58 @@ i.intValue(); // or use i.longValue()
> >      <note>JMeter allows the expression to contain multiple
> statements.</note>
> >  </component>
> >
> > -<component index="&sect-num;.5.19" name="__V">
> > +<component index="&sect-num;.5.19" name="__jexl3" >
> > +<description>
> > +    <p>The jexl function returns the result of evaluating a
> > +    <a href="http://commons.apache.org/proper/commons-jexl/">Commons
> JEXL expression</a>.
> > +    See links below for more information on JEXL expressions.
> > +    </p>
> > +    <p>The <code>__jexl3</code> function uses Commons JEXL 3</p>
> > +    <ul>
> > +    <li><a href="
> http://commons.apache.org/proper/commons-jexl/reference/syntax.html">JEXL
> syntax description</a></li>
> > +    <li><a href="
> http://commons.apache.org/proper/commons-jexl/reference/examples.html#Example_Expressions">JEXL
> examples</a></li>
> > +    </ul>
> > +    </description>
> > +
> > +<properties>
> > +        <property name="Expression" required="Yes">
> > +        The expression to be evaluated. For example,
> <code>6*(5+2)</code>
> > +        </property>
> > +        <property name="Name of variable" required="No">The name of the
> variable to set.</property>
> > +</properties>
> > +<p>
> > +The following variables are made available to the script:
> > +</p>
> > +<ul>
> > +<li><code>log</code> - the logger for the function</li>
> > +<li><code>ctx</code> - JMeterContext object</li>
> > +<li><code>vars</code> - JMeterVariables object</li>
> > +<li><code>props</code> - JMeter Properties object</li>
> > +<li><code>threadName</code> - String containing the current thread name
> (in 2.3.2 it was misspelt as "<code>theadName</code>")</li>
> > +<li><code>sampler</code> - current Sampler object (if any)</li>
> > +<li><code>sampleResult</code> - previous SampleResult object (if
> any)</li>
> > +<li><code>OUT</code> - System.out - e.g.
> <code>OUT.println("message")</code></li>
> > +</ul>
> > +    <p>
> > +    Jexl can also create classes and call methods on them, for example:
> > +    </p>
> > +    <p>
> > +    <source>
> > +Systemclass=log.class.forName("java.lang.System");
> > +now=Systemclass.currentTimeMillis();
> > +</source>
> > +    Note that the Jexl documentation on the web-site wrongly suggests
> that "<code>div</code>" does integer division.
> > +    In fact "<code>div</code>" and "<code>/</code>" both perform normal
> division. One can get the same effect
> > +    as follows:
> > +    <source>
> > +i= 5 / 2;
> > +i.intValue(); // or use i.longValue()
> > +</source>
> > +    </p>
> > +    <note>JMeter allows the expression to contain multiple
> statements.</note>
> > +</component>
> > +
> > +<component index="&sect-num;.5.20" name="__V">
> >  <description>
> >      <p>The V (variable) function returns the result of evaluating a
> variable name expression.
> >      This can be used to evaluate nested variable references (which are
> not currently supported).
> > @@ -1063,7 +1115,7 @@ i.intValue(); // or use i.longValue()
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.20" name="__evalVar">
> > +<component index="&sect-num;.5.21" name="__evalVar">
> >  <description>
> >      <p>The eval function returns the result of evaluating an expression
> stored in a variable.
> >      </p>
> > @@ -1081,7 +1133,7 @@ i.intValue(); // or use i.longValue()
> >          </property>
> >  </properties>
> >  </component>
> > -<component index="&sect-num;.5.21" name="__eval">
> > +<component index="&sect-num;.5.22" name="__eval">
> >  <description>
> >      <p>The eval function returns the result of evaluating a string
> expression.
> >      </p>
> > @@ -1110,7 +1162,7 @@ i.intValue(); // or use i.longValue()
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.22" name="__char">
> > +<component index="&sect-num;.5.23" name="__char">
> >  <description>
> >      <p>
> >      The char function returns the result of evaluating a list of
> numbers as Unicode characters.
> > @@ -1134,7 +1186,7 @@ i.intValue(); // or use i.longValue()
> >   </p>
> >  </component>
> >
> > -<component index="&sect-num;.5.23" name="__unescape">
> > +<component index="&sect-num;.5.24" name="__unescape">
> >  <description>
> >      <p>
> >      The unescape function returns the result of evaluating a
> Java-escaped string. See also <code>__char()</code> above.
> > @@ -1157,7 +1209,7 @@ i.intValue(); // or use i.longValue()
> >   </p>
> >  </component>
> >
> > -<component index="&sect-num;.5.24" name="__unescapeHtml">
> > +<component index="&sect-num;.5.25" name="__unescapeHtml">
> >  <description>
> >      <p>
> >  Function to unescape a string containing HTML entity escapes
> > @@ -1184,7 +1236,7 @@ e.g. <code>"&amp;gt;&amp;zzzz;x"</code>
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.25" name="__escapeHtml">
> > +<component index="&sect-num;.5.26" name="__escapeHtml">
> >  <description>
> >      <p>
> >  Function which escapes the characters in a String using HTML entities.
> > @@ -1207,7 +1259,7 @@ becomes:
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.26" name="__urldecode">
> > +<component index="&sect-num;.5.27" name="__urldecode">
> >  <description>
> >      <p>
> >  Function to decode a <code>application/x-www-form-urlencoded</code>
> string.
> > @@ -1229,7 +1281,7 @@ For example, the string <code>Word+%22sc
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.27" name="__urlencode">
> > +<component index="&sect-num;.5.28" name="__urlencode">
> >  <description>
> >      <p>
> >  Function to encode a string to a
> <code>application/x-www-form-urlencoded</code> string.
> > @@ -1250,7 +1302,7 @@ For example, the string <code>Word &quot
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.28" name="__FileToString">
> > +<component index="&sect-num;.5.29" name="__FileToString">
> >
> >  <description>
> >      <p>
> > @@ -1274,7 +1326,7 @@ A reference name - <code>refName</code>
> >  <p>The file name, encoding and reference name parameters are resolved
> every time the function is executed.</p>
> >  </component>
> >
> > -<component index="&sect-num;.5.29" name="__samplerName">
> > +<component index="&sect-num;.5.30" name="__samplerName">
> >
> >  <description>
> >      <p>
> > @@ -1297,7 +1349,7 @@ A reference name - <code>refName</code>
> >  </properties>
> >  </component>
> >
> > -<component index="&sect-num;.5.30" name="__TestPlanName">
> > +<component index="&sect-num;.5.31" name="__TestPlanName">
> >
> >  <description>
> >      <p>
> > @@ -1310,7 +1362,7 @@ A reference name - <code>refName</code>
> >  </p>
> >  </component>
> >
> > -<component index="&sect-num;.5.31" name="__escapeOroRegexpChars">
> > +<component index="&sect-num;.5.32" name="__escapeOroRegexpChars">
> >  <description>
> >      <p>
> >  Function which escapes the ORO Regexp meta characters, it is the
> equivalent of <code>\Q</code> <code>\E</code> in Java Regexp Engine.
> >
> >
>



-- 
Cordialement.
Philippe Mouawad.