blob: 059ea20546d43fa2a90022c26289a7e6a57de598 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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.io.Serializable;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.JexlHelper;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* A function which understands Commons JEXL. <br>
*
* The following variables are set before the script is executed: <br>
* <ul>
* <li>ctx - the current JMeter context variable</li>
* <li>vars - the current JMeter variables</li>
* <li>threadName - the threadName</li>
* <li>sampler - the current Sampler, if any</li>
* <li>sampleResult - the current SampleResult, if any</li>
* </ul>
*/
public class Jexl extends AbstractFunction implements Serializable
{
/**
* <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 3546359539474968625L;
private static Logger log = LoggingManager.getLoggerForClass();
private static final String KEY = "__jexl";
private static final List desc = new LinkedList();
static
{
desc.add("expression");
}
private Object[] values;
public String execute(SampleResult result, Sampler sampler)
throws InvalidVariableException
{
String str = "";
CompoundVariable var = (CompoundVariable) values[0];
String exp = var.getRawParameters();
try
{
Expression e = ExpressionFactory.createExpression(exp);
JexlContext jc = JexlHelper.createContext();
jc.getVars().put("ctx", sampler.getThreadContext());
jc.getVars().put("vars", getVariables());
jc.getVars().put("threadName", sampler.getThreadName());
jc.getVars().put("sampler", sampler);
jc.getVars().put("sampleResult", result);
// Now evaluate the expression, getting the result
Object o = e.evaluate(jc);
if (o != null)
{
str = o.toString();
}
} catch (Exception e)
{
log.error("An error occurred while evaluating the expression \""
+ exp + "\"");
}
return str;
}
public List getArgumentDesc()
{
return desc;
}
public String getReferenceKey()
{
return KEY;
}
public void setParameters(Collection parameters)
throws InvalidVariableException
{
values = parameters.toArray();
if (values.length != 1)
{
throw new InvalidVariableException("it only accepts one parameter");
}
}
}