Author: sebb
Date: Fri Apr 4 11:58:59 2008
New Revision: 644823
URL: http://svn.apache.org/viewvc?rev=644823&view=rev
Log:
Initial fix for Bug 40850 - BeanShell memory leak
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/BeanShellAssertion.java
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java
jakarta/jmeter/trunk/src/components/org/apache/jmeter/extractor/BeanShellPostProcessorResources.properties
jakarta/jmeter/trunk/src/components/org/apache/jmeter/modifiers/BeanShellPreProcessorResources.properties
jakarta/jmeter/trunk/src/components/org/apache/jmeter/timers/BeanShellTimerResources.properties
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/BeanShellListenerResources.properties
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellBeanInfoSupport.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellInterpreter.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellTestElement.java
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BeanShellSampler.java
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/BeanShellAssertion.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/BeanShellAssertion.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/BeanShellAssertion.java
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/BeanShellAssertion.java
Fri Apr 4 11:58:59 2008
@@ -42,6 +42,8 @@
public static final String SCRIPT = "BeanShellAssertion.query";
//$NON-NLS-1$
public static final String PARAMETERS =
"BeanShellAssertion.parameters"; //$NON-NLS-1$
+
+ public static final String RESET_INTREPRETER =
"BeanShellSampler.resetInterpreter"; //$NON-NLS-1$
// can be specified in jmeter.properties
public static final String INIT_FILE = "beanshell.assertion.init";
//$NON-NLS-1$
@@ -61,6 +63,10 @@
public String getParameters() {
return getPropertyAsString(PARAMETERS);
}
+
+ public boolean isResetInterpreter() {
+ return getPropertyAsBoolean(RESET_INTREPRETER);
+ }
/*
* (non-Javadoc)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java
Fri Apr 4 11:58:59 2008
@@ -21,6 +21,7 @@
import java.awt.BorderLayout;
import javax.swing.Box;
+import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
@@ -28,11 +29,15 @@
import javax.swing.JTextField;
import org.apache.jmeter.assertions.BeanShellAssertion;
+import org.apache.jmeter.protocol.java.sampler.BeanShellSampler;
import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.property.BooleanProperty;
import org.apache.jmeter.util.JMeterUtils;
public class BeanShellAssertionGui extends AbstractAssertionGui {
+ private JCheckBox resetInterpreter;// reset the bsh.Interpreter before
each execution
+
private JTextField filename;// script file name (if present)
private JTextField parameters;// parameters to pass to script file (or
script)
@@ -47,6 +52,7 @@
scriptField.setText(element.getPropertyAsString(BeanShellAssertion.SCRIPT));
filename.setText(element.getPropertyAsString(BeanShellAssertion.FILENAME));
parameters.setText(element.getPropertyAsString(BeanShellAssertion.PARAMETERS));
+
resetInterpreter.setSelected(element.getPropertyAsBoolean(BeanShellSampler.RESET_INTREPRETER));
super.configure(element);
}
@@ -67,6 +73,7 @@
te.setProperty(BeanShellAssertion.SCRIPT,
scriptField.getText());
te.setProperty(BeanShellAssertion.FILENAME, filename.getText());
te.setProperty(BeanShellAssertion.PARAMETERS,
parameters.getText());
+ te.setProperty(new
BooleanProperty(BeanShellAssertion.RESET_INTREPRETER,
resetInterpreter.isSelected()));
}
public String getLabelResource() {
@@ -87,6 +94,15 @@
return filenamePanel;
}
+ private JPanel createResetPanel() {
+ resetInterpreter = new
JCheckBox(JMeterUtils.getResString("bsh_script_reset_interpreter")); //
$NON-NLS-1$
+ resetInterpreter.setName(BeanShellSampler.PARAMETERS);
+
+ JPanel resetInterpreterPanel = new JPanel(new BorderLayout());
+ resetInterpreterPanel.add(resetInterpreter, BorderLayout.WEST);
+ return resetInterpreterPanel;
+ }
+
private JPanel createParameterPanel() {
JLabel label = new
JLabel(JMeterUtils.getResString("bsh_script_parameters")); //$NON-NLS-1$
@@ -106,6 +122,7 @@
Box box = Box.createVerticalBox();
box.add(makeTitlePanel());
+ box.add(createResetPanel());
box.add(createParameterPanel());
box.add(createFilenamePanel());
add(box, BorderLayout.NORTH);
@@ -143,5 +160,6 @@
filename.setText(""); // $NON-NLS-1$
parameters.setText(""); // $NON-NLS-1$
scriptField.setText(""); // $NON-NLS-1$
+ resetInterpreter.setSelected(false);
}
}
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/extractor/BeanShellPostProcessorResources.properties
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/extractor/BeanShellPostProcessorResources.properties?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/extractor/BeanShellPostProcessorResources.properties
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/extractor/BeanShellPostProcessorResources.properties
Fri Apr 4 11:58:59 2008
@@ -2,6 +2,8 @@
scripting.displayName=Script (variables: ctx vars prev data log)
script.displayName=
script.shortDescription=Beanshell script
+resetGroup.displayName=Reset bsh.Interpreter before each call
+resetInterpreter.displayName=Reset Interpreter
parameterGroup.displayName=Parameters to be passed to BeanShell (=> String
Parameters and String []bsh.args)
parameters.displayName=Parameters
parameters.shortDescription=Parameters to be passed to BeanShell (file or
script)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/modifiers/BeanShellPreProcessorResources.properties
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/modifiers/BeanShellPreProcessorResources.properties?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/modifiers/BeanShellPreProcessorResources.properties
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/modifiers/BeanShellPreProcessorResources.properties
Fri Apr 4 11:58:59 2008
@@ -2,6 +2,8 @@
scripting.displayName=Script (variables: ctx vars prev sampler log)
script.displayName=
script.shortDescription=Beanshell script
+resetGroup.displayName=Reset bsh.Interpreter before each call
+resetInterpreter.displayName=Reset Interpreter
parameterGroup.displayName=Parameters to be passed to BeanShell (=> String
Parameters and String []bsh.args)
parameters.displayName=Parameters
parameters.shortDescription=Parameters to be passed to BeanShell (file or
script)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/timers/BeanShellTimerResources.properties
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/timers/BeanShellTimerResources.properties?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/timers/BeanShellTimerResources.properties
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/timers/BeanShellTimerResources.properties
Fri Apr 4 11:58:59 2008
@@ -2,6 +2,8 @@
scripting.displayName=Script (variables: ctx vars log)
script.displayName=
script.shortDescription=Beanshell script to generate delay
+resetGroup.displayName=Reset bsh.Interpreter before each call
+resetInterpreter.displayName=Reset Interpreter
parameterGroup.displayName=Parameters to be passed to BeanShell (=> String
Parameters and String []bsh.args)
parameters.displayName=Parameters
parameters.shortDescription=Parameters to be passed to BeanShell (file or
script)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/BeanShellListenerResources.properties
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/BeanShellListenerResources.properties?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/BeanShellListenerResources.properties
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/BeanShellListenerResources.properties
Fri Apr 4 11:58:59 2008
@@ -2,6 +2,8 @@
scripting.displayName=Script (variables: ctx vars sampleEvent sampleResult log)
script.displayName=
script.shortDescription=Beanshell script
+resetGroup.displayName=Reset bsh.Interpreter before each call
+resetInterpreter.displayName=Reset Interpreter
parameterGroup.displayName=Parameters to be passed to BeanShell (=> String
Parameters and String []bsh.args)
parameters.displayName=Parameters
parameters.shortDescription=Parameters to be passed to BeanShell (file or
script)
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
Fri Apr 4 11:58:59 2008
@@ -100,6 +100,7 @@
bsh_script_variables=The following variables are defined for the
script:\nSampleResult, ResponseCode, ResponseMessage, IsSuccess, Label,
FileName, ctx, vars, log
bsh_script_file=Script file
bsh_script_parameters=Parameters (-> String Parameters and String []bsh.args)
+bsh_script_reset_interpreter=Reset bsh.Interpreter before each call
busy_testing=I'm busy testing, please stop the test before changing settings
cache_session_id=Cache Session Id?
cancel=Cancel
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellBeanInfoSupport.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellBeanInfoSupport.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellBeanInfoSupport.java
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellBeanInfoSupport.java
Fri Apr 4 11:58:59 2008
@@ -32,6 +32,14 @@
super(beanClass);
PropertyDescriptor p;
+ p = property("resetInterpreter");
+ p.setValue(NOT_UNDEFINED, Boolean.TRUE);
+ p.setValue(DEFAULT, Boolean.FALSE);
+ p.setValue(NOT_EXPRESSION, Boolean.TRUE);
+ p.setValue(NOT_OTHER, Boolean.TRUE);
+
+ createPropertyGroup("resetGroup", new String[] { "resetInterpreter" });
+
p = property("parameters");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellInterpreter.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellInterpreter.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellInterpreter.java
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellInterpreter.java
Fri Apr 4 11:58:59 2008
@@ -19,10 +19,9 @@
package org.apache.jmeter.util;
import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+
import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.JMeterError;
import org.apache.jorphan.util.JMeterException;
@@ -90,29 +89,46 @@
// This class is not serialised
private Object bshInstance = null; // The interpreter instance for this
class
+ private final String initFile; // Script file to initialize the
Interpreter with
+
+ private final Logger logger; // Logger to use during initialization and
script run
+
public BeanShellInterpreter() throws ClassNotFoundException {
- if (bshClass == null) {
- throw new ClassNotFoundException(BSH_INTERPRETER);
- }
- try {
- bshInstance = bshClass.newInstance();
- } catch (InstantiationException e) {
- log.error("Can't instantiate BeanShell", e);
- throw new ClassNotFoundException("Can't instantiate
BeanShell", e);
- } catch (IllegalAccessException e) {
- log.error("Can't instantiate BeanShell", e);
- throw new ClassNotFoundException("Can't instantiate
BeanShell", e);
- }
+ initFile = null;
+ logger = null;
+ init();
}
+ /**
+ *
+ * @param init initialisation file
+ * @param _log logger to pass to interpreter
+ */
+ public BeanShellInterpreter(String init, Logger _log) throws
ClassNotFoundException {
+ initFile = init;
+ logger = _log;
+ init();
+ }
+
// Called from ctor, so must be private (or final, but it does not seem
useful elsewhere)
- private void init(final String initFile, final Object logger) throws
IOException, JMeterException {
- if (logger != null) {// Do this before starting the script
+ private void init() throws ClassNotFoundException {
+ if (bshClass == null) {
+ throw new ClassNotFoundException(BSH_INTERPRETER);
+ }
+ try {
+ bshInstance = bshClass.newInstance();
+ } catch (InstantiationException e) {
+ log.error("Can't instantiate BeanShell", e);
+ throw new ClassNotFoundException("Can't instantiate BeanShell", e);
+ } catch (IllegalAccessException e) {
+ log.error("Can't instantiate BeanShell", e);
+ throw new ClassNotFoundException("Can't instantiate BeanShell", e);
+ }
+ if (logger != null) {// Do this before starting the script
try {
set("log", logger);//$NON-NLS-1$
} catch (JMeterException e) {
- log.error("Can't set logger variable", e);
- throw e;
+ log.warn("Can't set logger variable", e);
}
}
if (initFile != null && initFile.length() > 0) {
@@ -125,30 +141,27 @@
+File.separator+initFile;
in = new File(fileToUse);
if (!in.exists()) {
- throw new
FileNotFoundException(initFile); // use the original name here
+ log.warn("Cannot find init file:
"+initFile);
}
}
if (!in.canRead()) {
- throw new IOException("Cannot read" +
fileToUse);
+ log.warn("Cannot read init file: "+fileToUse);
}
- source(fileToUse);
+ try {
+ source(fileToUse);
+ } catch (JMeterException e) {
+ log.warn("Cannot source init file: "+fileToUse,e);
+ }
}
}
- /**
- *
- * @param init initialisation file
- * @param _log logger to pass to interpreter; also used to log errors in
this method
- */
- public BeanShellInterpreter(String init, Logger _log) throws
ClassNotFoundException {
- this();
- try {
- this.init(init, _log);
- } catch (IOException e) {
- _log.warn("Could not initialise interpreter:
"+e.toString()); // no need for stack trace
- } catch (JMeterException e) {
- _log.warn("Could not initialise interpreter:
"+e.toString()); // no need for stack trace
- }
+ /**
+ * Resets the BeanShell interpreter.
+ *
+ * @throws ClassNotFoundException if interpreter cannot be instantiated
+ */
+ public void reset() throws ClassNotFoundException {
+ init();
}
private Object bshInvoke(Method m, Object[] o, boolean shouldLog) throws
JMeterException {
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellTestElement.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellTestElement.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellTestElement.java
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/BeanShellTestElement.java
Fri Apr 4 11:58:59 2008
@@ -44,6 +44,8 @@
private String filename; // file to source (overrides script)
private String script; // script (if file not provided)
+
+ private boolean resetInterpreter = false;
//-- For TestBean implementations only
@@ -59,6 +61,14 @@
protected abstract String getInitFileProperty();
protected BeanShellInterpreter getBeanShellInterpreter() {
+ if (isResetInterpreter()) {
+ try {
+ bshInterpreter.reset();
+ } catch (ClassNotFoundException e) {
+ log.error("Cannot find BeanShell: "+e.toString());
+ }
+ }
+
return bshInterpreter;
}
@@ -203,5 +213,13 @@
public void setFilename(String s) {
filename = s;
+ }
+
+ public boolean isResetInterpreter() {
+ return resetInterpreter;
+ }
+
+ public void setResetInterpreter(boolean b) {
+ resetInterpreter = b;
}
}
Modified:
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java
(original)
+++
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java
Fri Apr 4 11:58:59 2008
@@ -21,6 +21,7 @@
import java.awt.BorderLayout;
import javax.swing.Box;
+import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
@@ -30,9 +31,12 @@
import org.apache.jmeter.protocol.java.sampler.BeanShellSampler;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.property.BooleanProperty;
import org.apache.jmeter.util.JMeterUtils;
public class BeanShellSamplerGui extends AbstractSamplerGui {
+
+ private JCheckBox resetInterpreter;// reset the bsh.Interpreter before
each execution
private JTextField filename;// script file name (if present)
@@ -48,6 +52,7 @@
scriptField.setText(element.getPropertyAsString(BeanShellSampler.SCRIPT));
filename.setText(element.getPropertyAsString(BeanShellSampler.FILENAME));
parameters.setText(element.getPropertyAsString(BeanShellSampler.PARAMETERS));
+
resetInterpreter.setSelected(element.getPropertyAsBoolean(BeanShellSampler.RESET_INTREPRETER));
super.configure(element);
}
@@ -68,6 +73,7 @@
te.setProperty(BeanShellSampler.SCRIPT, scriptField.getText());
te.setProperty(BeanShellSampler.FILENAME, filename.getText());
te.setProperty(BeanShellSampler.PARAMETERS,
parameters.getText());
+ te.setProperty(new
BooleanProperty(BeanShellSampler.RESET_INTREPRETER,
resetInterpreter.isSelected()));
}
/**
@@ -79,6 +85,7 @@
filename.setText(""); //$NON-NLS-1$
parameters.setText(""); //$NON-NLS-1$
scriptField.setText(""); //$NON-NLS-1$
+ resetInterpreter.setSelected(false);
}
public String getLabelResource() {
@@ -112,12 +119,22 @@
return parameterPanel;
}
+ private JPanel createResetPanel() {
+ resetInterpreter = new
JCheckBox(JMeterUtils.getResString("bsh_script_reset_interpreter")); //
$NON-NLS-1$
+ resetInterpreter.setName(BeanShellSampler.PARAMETERS);
+
+ JPanel resetInterpreterPanel = new JPanel(new BorderLayout());
+ resetInterpreterPanel.add(resetInterpreter, BorderLayout.WEST);
+ return resetInterpreterPanel;
+ }
+
private void init() {
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
Box box = Box.createVerticalBox();
box.add(makeTitlePanel());
+ box.add(createResetPanel());
box.add(createParameterPanel());
box.add(createFilenamePanel());
add(box, BorderLayout.NORTH);
Modified:
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BeanShellSampler.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BeanShellSampler.java?rev=644823&r1=644822&r2=644823&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BeanShellSampler.java
(original)
+++
jakarta/jmeter/trunk/src/protocol/java/org/apache/jmeter/protocol/java/sampler/BeanShellSampler.java
Fri Apr 4 11:58:59 2008
@@ -48,6 +48,8 @@
public static final String INIT_FILE = "beanshell.sampler.init";
//$NON-NLS-1$
+ public static final String RESET_INTREPRETER =
"BeanShellSampler.resetInterpreter"; //$NON-NLS-1$
+
protected String getInitFileProperty() {
return INIT_FILE;
}
@@ -73,6 +75,10 @@
public String getParameters() {
return getPropertyAsString(PARAMETERS);
}
+
+ public boolean isResetInterpreter() {
+ return getPropertyAsBoolean(RESET_INTREPRETER);
+ }
public SampleResult sample(Entry e)// Entry tends to be ignored ...
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]