Author: sebb
Date: Sat Nov  8 06:19:48 2008
New Revision: 712398

URL: http://svn.apache.org/viewvc?rev=712398&view=rev
Log:
More efficient loading of JTL files
Don't clear Visualizer before loading the file

Added:
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
   (with props)
Modified:
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
    jakarta/jmeter/trunk/xdocs/changes.xml
    jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
    jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java 
(original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java 
Sat Nov  8 06:19:48 2008
@@ -31,7 +31,6 @@
 import java.io.PrintWriter;
 import java.io.RandomAccessFile;
 import java.io.Serializable;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -49,7 +48,6 @@
 import org.apache.jmeter.save.CSVSaveService;
 import org.apache.jmeter.save.OldSaveService;
 import org.apache.jmeter.save.SaveService;
-import org.apache.jmeter.save.TestResultWrapper;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestListener;
 import org.apache.jmeter.testelement.property.BooleanProperty;
@@ -208,7 +206,7 @@
      * @param successOnly if success only wanted
      * @return whether to log/display the sample
      */
-    public boolean isSampleWanted(boolean success, boolean errorOnly,
+    public static boolean isSampleWanted(boolean success, boolean errorOnly,
             boolean successOnly) {
         return (!errorOnly && !successOnly) ||
                (success && successOnly) ||
@@ -274,7 +272,6 @@
         String filename = getFilename();
         File file = new File(filename);
         if (file.exists()) {
-            clearVisualizer();
             BufferedReader dataReader = null;
             BufferedInputStream bufferedInputStream = null;
             try {
@@ -292,8 +289,8 @@
                     } else { // We are processing XML
                         try { // Assume XStream
                             bufferedInputStream = new BufferedInputStream(new 
FileInputStream(file));
-                            // TODO change to process samples one by one
-                            
readSamples(SaveService.loadTestResults(bufferedInputStream), visualizer);
+                            SaveService.loadTestResults(bufferedInputStream, 
+                                    new ResultCollectorHelper(this, 
visualizer));
                             parsedOK = true;
                         } catch (Exception e) {
                             log.info("Failed to load "+filename+" using 
XStream, trying old XML format. Error was: "+e);
@@ -312,6 +309,8 @@
                 log.warn("Problem reading JTL file: "+file);
             } catch (RuntimeException e){ // e.g. NullPointerException
                 log.warn("Problem reading JTL file: "+file,e);
+            } catch (OutOfMemoryError e) {
+                log.warn("Problem reading JTL file: "+file,e);
             } finally {
                 JOrphanUtils.closeQuietly(dataReader);
                 JOrphanUtils.closeQuietly(bufferedInputStream);
@@ -440,28 +439,6 @@
         return true;
     }
 
-    // Only called if visualizer is non-null
-    private void readSamples(TestResultWrapper testResults, Visualizer 
visualizer) throws Exception {
-        Collection samples = testResults.getSampleResults();
-        final boolean errorsOnly = isErrorLogging();
-        final boolean successOnly = isSuccessOnlyLogging();
-        Iterator iter = samples.iterator();
-        while (iter.hasNext()) {
-            SampleResult result = (SampleResult) iter.next();
-            if (isSampleWanted(result.isSuccessful(), errorsOnly, 
successOnly)) {
-                visualizer.add(result);
-            }
-        }
-    }
-
-    public void clearVisualizer() {
-        // current = -1;
-        if (getVisualizer() != null && getVisualizer() instanceof Clearable) {
-            ((Clearable) getVisualizer()).clearData();
-        }
-        finalizeFileOutput();
-    }
-
     public void sampleStarted(SampleEvent e) {
     }
 

Added: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java?rev=712398&view=auto
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
 (added)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
 Sat Nov  8 06:19:48 2008
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.reporters;
+
+import org.apache.jmeter.reporters.ResultCollector;
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.visualizers.Visualizer;
+
+/**
+ * Helper class to allow TestResultWrapperConverter to send samples
+ * directly to the visualiser if required.
+ */
+public class ResultCollectorHelper {
+    
+    private final Visualizer visualizer;
+    private final boolean errorsOnly;
+    private final boolean successOnly;
+    
+    public ResultCollectorHelper(ResultCollector resultCollector, Visualizer 
visualizer) {
+        this.visualizer = visualizer;
+        this.errorsOnly = resultCollector.isErrorLogging();
+        this.successOnly = resultCollector.isSuccessOnlyLogging();
+    }
+
+    public void add(SampleResult sample){
+        if (ResultCollector.isSampleWanted(sample.isSuccessful(), errorsOnly, 
successOnly)){
+            visualizer.add(sample);
+        }
+    }
+}

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java 
Sat Nov  8 06:19:48 2008
@@ -142,7 +142,7 @@
                 SampleEvent event = 
CSVSaveService.makeResultFromDelimitedString(parts,saveConfig,lineNumber);
                 if (event != null){
                     final SampleResult result = event.getResult();
-                    if 
(resultCollector.isSampleWanted(result.isSuccessful(),errorsOnly, successOnly)) 
{
+                    if 
(ResultCollector.isSampleWanted(result.isSuccessful(),errorsOnly, successOnly)) 
{
                         visualizer.add(result);
                     }
                 }

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java 
Sat Nov  8 06:19:48 2008
@@ -492,7 +492,7 @@
         final boolean successOnly = rc.isSuccessOnlyLogging();
         for (int i = 0; i < samples.length; i++) {
             SampleResult result = OldSaveService.getSampleResult(samples[i]);
-            if (rc.isSampleWanted(result.isSuccessful(), errorsOnly, 
successOnly)) {
+            if (ResultCollector.isSampleWanted(result.isSuccessful(), 
errorsOnly, successOnly)) {
                 visualizer.add(result);
             }
         }

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java Sat 
Nov  8 06:19:48 2008
@@ -33,6 +33,7 @@
 
 import java.nio.charset.Charset;
 
+import org.apache.jmeter.reporters.ResultCollectorHelper;
 import org.apache.jmeter.samplers.SampleEvent;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
@@ -51,6 +52,7 @@
 import com.thoughtworks.xstream.converters.Converter;
 import com.thoughtworks.xstream.converters.DataHolder;
 import 
com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
 
 /**
  * Handles setting up XStream serialisation.
@@ -61,9 +63,15 @@
 
     private static final Logger log = LoggingManager.getLoggerForClass();
 
+    // Names of DataHolder entries
     public static final String SAMPLE_EVENT_OBJECT = "SampleEvent"; // 
$NON-NLS-1$
+    public static final String RESULTCOLLECTOR_HELPER_OBJECT = 
"ResultCollectorHelper"; // $NON-NLS-1$
+
+    private static final class XStreamWrapper extends XStream {
+        private XStreamWrapper(ReflectionProvider reflectionProvider) {
+            super(reflectionProvider);
+        }
 
-    private static final XStream saver = new XStream(new 
PureJavaReflectionProvider()){
         // Override wrapMapper in order to insert the Wrapper in the chain
         protected MapperWrapper wrapMapper(MapperWrapper next) {
             // Provide our own aliasing using strings rather than classes
@@ -83,8 +91,14 @@
                 }
             };
         }
-    };
+    }
 
+    private static final XStream JMXSAVER = new XStreamWrapper(new 
PureJavaReflectionProvider());
+    private static final XStream JTLSAVER = new XStreamWrapper(new 
PureJavaReflectionProvider());
+    static {
+        JTLSAVER.setMode(XStream.NO_REFERENCES); // This is needed to stop 
XStream keeping copies of each class
+    }
+    
     // The XML header, with placeholder for encoding, since that is controlled 
by property
     private static final String XML_HEADER = "<?xml version=\"1.0\" 
encoding=\"<ph>\"?>"; // $NON-NLS-1$
 
@@ -195,16 +209,14 @@
                     } else {
                         key = key.substring(1);// Remove the leading "_"
                         try {
-                            if (val.trim().equals("collection")) { // 
$NON-NLS-1$
-                                saver.registerConverter((Converter) 
Class.forName(key).getConstructor(
-                                        new Class[] { Mapper.class 
}).newInstance(
-                                        new Object[] { saver.getMapper() }));
-                            } else if (val.trim().equals("mapping")) { // 
$NON-NLS-1$
-                                saver.registerConverter((Converter) 
Class.forName(key).getConstructor(
-                                        new Class[] { Mapper.class 
}).newInstance(
-                                        new Object[] { saver.getMapper() }));
+                            final String trimmedValue = val.trim();
+                            if (trimmedValue.equals("collection") // 
$NON-NLS-1$
+                             || trimmedValue.equals("mapping")) { // 
$NON-NLS-1$
+                                registerConverter(key, JMXSAVER, true);
+                                registerConverter(key, JTLSAVER, true);
                             } else {
-                                saver.registerConverter((Converter) 
Class.forName(key).newInstance());
+                                registerConverter(key, JMXSAVER, false);
+                                registerConverter(key, JTLSAVER, false);
                             }
                         } catch (IllegalAccessException e1) {
                             log.warn("Can't register a converter: " + key, e1);
@@ -230,6 +242,31 @@
         }
     }
 
+    /**
+     * Register converter.
+     * @param key
+     * @param jmxsaver
+     * @param useMapper
+     *  
+     * @throws InstantiationException
+     * @throws IllegalAccessException
+     * @throws InvocationTargetException
+     * @throws NoSuchMethodException
+     * @throws ClassNotFoundException
+     */
+    private static void registerConverter(String key, XStream jmxsaver, 
boolean useMapper)
+            throws InstantiationException, IllegalAccessException,
+            InvocationTargetException, NoSuchMethodException,
+            ClassNotFoundException {
+        if (useMapper){
+            jmxsaver.registerConverter((Converter) 
Class.forName(key).getConstructor(
+                    new Class[] { Mapper.class }).newInstance(
+                            new Object[] { jmxsaver.getMapper() }));
+        } else {
+            jmxsaver.registerConverter((Converter) 
Class.forName(key).newInstance());            
+        }
+    }
+
     // For converters to use
     public static String aliasToClass(String s){
         String r = aliasToClass.getProperty(s);
@@ -250,7 +287,7 @@
         // Use deprecated method, to avoid duplicating code
         ScriptWrapper wrapper = new ScriptWrapper();
         wrapper.testPlan = tree;
-        saver.toXML(wrapper, outputStreamWriter);
+        JMXSAVER.toXML(wrapper, outputStreamWriter);
         outputStreamWriter.write('\n');// Ensure terminated properly
         outputStreamWriter.close();
     }
@@ -261,7 +298,7 @@
         OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out);
         writeXmlHeader(outputStreamWriter);
         // Use deprecated method, to avoid duplicating code
-        saver.toXML(el, outputStreamWriter);
+        JMXSAVER.toXML(el, outputStreamWriter);
         outputStreamWriter.close();
     }
 
@@ -270,7 +307,7 @@
         // Get the InputReader to use
         InputStreamReader inputStreamReader = getInputStreamReader(in);
         // Use deprecated method, to avoid duplicating code
-        Object element = saver.fromXML(inputStreamReader);
+        Object element = JMXSAVER.fromXML(inputStreamReader);
         inputStreamReader.close();
         return element;
     }
@@ -283,11 +320,11 @@
      */
     // Used by ResultCollector#recordResult()
     public synchronized static void saveSampleResult(SampleEvent evt, Writer 
writer) throws IOException {
-        DataHolder dh = saver.newDataHolder();
+        DataHolder dh = JTLSAVER.newDataHolder();
         dh.put(SAMPLE_EVENT_OBJECT, evt);
         // This is effectively the same as saver.toXML(Object, Writer) except 
we get to provide the DataHolder
         // Don't know why there is no method for this in the XStream class
-        saver.marshal(evt.getResult(), new XppDriver().createWriter(writer), 
dh);
+        JTLSAVER.marshal(evt.getResult(), new 
XppDriver().createWriter(writer), dh);
         writer.write('\n');
     }
 
@@ -297,7 +334,7 @@
      */
     // Used by ResultCollector#recordStats()
     public synchronized static void saveTestElement(TestElement elem, Writer 
writer) throws IOException {
-        saver.toXML(elem, writer);
+        JMXSAVER.toXML(elem, writer); // TODO should this be JTLSAVER? Only 
seems to be called by MonitorHealthVisualzer
         writer.write('\n');
     }
 
@@ -377,14 +414,30 @@
         return versionsOK;
     }
 
-    public static TestResultWrapper loadTestResults(InputStream reader) throws 
Exception {
+    /**
+     * Read results from JTL file.
+     *  
+     * @param reader of the file
+     * @param resultCollectorHelper helper class to enable 
TestResultWrapperConverter to deliver the samples
+     * @throws Exception
+     */
+    public static void loadTestResults(InputStream reader, 
ResultCollectorHelper resultCollectorHelper) throws Exception {
         // Get the InputReader to use
         InputStreamReader inputStreamReader = getInputStreamReader(reader);
-        TestResultWrapper wrapper = (TestResultWrapper) 
saver.fromXML(inputStreamReader);
+        DataHolder dh = JTLSAVER.newDataHolder();
+        dh.put(RESULTCOLLECTOR_HELPER_OBJECT, resultCollectorHelper); // Allow 
TestResultWrapper to feed back the samples
+        // This is effectively the same as saver.fromXML(InputStream) except 
we get to provide the DataHolder
+        // Don't know why there is no method for this in the XStream class
+        JTLSAVER.unmarshal(new XppDriver().createReader(reader), null, dh);
         inputStreamReader.close();
-        return wrapper;
     }
 
+    /**
+     * Load a Test tree (JMX file)
+     * @param reader on the JMX file
+     * @return the loaded tree
+     * @throws Exception if there is a problem reading the file or processing 
it
+     */
     public static HashTree loadTree(InputStream reader) throws Exception {
         if (!reader.markSupported()) {
             reader = new BufferedInputStream(reader);
@@ -394,7 +447,7 @@
         try {
             // Get the InputReader to use
             InputStreamReader inputStreamReader = getInputStreamReader(reader);
-            wrapper = (ScriptWrapper) saver.fromXML(inputStreamReader);
+            wrapper = (ScriptWrapper) JMXSAVER.fromXML(inputStreamReader);
             inputStreamReader.close();
             if (wrapper == null){
                 log.error("Problem loading new style: see above.");

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
 Sat Nov  8 06:19:48 2008
@@ -24,15 +24,17 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.apache.jmeter.reporters.ResultCollectorHelper;
 import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.save.SaveService;
 import org.apache.jmeter.save.TestResultWrapper;
 
-import com.thoughtworks.xstream.mapper.Mapper;
 import com.thoughtworks.xstream.converters.MarshallingContext;
 import com.thoughtworks.xstream.converters.UnmarshallingContext;
 import 
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
 import com.thoughtworks.xstream.io.HierarchicalStreamReader;
 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.mapper.Mapper;
 
 /**
  * XStream Class to convert TestResultWrapper
@@ -76,8 +78,12 @@
         // ResultCollector class
     }
 
-    /*
-     * (non-Javadoc)
+    /**
+     * Read test results from JTL files and pass them to the visualiser 
directly.
+     * If the ResultCollector helper object is defined, then pass the samples 
to that
+     * rather than adding them to the test result wrapper.
+     * 
+     * @return the test result wrapper (may be empty)
      *
      * @see 
com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks.xstream.io.HierarchicalStreamReader,
      *      com.thoughtworks.xstream.converters.UnmarshallingContext)
@@ -90,12 +96,16 @@
             ver = "1.0";  //$NON-NLS-1$
         }
         results.setVersion(ver);
-        ConversionHelp.setInVersion(ver);// Make sure decoding follows input
-                                            // file
+        ConversionHelp.setInVersion(ver);// Make sure decoding follows input 
file
+        final ResultCollectorHelper resultCollectorHelper = 
(ResultCollectorHelper) context.get(SaveService.RESULTCOLLECTOR_HELPER_OBJECT);
         while (reader.hasMoreChildren()) {
             reader.moveDown();
-            SampleResult res = (SampleResult) readItem(reader, context, 
results);
-            samples.add(res);
+            SampleResult sample = (SampleResult) readItem(reader, context, 
results);
+            if (resultCollectorHelper != null) {
+                resultCollectorHelper.add(sample);
+            } else {
+                samples.add(sample);
+            }
             reader.moveUp();
         }
         results.setSampleResults(samples);

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Nov  8 06:19:48 2008
@@ -68,6 +68,12 @@
 
 <h3>Incompatible changes</h3>
 <p>
+When loading sample results from a file, previous results are no longer 
cleared.
+This allows one to merge multiple files.
+If the previous behaviour is required,
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before 
loading the file.
+</p>
+<p>
 The test elements "Save Results to a file" and "Generate Summary Results" are 
now shown as Listeners.
 They were previously shown as Post-Processors, even though they are 
implemented as Listeners.
 </p>
@@ -179,6 +185,8 @@
 <li>JDBC Request now handles quoted strings.</li>
 <li>JDBC Request now handles arbitray variable types.</li>
 <li>Bug 46030 - Extend TCP Sampler to Support Length-Prefixed Binary Data</li>
+<li>Process JVM_ARGS last so users can override default settings</li>
+<li>Read XML JTL files more efficiently - pass samples to visualisers as they 
are read, rather than saving them all and then processing them</li>
 </ul>
 
 <h3>Non-functional changes</h3>
@@ -188,6 +196,7 @@
 <li>Remove unnecessary clone() methods from function classes</li>
 <li>Moved PreProcessor invocation to JMeterThread class</li>
 <li>Made HashTree Map field final</li>
+<li>Improve performance of calling ResultCollector#isSampleWanted() for 
multiple samples</li>
 </ul>
 </section> 
 </body> 

Modified: jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml Sat Nov  8 
06:19:48 2008
@@ -1866,8 +1866,15 @@
 In order to analyse the data generated by a non-GUI test run, you need to load 
the file into the appropriate
 Listener.
 </p>
-<note>To read existing results and display them, use the file panel Browse 
button to open the file.
+<note>
+To read existing results and display them, use the file panel Browse button to 
open the file.
 </note>
+<p>
+Versions of JMeter up to 2.3.2 <b>used to clear any current data</b> before 
loading the new file.<br></br>
+This is no longer done, thus <b>allowing files to be merged</b>.
+If the previous behaviour is required, 
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before 
loading the file.
+</p>
 <p>Results can be read from XML or CSV format files.
 When reading from CSV results files, the header (if present) is used to 
determine which fields are present.
 <b>In order to interpret a header-less CSV file correctly, the appropriate 
properties must be set in jmeter.properties.</b>

Modified: jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml Sat Nov  8 06:19:48 2008
@@ -459,8 +459,13 @@
 When reading from CSV results files, the header (if present) is used to 
determine which fields were saved.
 <b>In order to interpret a header-less CSV file correctly, the appropriate 
JMeter properties must be set.</b>
 </p>
+<note>
+Versions of JMeter up to 2.3.2 used to clear any current data before loading 
the new file.
+This is no longer done, thus allowing files to be merged.
+If the previous behaviour is required, 
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before 
loading the file.
+</note>
 </section>
-</body>
 <section name="&sect-num;.10 Saving Listener GUI data" anchor="screencap">
 <p>JMeter is capable of saving any listener as a PNG file. To do so, select the
 listener in the left panel. Click edit -> Save As Image. A file dialog will
@@ -475,4 +480,5 @@
 <figure image="save_image.png">Figure 1 - Edit -> Save As Image</figure>
 
 </section>
+</body>
 </document>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to