// Sample BeanShell Function initialisation file

/*
 * 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.
 * 
 */

// N.B. to enable this file to be used, define the JMeter property:
// beanshell.function.init=BeanShellFunction.bshrc

//print("Initialisation started");

import org.apache.jmeter.util.JMeterUtils;

i = j = k = 0; // for counters

getprop(p){// get a JMeter property
	return JMeterUtils.getPropDefault(p,"");
}

getprop(p,d){// get a JMeter property with default
	return JMeterUtils.getPropDefault(p,d);
}

setprop(p,v){// set a JMeter property
	JMeterUtils.setProperty(p, v);
}

// Define routines to stop the test or the current thread
stopTest(){// Stop the JMeter test
	org.apache.jmeter.engine.StandardJMeterEngine.stopEngine();
}

stopThread(){// Stop current JMeter thread
	org.apache.jmeter.engine.StandardJMeterEngine.stopThread(Thread.currentThread().getName());
}

// Fix ampersands in a string
// e.g. fixAmps("Something containing &amp; ...")
// or   fixAmps(vars.get("VARNAME")) - useful if VARNAME may contain "
String fixAmps(s) {
  return s.replaceAll("&amp;","&");
}

// Fix ampersands in a variable
// e.g. fixAmps("VARNAME")
String fixAmpsInVar(String varname) {
  return fixAmps(vars.get(varname));
}

//print("Initialisation complete");
