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 ms...@apache.org on 2004/10/19 22:08:20 UTC
cvs commit: jakarta-jmeter/src/core/org/apache/jmeter/config ConfigTestElement.java
mstover1 2004/10/19 13:08:19
Modified: src/core/org/apache/jmeter/resources messages_fr.properties
messages.properties messages_de.properties
messages_no.properties messages_ja.properties
xdocs/extending notes_on_extending.txt
src/core/org/apache/jmeter/gui/action Start.java Save.java
AbstractAction.java RemoteStart.java Load.java
src/core/org/apache/jmeter/testelement TestPlan.java
src/core/org/apache/jmeter/engine TreeCloner.java
src/core/org/apache/jmeter/threads TestCompiler.java
src/core/org/apache/jmeter/config ConfigTestElement.java
Added: src/core/org/apache/jmeter/services FileServer.java
src/components/org/apache/jmeter/config
CSVDataSetBeanInfo.java CSVDataSet.java
CSVDataSetResources.properties
Removed: src/components/org/apache/jmeter/modifiers CSVDataSet.java
CSVDataSetResources.properties
CSVDataSetBeanInfo.java
Log:
Adding new threadsafe FileServer
CSVDataSet now open for business
Revision Changes Path
1.1 jakarta-jmeter/src/core/org/apache/jmeter/services/FileServer.java
Index: FileServer.java
===================================================================
/*
* Created on Oct 19, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.apache.jmeter.services;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* @author mstover
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class FileServer
{
static Logger log = LoggingManager.getLoggerForClass();
File base;
Map files = new HashMap();
private static FileServer server = new FileServer();
private FileServer()
{
base = new File(JMeterUtils.getProperty("user.dir"));
}
public static FileServer getFileServer()
{
return server;
}
public void setBasedir(String basedir) throws IOException
{
log.info("Setting basedir to: " + basedir);
if(filesOpen())
{
throw new IOException("Files are still open, cannot change base directory");
}
files.clear();
if(basedir != null)
{
base = new File(basedir);
if(!base.isDirectory())
{
base = base.getParentFile();
}
}
}
public String getBaseDir()
{
return base.getAbsolutePath();
}
public synchronized void reserveFile(String filename)
{
log.info("filename = "+ filename+ " base = "+ base);
if(!files.containsKey(filename))
{
Object[] file = new Object[]{new File(base,filename),null};
files.put(filename,file);
}
}
/**
* Get the next line of the named file.
* @param filename
* @return
* @throws IOException
*/
public synchronized String readLine(String filename) throws IOException
{
Object[] file = (Object[])files.get(filename);
if(file != null)
{
if(file[1] == null)
{
BufferedReader r = new BufferedReader(new FileReader((File)file[0]));
file[1] = r;
}
BufferedReader reader = (BufferedReader)file[1];
String line = reader.readLine();
if(line == null)
{
reader.close();
reader = new BufferedReader(new FileReader((File)file[0]));
file[1] = reader;
line = reader.readLine();
}
return line;
}
throw new IOException("File never reserved");
}
public void closeFiles() throws IOException
{
Iterator iter = files.keySet().iterator();
while(iter.hasNext())
{
String name = (String)iter.next();
Object[] file = (Object[])files.get(name);
if(file[1] != null)
{
((Reader)file[1]).close();
file[1] = null;
}
}
files.clear();
}
protected boolean filesOpen()
{
Iterator iter = files.keySet().iterator();
while(iter.hasNext())
{
String name = (String)iter.next();
Object[] file = (Object[])files.get(name);
if(file[1] != null)
{
return true;
}
}
return false;
}
}
1.4 +2 -0 jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_fr.properties
Index: messages_fr.properties
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_fr.properties,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- messages_fr.properties 20 Sep 2004 23:08:38 -0000 1.3
+++ messages_fr.properties 19 Oct 2004 20:08:19 -0000 1.4
@@ -431,6 +431,7 @@
server=Nom ou IP du Serveur\:
servername=Nom du Serveur\:
session_argument_name=Nom des Arguments de la Session
+should_save=You should save your test plan before running it. \nIf you are using supporting data files (ie, for CSV Data Set or _StringFromFile), \nthen it is particularly important to first save your test script.
shutdown=Eteindre
simple_config_element=El\u00E9ment de Configuration Simple
simple_data_writer_title=Data Writer Simple
@@ -546,6 +547,7 @@
view_results_tab_sampler=R\u00E9sultat \u00E9chantillonneur
view_results_title=Voir R\u00E9sultats
view_results_tree_title=Voir l'Arbre des R\u00E9sultats
+warning=Warning!
web_request=Requ\u00EAte HTTP
web_server=Serveur Web
web_server_domain=Nom ou IP du Serveur\:
1.129 +2 -0 jakarta-jmeter/src/core/org/apache/jmeter/resources/messages.properties
Index: messages.properties
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages.properties,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -r1.128 -r1.129
--- messages.properties 9 Oct 2004 11:45:37 -0000 1.128
+++ messages.properties 19 Oct 2004 20:08:19 -0000 1.129
@@ -437,6 +437,7 @@
server=Server Name or IP\:
servername=Servername \:
session_argument_name=Session Argument Name
+should_save=You should save your test plan before running it. \nIf you are using supporting data files (ie, for CSV Data Set or _StringFromFile), \nthen it is particularly important to first save your test script.
shutdown=Shutdown
simple_config_element=Simple Config Element
simple_data_writer_title=Simple Data Writer
@@ -553,6 +554,7 @@
view_results_tab_request=Request
view_results_tab_response=Response data
view_results_tree_title=View Results Tree
+warning=Warning!
web_request=HTTP Request
web_server=Web Server
web_server_domain=Server Name or IP\:
1.87 +2 -0 jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_de.properties
Index: messages_de.properties
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_de.properties,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- messages_de.properties 2 Oct 2004 12:49:26 -0000 1.86
+++ messages_de.properties 19 Oct 2004 20:08:19 -0000 1.87
@@ -176,6 +176,7 @@
send_file_filename_label=Dateiname\:
send_file=Sende eine Datei mit dem Request\:
server=Server Name oder IP\:
+should_save=You should save your test plan before running it. \nIf you are using supporting data files (ie, for CSV Data Set or _StringFromFile), \nthen it is particularly important to first save your test script.
soap_sampler_title=Soap/XML-RPC Sampler (Beta code)
spline_visualizer_average=Durchschnitt
spline_visualizer_incoming=hereinkommend
@@ -205,6 +206,7 @@
user_param_mod_help_note=(\u00C4ndern Sie dies nicht. Stattdessen, bitte die Datei mit dem Namen in JMeter's /bin Ordner \u00E4ndern.)
value=Wert
view_results_in_table=Zeige Ergebnisse in der Tabelle
+warning=Warning!
web_server_domain=Server Name oder IP\:
webservice_sampler_title=WebService(SOAP) Request (Alpha Code)
web_testing_retrieve_images=Hole alle Bilder und Java Applets (nur HTML Dateien)
1.82 +2 -0 jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_no.properties
Index: messages_no.properties
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_no.properties,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -r1.81 -r1.82
--- messages_no.properties 20 Sep 2004 23:08:38 -0000 1.81
+++ messages_no.properties 19 Oct 2004 20:08:19 -0000 1.82
@@ -149,6 +149,7 @@
send_file_param_name_label=Parameter navn\:
send_file=Send en fil med foresp\u00F8rselen\:
server=Server navn eller IP\:
+should_save=You should save your test plan before running it. \nIf you are using supporting data files (ie, for CSV Data Set or _StringFromFile), \nthen it is particularly important to first save your test script.
soap_sampler_title=Soap/XML-RPC Sampler (Alpha code)
spline_visualizer_average=Gjennomsnitt
spline_visualizer_incoming=Innkommende
@@ -178,6 +179,7 @@
value=Verdi
view_results_title=Vis resultat
view_results_tree_title=Vis resultattre
+warning=Warning!
web_server_domain=Server navn eller IP\:
web_server_port=Port nummer\:
web_server=Web server
1.84 +2 -0 jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_ja.properties
Index: messages_ja.properties
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages_ja.properties,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -r1.83 -r1.84
--- messages_ja.properties 20 Sep 2004 23:08:39 -0000 1.83
+++ messages_ja.properties 19 Oct 2004 20:08:19 -0000 1.84
@@ -410,6 +410,7 @@
server=\u30B5\u30FC\u30D0\u540D\u307E\u305F\u306F IP\:
servername=\u30B5\u30FC\u30D0\u540D\uFF1A
session_argument_name=\u30BB\u30C3\u30B7\u30E7\u30F3\u5F15\u6570\u540D
+should_save=You should save your test plan before running it. \nIf you are using supporting data files (ie, for CSV Data Set or _StringFromFile), \nthen it is particularly important to first save your test script.
shutdown=\u30B7\u30E3\u30C3\u30C8\u30C0\u30A6\u30F3
simple_config_element=\u30B7\u30F3\u30D7\u30EB\u8A2D\u5B9A\u30A8\u30EC\u30E1\u30F3\u30C8
simple_data_writer_title=\u30B7\u30F3\u30D7\u30EB\u30C7\u30FC\u30BF\u30E9\u30A4\u30BF
@@ -516,6 +517,7 @@
view_results_tab_response=\u5FDC\u7B54\u30C7\u30FC\u30BF
view_results_title=\u7D50\u679C\u8868\u793A
view_results_tree_title=\u7D50\u679C\u3092\u30C4\u30EA\u30FC\u3067\u8868\u793A
+warning=Warning!
web_request=HTTP \u30EA\u30AF\u30A8\u30B9\u30C8
web_server=Web \u30B5\u30FC\u30D0
web_server_domain=\u30B5\u30FC\u30D0\u540D\u307E\u305F\u306F IP\:
1.1 jakarta-jmeter/src/components/org/apache/jmeter/config/CSVDataSetBeanInfo.java
Index: CSVDataSetBeanInfo.java
===================================================================
/*
* Created on Sep 29, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.apache.jmeter.config;
import java.beans.PropertyDescriptor;
import org.apache.jmeter.testbeans.BeanInfoSupport;
/**
* @author mstover
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class CSVDataSetBeanInfo extends BeanInfoSupport
{
/**
* @param beanClass
*/
public CSVDataSetBeanInfo()
{
super(CSVDataSet.class);
createPropertyGroup("csv_data",new String[]{"filename","variableNames"});
PropertyDescriptor p = property("filename");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p.setValue(NOT_EXPRESSION,Boolean.TRUE);
p = property("variableNames");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p.setValue(NOT_EXPRESSION,Boolean.TRUE);
}
}
1.1 jakarta-jmeter/src/components/org/apache/jmeter/config/CSVDataSet.java
Index: CSVDataSet.java
===================================================================
/*
* Created on Sep 29, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.apache.jmeter.config;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.jmeter.config.ConfigTestElement;
import org.apache.jmeter.engine.event.LoopIterationEvent;
import org.apache.jmeter.engine.event.LoopIterationListener;
import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testbeans.TestBean;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.JOrphanUtils;
import org.apache.log.Logger;
/**
* @author mstover
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class CSVDataSet extends ConfigTestElement implements TestBean, LoopIterationListener
{
private static Logger log = LoggingManager.getLoggerForClass();
static final public long serialVersionUID = 1;
transient String filename;
transient String variableNames;
transient private String[] vars;
/* (non-Javadoc)
* @see org.apache.jmeter.engine.event.LoopIterationListener#iterationStart(org.apache.jmeter.engine.event.LoopIterationEvent)
*/
public void iterationStart(LoopIterationEvent iterEvent)
{
FileServer server = FileServer.getFileServer();
if(vars == null)
{
server.reserveFile(getFilename());
vars = JOrphanUtils.split(getVariableNames(),",");
}
try
{
String[] lineValues = JOrphanUtils.split(server.readLine(getFilename()),",");
for(int a = 0;a < vars.length && a < lineValues.length;a++)
{
this.getThreadContext().getVariables().put(vars[a],lineValues[a]);
}
}
catch(IOException e)
{
log.error("Failed to read file: " + getFilename());
}
}
/**
* @return Returns the filename.
*/
public String getFilename()
{
return filename;
}
/**
* @param filename The filename to set.
*/
public void setFilename(String filename)
{
this.filename = filename;
}
/**
* @return Returns the variableNames.
*/
public String getVariableNames()
{
return variableNames;
}
/**
* @param variableNames The variableNames to set.
*/
public void setVariableNames(String variableNames)
{
this.variableNames = variableNames;
}
}
1.1 jakarta-jmeter/src/components/org/apache/jmeter/config/CSVDataSetResources.properties
Index: CSVDataSetResources.properties
===================================================================
displayName=CSV Data Set Config
csv_data.displayName=Configure you CSV Data Source
filename.displayName=Filename
filename.shortDescription=Name of the file (within your supporting file directory) that holds cvs data
variableNames.displayName=Variable Names (comma-delimited)
variableNames.shortDescription=List your variable names in order to match the order of columns in your csv data. Separate by commas.
1.2 +66 -5 jakarta-jmeter/xdocs/extending/notes_on_extending.txt
Index: notes_on_extending.txt
===================================================================
RCS file: /home/cvs/jakarta-jmeter/xdocs/extending/notes_on_extending.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- notes_on_extending.txt 1 Oct 2004 16:25:08 -0000 1.1
+++ notes_on_extending.txt 19 Oct 2004 20:08:19 -0000 1.2
@@ -4,13 +4,18 @@
data using csv files.
1. Pick a package and make three files:
- - [ComponentName].java (CSVDataSet.java)
- - [ComponentName]BeanInfo.java (CSVDataSetBeanInfo.java)
- - [ComponentName]Resources.properties (CSVDataSetResources.properties)
+ - [ComponentName].java (org.apache.jmeter.config.CSVDataSet.java)
+ - [ComponentName]BeanInfo.java (org.apache.jmeter.config.CSVDataSetBeanInfo.java)
+ - [ComponentName]Resources.properties (org.apache.jmeter.config.CSVDataSetResources.properties)
2. CSVDataSet.java must implement the TestBean interface. In addition, it will extend
-AbstractTestElement, and implement PreProcessor, TestListener and LoopIterationListener.
+ConfigTestElement, and implement LoopIterationListener.
- TestBean is a marker interface, so there are no methods to implement.
+ - Extending ConfigTestElement will make our component a Config element in a test plan. By
+ extending different abstract classes, you can control the type of element your component will
+ be (ie AbstractSampler, AbstractVisualizer, GenericController, etc - though you can also make
+ different types of elements just by instantiating the right interfaces, the abstract classes can
+ make your life easier).
3. CSVDataSetBeanInfo.java should extend org.apache.jmeter.testbeans.BeanInfoSupport
- create a zero-parameter constructor in which we call super(CSVDataSet.class);
@@ -43,4 +48,60 @@
collections, and I just want to do this quickly. Instead, we'll let users input
comma-delimited list of variable names.
- b.
\ No newline at end of file
+ b. I then implemented the IterationStart method of the LoopIterationListener interface. The point
+ of this "event" is that your component is notified of when the test has entered it's parent
+ controller. For our purposes, every time the CSVDataSet's parent controller is entered, we will
+ read a new line of the data file and set the variables. Thus, for a regular controller, each
+ loop through the test will result in a new set of values being read. For a loop controller, each
+ iteration will do likewise. Every test thread will get different values as well.
+
+6. Setting up your gui elements in CSVDataSetBeanInfo:
+ - You can create groupings for your component's properties. Each grouping you create needs
+ a label and a list of property names to include in that grouping. Ie:
+
+ createPropertyGroup("csv_data",new String[]{"filename","variableNames"});
+
+ Creates a grouping called "csv_data" that will include gui input elements for the
+ "filename" and "variableNames" properties of CSVDataSet. Then, we need to define what kind of
+ properties we want these to be:
+
+ p = property("filename");
+ p.setValue(NOT_UNDEFINED, Boolean.TRUE);
+ p.setValue(DEFAULT, "");
+ p.setValue(NOT_EXPRESSION,Boolean.TRUE);
+ p = property("variableNames");
+ p.setValue(NOT_UNDEFINED, Boolean.TRUE);
+ p.setValue(DEFAULT, "");
+ p.setValue(NOT_EXPRESSION,Boolean.TRUE);
+
+ This essentially creates two properties whose value is not allowed to be null, and whose default
+ values are "". There are several such attributes that can be set for each property. Here is a
+ rundown:
+
+ NOT_UNDEFINED : The property will not be left null.
+ DEFAULT : A default values must be given if NOT_UNDEFINED is true.
+ NOT_EXPRESSION : The value will not be parsed for functions if this is true.
+ NOT_OTHER : This is not a free form entry field - a list of values has to be provided.
+ TAGS : with a String[] as the value, this sets up a predefined list of acceptable values, and JMeter will create a dropdown select.
+
+ Additionally, a custom property editor can be specified for a property:
+
+ p.setPropertyEditorClass(FileEditor.class);
+
+ This will create a text input plus browse button that opens a dialog for finding a file.
+
+ Usually, complex property settings are not needed, as now. For a more complex example, look
+ at org.apache.jmeter.protocol.http.sampler.AccessLogSamplerBeanInfo
+
+7. Defining your resource strings. In CSVDataSetResources.properties we have to define all our string
+ resources. To provide translations, one would create additional files such as CSVDataSetResources_ja.properties, and
+ CSVDataSetResources_de.properties. For our component, we must define the following resources:
+
+ displayName - This will provide a name for the element that will appear in menus.
+ csv_data.displayName - we create a property grouping called "csv_data", so we have to provide a label for the grouping
+ filename.displayName - a label for the filename input element.
+ filename.shortDescription - a tool-tip-like help text blurb.
+ variableNames.displayName - a label for the variable name input element.
+ variableNames.shortDescription - tool tip for the variableNames input element.
+
+8. Debug your component.
\ No newline at end of file
1.15 +3 -2 jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Start.java
Index: Start.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Start.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- Start.java 6 Oct 2004 14:43:52 -0000 1.14
+++ Start.java 19 Oct 2004 20:08:19 -0000 1.15
@@ -76,6 +76,7 @@
{
if (e.getActionCommand().equals(JMeterMenuBar.ACTION_START))
{
+ popupShouldSave(e);
startEngine();
}
else if (e.getActionCommand().equals(JMeterMenuBar.ACTION_STOP))
1.24 +19 -4 jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Save.java
Index: Save.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Save.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- Save.java 20 Jun 2004 00:32:52 -0000 1.23
+++ Save.java 19 Oct 2004 20:08:19 -0000 1.24
@@ -20,6 +20,7 @@
import java.awt.event.ActionEvent;
import java.io.FileWriter;
+import java.io.IOException;
import java.io.Writer;
import java.util.HashSet;
import java.util.Iterator;
@@ -34,6 +35,7 @@
import org.apache.jmeter.gui.tree.JMeterTreeNode;
import org.apache.jmeter.gui.util.FileDialoger;
import org.apache.jmeter.save.SaveService;
+import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
@@ -78,11 +80,24 @@
{
return commands;
}
+
+ public boolean hasTestPlanFile()
+ {
+ return testPlanFile != null;
+ }
public void setTestPlanFile(String f)
{
testPlanFile = f;
- GuiPackage.getInstance().getMainFrame().setTitle(JMeterUtils.getExtendedFrameTitle(testPlanFile));
+ GuiPackage.getInstance().getMainFrame().setTitle(JMeterUtils.getExtendedFrameTitle(testPlanFile));
+ try
+ {
+ FileServer.getFileServer().setBasedir(testPlanFile);
+ }
+ catch(IOException e1)
+ {
+ log.error("Failure setting file server's base dir",e1);
+ }
}
public void doAction(ActionEvent e) throws IllegalUserActionException
@@ -120,7 +135,7 @@
updateFile = chooser.getSelectedFile().getAbsolutePath();
if (!e.getActionCommand().equals(SAVE_AS))
{
- testPlanFile = updateFile;
+ setTestPlanFile(updateFile);
}
}
// TODO: doesn't putting this here mark the tree as
1.13 +25 -2 jakarta-jmeter/src/core/org/apache/jmeter/gui/action/AbstractAction.java
Index: AbstractAction.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/gui/action/AbstractAction.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- AbstractAction.java 20 Feb 2004 01:03:07 -0000 1.12
+++ AbstractAction.java 19 Oct 2004 20:08:19 -0000 1.13
@@ -23,9 +23,13 @@
import java.util.LinkedList;
import java.util.Set;
+import javax.swing.JOptionPane;
+
import org.apache.jmeter.control.ReplaceableController;
+import org.apache.jmeter.gui.GuiPackage;
import org.apache.jmeter.gui.tree.JMeterTreeNode;
import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
@@ -83,6 +87,25 @@
tree.remove(item);
}
+ }
+ }
+
+ /**
+ * @param e
+ */
+ protected void popupShouldSave(ActionEvent e)
+ {
+ if(!( ((Save) ActionRouter.getInstance().getAction(
+ "save",
+ "org.apache.jmeter.gui.action.Save")).hasTestPlanFile()))
+ {
+ if(JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
+ JMeterUtils.getResString("should_save"),JMeterUtils.getResString("warning"),
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION)
+ {
+ ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(),e.getID(),Save.SAVE));
+ }
}
}
}
1.15 +4 -2 jakarta-jmeter/src/core/org/apache/jmeter/gui/action/RemoteStart.java
Index: RemoteStart.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/gui/action/RemoteStart.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- RemoteStart.java 12 Feb 2004 23:59:02 -0000 1.14
+++ RemoteStart.java 19 Oct 2004 20:08:19 -0000 1.15
@@ -75,11 +75,13 @@
}
else if (action.equals("remote_start"))
{
+ popupShouldSave(e);
doRemoteInit(name);
doRemoteStart(name);
}
else if (action.equals("remote_start_all"))
{
+ popupShouldSave(e);
String remote_hosts_string =
JMeterUtils.getPropDefault("remote_hosts", "127.0.0.1");
java.util.StringTokenizer st =
1.26 +5 -4 jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Load.java
Index: Load.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/gui/action/Load.java,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- Load.java 20 Jun 2004 01:48:54 -0000 1.25
+++ Load.java 19 Oct 2004 20:08:19 -0000 1.26
@@ -33,6 +33,7 @@
import org.apache.jmeter.gui.tree.JMeterTreeNode;
import org.apache.jmeter.gui.util.FileDialoger;
import org.apache.jmeter.save.SaveService;
+import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
@@ -93,6 +94,7 @@
log.info("Merging file: " + f);
} else {
log.info("Loading file: " + f);
+ FileServer.getFileServer().setBasedir(f.getAbsolutePath());
}
reader = new FileInputStream(f);
HashTree tree = (HashTree)SaveService.loadTree(reader);
@@ -116,8 +118,7 @@
}
if (isTestPlan && f != null)
{
- (
- (Save) ActionRouter.getInstance().getAction(
+ ((Save) ActionRouter.getInstance().getAction(
"save",
"org.apache.jmeter.gui.action.Save")).setTestPlanFile(
f.getAbsolutePath());
1.13 +72 -3 jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestPlan.java
Index: TestPlan.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestPlan.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- TestPlan.java 20 Jun 2004 00:32:53 -0000 1.12
+++ TestPlan.java 19 Oct 2004 20:08:19 -0000 1.13
@@ -18,6 +18,7 @@
package org.apache.jmeter.testelement;
+import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedList;
@@ -26,6 +27,8 @@
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.config.ConfigElement;
+import org.apache.jmeter.engine.event.LoopIterationEvent;
+import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testelement.property.BooleanProperty;
import org.apache.jmeter.testelement.property.CollectionProperty;
import org.apache.jmeter.testelement.property.StringProperty;
@@ -38,8 +41,9 @@
* Created March 13, 2001
* @version $Revision$ Last updated: $Date$
*/
-public class TestPlan extends AbstractTestElement implements Serializable
+public class TestPlan extends AbstractTestElement implements Serializable,TestListener
{
+
public final static String THREAD_GROUPS = "TestPlan.thread_groups";
public final static String FUNCTIONAL_MODE = "TestPlan.functional_mode";
public final static String USER_DEFINED_VARIABLES =
@@ -47,6 +51,8 @@
public final static String SERIALIZE_THREADGROUPS =
"TestPlan.serialize_threadgroups";
public final static String COMMENTS = "TestPlan.comments";
+
+ public final static String BASEDIR = "basedir";
private transient List threadGroups = new LinkedList();
private transient List configs = new LinkedList();
@@ -85,6 +91,16 @@
{
setProperty(new TestElementProperty(USER_DEFINED_VARIABLES, vars));
}
+
+ public String getBasedir()
+ {
+ return getPropertyAsString(BASEDIR);
+ }
+
+ public void setBasedir(String b)
+ {
+ setProperty(BASEDIR,b);
+ }
public Map getUserDefinedVariables()
{
@@ -189,5 +205,58 @@
public void addThreadGroup(ThreadGroup group)
{
threadGroups.add(group);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.testelement.TestListener#testEnded()
+ */
+ public void testEnded()
+ {
+ try
+ {
+ FileServer.getFileServer().closeFiles();
+ }
+ catch(IOException e)
+ {
+ log.error("Problem closing files at end of test",e);
+ }
+ }
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.testelement.TestListener#testEnded(java.lang.String)
+ */
+ public void testEnded(String host)
+ {
+ testEnded();
+
+ }
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.testelement.TestListener#testIterationStart(org.apache.jmeter.engine.event.LoopIterationEvent)
+ */
+ public void testIterationStart(LoopIterationEvent event)
+ {}
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.testelement.TestListener#testStarted()
+ */
+ public void testStarted()
+ {
+ if(getBasedir() != null && getBasedir().length() > 0)
+ {
+ try
+ {
+ FileServer.getFileServer().setBasedir(FileServer.getFileServer().getBaseDir() + getBasedir());
+ }
+ catch(IOException e)
+ {
+ log.error("Failed to set file server base dir with " + getBasedir(),e);
+ }
+ }
+ }
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.testelement.TestListener#testStarted(java.lang.String)
+ */
+ public void testStarted(String host)
+ {
+ testStarted();
}
}
1.9 +27 -41 jakarta-jmeter/src/core/org/apache/jmeter/engine/TreeCloner.java
Index: TreeCloner.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/engine/TreeCloner.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- TreeCloner.java 14 Feb 2004 03:34:29 -0000 1.8
+++ TreeCloner.java 19 Oct 2004 20:08:19 -0000 1.9
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*
-*/
+ */
package org.apache.jmeter.engine;
@@ -25,6 +25,8 @@
import org.apache.jmeter.control.GenericController;
import org.apache.jmeter.engine.util.NoThreadClone;
import org.apache.jmeter.reporters.ResultCollector;
+import org.apache.jmeter.testbeans.TestBean;
+import org.apache.jmeter.testbeans.TestBeanHelper;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.testelement.property.CollectionProperty;
@@ -42,8 +44,11 @@
public class TreeCloner implements HashTreeTraverser
{
Logger log = LoggingManager.getLoggerForClass();
+
ListedHashTree newTree;
+
LinkedList objects = new LinkedList();
+
boolean forThread = true;
public TreeCloner()
@@ -56,12 +61,12 @@
newTree = new ListedHashTree();
this.forThread = forThread;
}
+
public void addNode(Object node, HashTree subTree)
{
- if ((!forThread || !(node instanceof NoThreadClone))
- && (node instanceof TestElement))
+ if((!forThread || !(node instanceof NoThreadClone)) && (node instanceof TestElement))
{
- node = ((TestElement) node).clone();
+ node = ((TestElement)node).clone();
newTree.add(objects, node);
}
else
@@ -82,8 +87,7 @@
}
public void processPath()
- {
- }
+ {}
public static class Test extends junit.framework.TestCase
{
@@ -111,49 +115,31 @@
ListedHashTree newTree = cloner.getClonedTree();
assertTrue(original != newTree);
assertEquals(original.size(), newTree.size());
- assertEquals(
- original.getTree(original.getArray()[0]).size(),
- newTree.getTree(newTree.getArray()[0]).size());
+ assertEquals(original.getTree(original.getArray()[0]).size(), newTree.getTree(newTree.getArray()[0]).size());
assertTrue(original.getArray()[0] != newTree.getArray()[0]);
- assertEquals(
- ((GenericController) original.getArray()[0]).getName(),
- ((GenericController) newTree.getArray()[0]).getName());
- assertSame(
- original.getTree(original.getArray()[0]).getArray()[1],
- newTree.getTree(newTree.getArray()[0]).getArray()[1]);
- TestPlan clonedTestPlan = (TestPlan) newTree.getArray()[1];
+ assertEquals(((GenericController)original.getArray()[0]).getName(),
+ ((GenericController)newTree.getArray()[0]).getName());
+ assertSame(original.getTree(original.getArray()[0]).getArray()[1], newTree.getTree(newTree.getArray()[0])
+ .getArray()[1]);
+ TestPlan clonedTestPlan = (TestPlan)newTree.getArray()[1];
clonedTestPlan.setRunningVersion(true);
clonedTestPlan.recoverRunningVersion();
- assertTrue(
- !plan
- .getProperty(TestPlan.USER_DEFINED_VARIABLES)
- .isRunningVersion());
- assertTrue(
- clonedTestPlan
- .getProperty(TestPlan.USER_DEFINED_VARIABLES)
- .isRunningVersion());
- Arguments vars =
- (Arguments) plan
- .getProperty(TestPlan.USER_DEFINED_VARIABLES)
- .getObjectValue();
- PropertyIterator iter =
- ((CollectionProperty) vars.getProperty(Arguments.ARGUMENTS))
- .iterator();
- while (iter.hasNext())
+ assertTrue(!plan.getProperty(TestPlan.USER_DEFINED_VARIABLES).isRunningVersion());
+ assertTrue(clonedTestPlan.getProperty(TestPlan.USER_DEFINED_VARIABLES).isRunningVersion());
+ Arguments vars = (Arguments)plan.getProperty(TestPlan.USER_DEFINED_VARIABLES).getObjectValue();
+ PropertyIterator iter = ((CollectionProperty)vars.getProperty(Arguments.ARGUMENTS)).iterator();
+ while(iter.hasNext())
{
- JMeterProperty argProp = iter.next();
+ JMeterProperty argProp = iter.next();
assertTrue(!argProp.isRunningVersion());
assertTrue(argProp.getObjectValue() instanceof Argument);
Argument arg = (Argument)argProp.getObjectValue();
arg.setValue("yahoo");
- assertEquals("yahoo",arg.getValue());
+ assertEquals("yahoo", arg.getValue());
}
- vars =
- (Arguments) clonedTestPlan
- .getProperty(TestPlan.USER_DEFINED_VARIABLES)
- .getObjectValue();
+ vars = (Arguments)clonedTestPlan.getProperty(TestPlan.USER_DEFINED_VARIABLES).getObjectValue();
iter = vars.propertyIterator();
- while (iter.hasNext())
+ while(iter.hasNext())
{
assertTrue(iter.next().isRunningVersion());
}
1.42 +4 -3 jakarta-jmeter/src/core/org/apache/jmeter/threads/TestCompiler.java
Index: TestCompiler.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/threads/TestCompiler.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- TestCompiler.java 6 Jun 2004 22:16:59 -0000 1.41
+++ TestCompiler.java 19 Oct 2004 20:08:19 -0000 1.42
@@ -187,6 +187,7 @@
{
if (item instanceof Controller)
{
+ TestBeanHelper.prepare(child);
((Controller) item).addIterationListener(
(LoopIterationListener) child);
break;
1.5 +17 -3 jakarta-jmeter/src/core/org/apache/jmeter/config/ConfigTestElement.java
Index: ConfigTestElement.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/config/ConfigTestElement.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ConfigTestElement.java 14 Feb 2004 03:34:30 -0000 1.4
+++ ConfigTestElement.java 19 Oct 2004 20:08:19 -0000 1.5
@@ -29,7 +29,7 @@
*/
public class ConfigTestElement
extends AbstractTestElement
- implements Serializable
+ implements Serializable,ConfigElement
{
public final static String USERNAME = "ConfigTestElement.username";
public final static String PASSWORD = "ConfigTestElement.password";
@@ -44,5 +44,19 @@
{
mergeIn(parm1);
}
+ }
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.config.ConfigElement#addConfigElement(org.apache.jmeter.config.ConfigElement)
+ */
+ public void addConfigElement(ConfigElement config)
+ {
+ mergeIn((TestElement)config);
+ }
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.config.ConfigElement#expectsModification()
+ */
+ public boolean expectsModification()
+ {
+ return false;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org