You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2007/07/02 00:44:36 UTC
svn commit: r552369 - in /jakarta/jmeter/branches/rel-2-2:
src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java
xdocs/changes.xml xdocs/usermanual/component_reference.xml
Author: sebb
Date: Sun Jul 1 15:44:30 2007
New Revision: 552369
URL: http://svn.apache.org/viewvc?view=rev&rev=552369
Log:
BSF Sampler passes additional variables to the script
Modified:
jakarta/jmeter/branches/rel-2-2/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java
jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml
Modified: jakarta/jmeter/branches/rel-2-2/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java?view=diff&rev=552369&r1=552368&r2=552369
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BSFSampler.java Sun Jul 1 15:44:30 2007
@@ -18,18 +18,24 @@
package org.apache.jmeter.protocol.java.sampler;
+import java.io.FileInputStream;
+
import org.apache.bsf.BSFEngine;
import org.apache.bsf.BSFManager;
+import org.apache.commons.io.IOUtils;
import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.threads.JMeterContext;
+import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
import org.apache.log.Logger;
/**
* A sampler which understands BSF
*
- * @version $Revision$ Updated on: $Date$
*/
public class BSFSampler extends AbstractSampler {
@@ -45,18 +51,8 @@
private transient BSFManager mgr;
- private transient BSFEngine bsfEngine;
-
public BSFSampler() {
- try {
- // register beanshell with the BSF framework
- mgr = new BSFManager();
- BSFManager.registerScriptingEngine("beanshell", "bsh.util.BeanShellBSFEngine", new String[] { "bsh" });
- } catch (NoClassDefFoundError e) {
- }
-
- // TODO: register other scripting languages ...
-
+ mgr = new BSFManager();
}
public String getFilename() {
@@ -103,41 +99,73 @@
public SampleResult sample(Entry e)// Entry tends to be ignored ...
{
- log.info(getLabel() + " " + getFilename());
+ final String label = getLabel();
+ log.info(label + " " + getFilename());
SampleResult res = new SampleResult();
- boolean isSuccessful = false;
- res.setSampleLabel(getLabel());
+ res.setSampleLabel(label);
+ FileInputStream is = null;
+
res.sampleStart();
try {
- String request = getScript();
- res.setSamplerData(request);
-
- mgr.registerBean("Label", getLabel());
- mgr.registerBean("Name", getFilename());
-
- bsfEngine = mgr.loadScriptingEngine(getScriptLanguage());
-
- Object bsfOut = bsfEngine.eval("Sampler", 0, 0, request);
-
- res.setResponseData(bsfOut.toString().getBytes());
- res.setDataType(SampleResult.TEXT);
- res.setResponseCode("200");// TODO set from script
- res.setResponseMessage("OK");// TODO set from script
- isSuccessful = true;// TODO set from script
+ final String request = getScript();
+ final String fileName = getFilename();
+
+ mgr.declareBean("log", log, log.getClass()); // $NON-NLS-1$
+ mgr.declareBean("Label",label, String.class); // $NON-NLS-1$
+ mgr.declareBean("FileName",fileName, String.class); // $NON-NLS-1$
+ mgr.declareBean("Parameters", getParameters(), String.class); // $NON-NLS-1$
+ String [] args=JOrphanUtils.split(getParameters(), " ");//$NON-NLS-1$
+ mgr.declareBean("args",args,args.getClass());//$NON-NLS-1$
+ mgr.declareBean("SampleResult", res, res.getClass()); // $NON-NLS-1$
+
+ // TODO: find out how to retrieve these from the script
+ // At present the script has to use SampleResult methods to set them.
+ res.setResponseCode("200"); // $NON-NLS-1$
+ res.setResponseMessage("OK"); // $NON-NLS-1$
+ res.setSuccessful(true);
+
+ // These are not useful yet, as have not found how to get updated values back
+ //mgr.declareBean("ResponseCode", "200", String.class); // $NON-NLS-1$
+ //mgr.declareBean("ResponseMessage", "OK", String.class); // $NON-NLS-1$
+ //mgr.declareBean("IsSuccess", Boolean.TRUE, Boolean.class); // $NON-NLS-1$
+
+ res.setDataType(SampleResult.TEXT); // Default (can be overridden by the script)
+
+ // Add variables for access to context and variables
+ JMeterContext jmctx = JMeterContextService.getContext();
+ JMeterVariables vars = jmctx.getVariables();
+ mgr.declareBean("ctx", jmctx, jmctx.getClass()); // $NON-NLS-1$
+ mgr.declareBean("vars", vars, vars.getClass()); // $NON-NLS-1$
+
+ BSFEngine bsfEngine = mgr.loadScriptingEngine(getScriptLanguage());
+
+ Object bsfOut = null;
+ if (fileName.length()>0) {
+ res.setSamplerData("File: "+fileName);
+ is = new FileInputStream(fileName);
+ bsfOut = bsfEngine.eval(fileName, 0, 0, IOUtils.toString(is));
+ } else {
+ res.setSamplerData("[script]");
+ bsfOut = bsfEngine.eval("script", 0, 0, request);
+ }
+
+ if (bsfOut != null) {
+ res.setResponseData(bsfOut.toString().getBytes());
+ }
} catch (NoClassDefFoundError ex) {
log.warn("", ex);
- res.setResponseCode("500");
+ res.setSuccessful(false);
+ res.setResponseCode("500"); // $NON-NLS-1$
res.setResponseMessage(ex.toString());
} catch (Exception ex) {
log.warn("", ex);
- res.setResponseCode("500");
+ res.setSuccessful(false);
+ res.setResponseCode("500"); // $NON-NLS-1$
res.setResponseMessage(ex.toString());
+ } finally {
+ res.sampleEnd();
+ IOUtils.closeQuietly(is);
}
-
- res.sampleEnd();
-
- // Set if we were successful or not
- res.setSuccessful(isSuccessful);
return res;
}
Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=552369&r1=552368&r2=552369
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sun Jul 1 15:44:30 2007
@@ -180,6 +180,7 @@
<li>Bug 42582 - JSON pretty printing in Tree View Listener</li>
<li>Http Autoredirects are now enabled by default when creating new samplers</li>
<li>Bug 42674 - default to pre-emptive authorisation if not specified</li>
+<li>BSF Sampler passes additional variables to the script</li>
</ul>
<h4>Non-functional improvements:</h4>
Modified: jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml?view=diff&rev=552369&r1=552368&r2=552369
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml Sun Jul 1 15:44:30 2007
@@ -763,12 +763,55 @@
</p>
</description>
<properties>
- <property name="Name" required="no">Descriptive name for this controller that is shown in the tree.</property>
- <property name="Parameters" required="no">List of parameters to be passed to the script file or the script.</property>
- <property name="Script File" required="no">Name of a file to be used as a BeanShell script</property>
- <property name="Script" required="no">Script to be passed to BeanShell</property>
+ <property name="Name" required="No">Descriptive name for this controller that is shown in the tree.</property>
+ <property name="Scripting Language" required="Yes">Name of the BSF scripting language to be used.</property>
+ <property name="Script File" required="No">Name of a file to be used as a BSF script</property>
+ <property name="Parameters" required="No">List of parameters to be passed to the script file or the script.</property>
+ <property name="Script" required="Yes (unless script file is provided)">Script to be passed to BSF language</property>
</properties>
-TBC
+<p>
+If a script file is supplied, that will be used, otherwise the script will be used.</p>
+<p>
+Before invoking the script, some variables are set up:
+</p>
+<p>
+The contents of the Parameters field is put into the variable "Parameters".
+The string is also split into separate tokens using a single space as the separator, and the resulting list
+is stored in the String array args.
+</p>
+<p>
+The full list of variables that is set up is as follows:</p>
+<ul>
+<li>log - the Logger</li>
+<li>Label - the Sampler label</li>
+<li>FileName - the file name, if any</li>
+<li>Parameters - text from the Parameters field</li>
+<li>args - the parameters, split as described above</li>
+<li>SampleResult - pointer to the current SampleResult</li>
+<li>ctx - JMeterContext</li>
+<li>vars - JMeterVariables - e.g. vars.get("VAR1"); vars.put("VAR2","value"); vars.remove("VAR3");</li>
+</ul>
+<p>
+The Sampler ResponseData is set from the return value of the script.
+If the script returns null, it can set the response directly, by using the method
+SampleResponse.setResponseData(data), where data is either a String or a byte array.
+The data type defaults to "text", but can be set to binary by using the method
+SampleResponse.setDataType(SampleResponse.BINARY).
+</p>
+<p>
+The SampleResult variable gives the script full access to all the fields and
+methods in the SampleResult. For example, the script has access to the methods
+setStopThread(boolean) and setStopTest(boolean).
+</p>
+<p>
+Unlike the Beanshell Sampler, the BSF Sampler does not set the ResponseCode, ResponseMessage and sample status via script variables.
+Currently the only way to changes these is via the SampleResponse methods:
+<ul>
+<li>SampleResponse.setSuccessful(true/false)</li>
+<li>SampleResponse.setResponseCode("code")</li>
+<li>SampleResponse.setResponseMessage("message")</li>
+</ul>
+</p>
</component>
<component name="TCP Sampler" index="§-num;.1.12" width="631" height="305" screenshot="tcpsampler.png">
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org