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