blob: 4f0e125a58ccad7abb0d4d1dc1fed7fba24792e6 [file] [log] [blame]
/*
* 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.util;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.Properties;
import org.apache.bsf.BSFEngine;
import org.apache.bsf.BSFException;
import org.apache.bsf.BSFManager;
import org.apache.commons.io.FileUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
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;
public abstract class BSFTestElement extends ScriptingTestElement
implements Serializable
{
private static final long serialVersionUID = 233L;
private static final Logger log = LoggingManager.getLoggerForClass();
static {
BSFManager.registerScriptingEngine("jexl", //$NON-NLS-1$
"org.apache.commons.jexl.bsf.JexlEngine", //$NON-NLS-1$
new String[]{"jexl"}); //$NON-NLS-1$
log.info("Registering JMeter version of JavaScript engine as work-round for BSF-22");
BSFManager.registerScriptingEngine("javascript", //$NON-NLS-1$
"org.apache.jmeter.util.BSFJavaScriptEngine", //$NON-NLS-1$
new String[]{"js"}); //$NON-NLS-1$
}
public BSFTestElement() {
super();
}
protected BSFManager getManager() throws BSFException {
BSFManager mgr = new BSFManager();
initManager(mgr);
return mgr;
}
protected void initManager(BSFManager mgr) throws BSFException{
final String label = getName();
final String fileName = getFilename();
final String scriptParameters = getParameters();
// Use actual class name for log
final Logger logger = LoggingManager.getLoggerForShortName(getClass().getName());
mgr.declareBean("log", logger, Logger.class); // $NON-NLS-1$
mgr.declareBean("Label",label, String.class); // $NON-NLS-1$
mgr.declareBean("FileName",fileName, String.class); // $NON-NLS-1$
mgr.declareBean("Parameters", scriptParameters, String.class); // $NON-NLS-1$
String [] args=JOrphanUtils.split(scriptParameters, " ");//$NON-NLS-1$
mgr.declareBean("args",args,args.getClass());//$NON-NLS-1$
// Add variables for access to context and variables
JMeterContext jmctx = JMeterContextService.getContext();
JMeterVariables vars = jmctx.getVariables();
Properties props = JMeterUtils.getJMeterProperties();
mgr.declareBean("ctx", jmctx, jmctx.getClass()); // $NON-NLS-1$
mgr.declareBean("vars", vars, vars.getClass()); // $NON-NLS-1$
mgr.declareBean("props", props, props.getClass()); // $NON-NLS-1$
// For use in debugging:
mgr.declareBean("OUT", System.out, PrintStream.class); // $NON-NLS-1$
// Most subclasses will need these:
Sampler sampler = jmctx.getCurrentSampler();
mgr.declareBean("sampler", sampler, Sampler.class);
SampleResult prev = jmctx.getPreviousResult();
mgr.declareBean("prev", prev, SampleResult.class);
}
protected void processFileOrScript(BSFManager mgr) throws BSFException{
BSFEngine bsfEngine = mgr.loadScriptingEngine(getScriptLanguage());
final String scriptFile = getFilename();
if (scriptFile.length() == 0) {
bsfEngine.exec("[script]",0,0,getScript());
} else {// we have a file, read and process it
try {
String script=FileUtils.readFileToString(new File(scriptFile));
bsfEngine.exec(scriptFile,0,0,script);
} catch (IOException e) {
log.warn(e.getLocalizedMessage());
throw new BSFException(BSFException.REASON_IO_ERROR,"Problem reading script file",e);
}
}
}
protected Object evalFileOrScript(BSFManager mgr) throws BSFException{
BSFEngine bsfEngine = mgr.loadScriptingEngine(getScriptLanguage());
final String scriptFile = getFilename();
if (scriptFile.length() == 0) {
return bsfEngine.eval("[script]",0,0,getScript());
} else {// we have a file, read and process it
try {
String script=FileUtils.readFileToString(new File(scriptFile));
return bsfEngine.eval(scriptFile,0,0,script);
} catch (IOException e) {
log.warn(e.getLocalizedMessage());
throw new BSFException(BSFException.REASON_IO_ERROR,"Problem reading script file",e);
}
}
}
public String getScriptLanguage() {
return scriptLanguage;
}
public void setScriptLanguage(String s) {
scriptLanguage = s;
}
}