Author: sebb
Date: Sat Sep 22 11:14:53 2007
New Revision: 578467

URL: http://svn.apache.org/viewvc?rev=578467&view=rev
Log:
Bug 43450 - add save/restore of error count; fix Calculator to use error count

Modified:
    jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv
    jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml
    
jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
    jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv
    jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml
    
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv (original)
+++ jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv Sat Sep 22 
11:14:53 2007
@@ -1,19 +1,19 @@
-label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
+label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount,ErrorCount
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0

Modified: jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml Sat Sep 22 
11:14:53 2007
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <testResults version="1.2">
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -8,7 +8,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -16,7 +16,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -24,105 +24,105 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>

Modified: 
jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
 Sat Sep 22 11:14:53 2007
@@ -364,6 +364,7 @@
                                                statsBuff.append("Load time: 
").append(res.getTime()).append(NL);
                                                statsBuff.append("Size in 
bytes: ").append(res.getBytes()).append(NL);
                                                statsBuff.append("Sample Count: 
").append(res.getSampleCount()).append(NL);
+                                               statsBuff.append("Error Count: 
").append(res.getErrorCount()).append(NL);
                                                
statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
                                                statsBuff = new StringBuffer(); 
//reset for reuse
                                                

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
 Sat Sep 22 11:14:53 2007
@@ -820,13 +820,41 @@
        /**
         * return the sample count. by default, the value is 1.
         * 
-        * @return
+        * @return the count of samples
         */
        public int getSampleCount() {
                return sampleCount;
        }
 
        /**
+        * Returns the count of errors.
+        * 
+        * @return 0 - or 1 if the sample failed
+        */
+       public int getErrorCount(){
+               return success ? 0 : 1;
+       }
+       
+       public void setErrorCount(int i){// for reading from CSV files
+               // ignored currently
+       }
+       /*
+        * TODO: error counting needs to be sorted out after 2.3 final.
+        * At present the Statistical Sampler tracks errors separately
+        * It would make sense to move the error count here, but this would
+        * mean lots of changes.
+        * It's also tricky maintaining the count - it can't just be 
incremented/decremented
+        * when the success flag is set as this may be done multiple times.
+        * The work-round for now is to do the work in the 
StatisticalSampleResult,
+        * which overrides this method.
+        * Note that some JMS samplers also create samples with > 1 sample count
+        * Also the Transaction Controller probably needs to be changed to do
+        * proper sample and error accounting.
+        * The purpose of this work-round is to allow at least minimal support 
for
+        * errors in remote statistical batch mode.
+        * 
+        */
+       /**
         * In the event the sampler does want to pass back the actual contents, 
we
         * still want to calculate the throughput. The bytes is the bytes of the
         * response data.
@@ -840,7 +868,7 @@
        /**
         * return the bytes returned by the response.
         * 
-        * @return
+        * @return number of bytes in response
         */
        public int getBytes() {
                return bytes == 0 ? responseData.length : bytes;

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
 Sat Sep 22 11:14:53 2007
@@ -21,23 +21,37 @@
 import java.io.Serializable;
 
 /**
- * @author Lars Krog-Jensen
- *         Created: 2005-okt-04
+ * Aggregates sample results for use by the Statistical remote batch mode.
+ * Samples are aggregated by the key defined by getKey().
+ * TODO: merge error count into parent class? 
  */
 public class StatisticalSampleResult extends SampleResult implements
                Serializable {
     
-       private static final long serialVersionUID = 23L;
+       private static final long serialVersionUID = 24L;
 
        private int errorCount;
 
     public StatisticalSampleResult(){// May be called by XStream
     }
     
+       /**
+        * Allow OldSaveService to generate a suitable result when sample/error 
counts have been saved.
+        * 
+        * @deprecated Needs to be replaced when multiple sample results are 
sorted out
+        * 
+        * @param stamp
+        * @param elapsed
+        */
+       public StatisticalSampleResult(long stamp, long elapsed) {
+               super(stamp, elapsed);
+       }
+
        public StatisticalSampleResult(SampleResult res) {
-               // Copy data that is shared between samples:
+               // Copy data that is shared between samples (i.e. the key 
items):
                setSampleLabel(res.getSampleLabel());
                setThreadName(res.getThreadName());
+
                setSuccessful(true); // Assume result is OK
                setSampleCount(0); // because we add the sample count in later
        }
@@ -51,6 +65,7 @@
                // Add Error Counter
                if (!res.isSuccessful()) {
                        errorCount++;
+                       this.setSuccessful(false);
                }
 
                // Set start/end times
@@ -73,14 +88,27 @@
                return getEndTime();
        }
 
-       public int getErrorCount() {
+       public int getErrorCount() {// Overrides SampleResult
                return errorCount;
        }
 
-       public static String getKey(SampleEvent event) {
-               String key = event.getResult().getSampleLabel() + "-"
-                               + event.getThreadGroup();
+       public void setErrorCount(int e) {// for reading CSV files
+               errorCount = e;
+       }
 
-               return key;
+       /**
+        * Generates the key to be used for aggregating samples as follows:<br/>
+        * <code>sampleLabel</code> "-" <code>threadGroup</code>
+        * 
+        * N.B. the key should agree with the fixed items that are saved in the 
sample.
+        * 
+        * @param event sample event whose key is to be calculated
+        * @return the key to use for aggregating samples
+        */
+       public static String getKey(SampleEvent event) {
+               SampleResult result = event.getResult();
+               StringBuffer sb = new StringBuffer(80);
+               
sb.append(result.getSampleLabel()).append("-").append(result.getThreadName());
+               return sb.toString();
        }
 }

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
 Sat Sep 22 11:14:53 2007
@@ -43,6 +43,7 @@
 import org.apache.jmeter.assertions.AssertionResult;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.samplers.StatisticalSampleResult;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
@@ -101,6 +102,7 @@
     private static final String CSV_THREAD_COUNT1 = "grpThreads"; // 
$NON-NLS-1$
     private static final String CSV_THREAD_COUNT2 = "allThreads"; // 
$NON-NLS-1$
     private static final String CSV_SAMPLE_COUNT = "SampleCount"; // 
$NON-NLS-1$
+    private static final String CSV_ERROR_COUNT = "ErrorCount"; // $NON-NLS-1$
     private static final String CSV_URL = "URL"; // $NON-NLS-1$
     private static final String CSV_FILENAME = "Filename"; // $NON-NLS-1$
     private static final String CSV_LATENCY = "Latency"; // $NON-NLS-1$
@@ -185,7 +187,11 @@
                                elapsed = Long.parseLong(text);
                        }
 
-                       result = new SampleResult(timeStamp, elapsed);
+                       if (saveConfig.saveSampleCount()) {
+                               result = new StatisticalSampleResult(timeStamp, 
elapsed);
+                       } else {
+                               result = new SampleResult(timeStamp, elapsed);
+                       }
 
                        if (saveConfig.saveLabel()) {
                                field = LABEL;
@@ -260,10 +266,13 @@
                 result.setEncodingAndType(text);
             }
 
-            if (saveConfig.saveEncoding()) {
+            if (saveConfig.saveSampleCount()) {
                field = CSV_SAMPLE_COUNT;
                 text = parts[i++];
                 result.setSampleCount(Integer.parseInt(text));
+               field = CSV_ERROR_COUNT;
+                text = parts[i++];
+                result.setErrorCount(Integer.parseInt(text));
             }
 
             
@@ -378,6 +387,8 @@
                if (saveConfig.saveSampleCount()) {
                        text.append(CSV_SAMPLE_COUNT);
                        text.append(delim);
+                       text.append(CSV_ERROR_COUNT);
+                       text.append(delim);
                }
 
                String resultString = null;
@@ -414,7 +425,9 @@
             // Both these are needed in the list even though they set the same 
variable
             headerLabelMethods.put(CSV_THREAD_COUNT1,new 
Functor("setThreadCounts"));
             headerLabelMethods.put(CSV_THREAD_COUNT2,new 
Functor("setThreadCounts"));
+            // Both these are needed in the list even though they set the same 
variable
             headerLabelMethods.put(CSV_SAMPLE_COUNT, new 
Functor("setSampleCount"));
+            headerLabelMethods.put(CSV_ERROR_COUNT, new 
Functor("setSampleCount"));
        }
 
        /**
@@ -592,8 +605,10 @@
             text.append(delimiter);
         }
 
-       if (saveConfig.saveSampleCount()) {
+       if (saveConfig.saveSampleCount()) {// Need both sample and error count 
to be any use
                text.append(sample.getSampleCount());
+               text.append(delimiter);
+               text.append(sample.getErrorCount());
                text.append(delimiter);
        }
     

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
 Sat Sep 22 11:14:53 2007
@@ -64,6 +64,7 @@
     private static final String ATT_BYTES             = "by"; //$NON-NLS-1$
     private static final String ATT_DATA_ENCODING     = "de"; //$NON-NLS-1$
     private static final String ATT_DATA_TYPE         = "dt"; //$NON-NLS-1$
+    private static final String ATT_ERROR_COUNT      = "ec"; //$NON-NLS-1$
     private static final String ATT_LABEL             = "lb"; //$NON-NLS-1$
     private static final String ATT_LATENCY           = "lt"; //$NON-NLS-1$
 
@@ -251,6 +252,7 @@
                        writer.addAttribute(ATT_BYTES, 
String.valueOf(res.getBytes()));
         if (save.saveSampleCount()){
                writer.addAttribute(ATT_SAMPLE_COUNT, 
String.valueOf(res.getSampleCount()));
+               writer.addAttribute(ATT_ERROR_COUNT, 
String.valueOf(res.getErrorCount()));
         }
         if (save.saveThreadCounts()){// These cannot be restored
                org.apache.jmeter.threads.ThreadGroup 
@@ -362,6 +364,7 @@
                
res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY)));
                res.setBytes(Converter.getInt(reader.getAttribute(ATT_BYTES)));
                
res.setSampleCount(Converter.getInt(reader.getAttribute(ATT_SAMPLE_COUNT),1)); 
// default is 1
+               
res.setErrorCount(Converter.getInt(reader.getAttribute(ATT_ERROR_COUNT),0)); // 
default is 0
         // ATT_GRP_THRDS and ATT_ALL_THRDS are write only
        }
 

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java 
(original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java 
Sat Sep 22 11:14:53 2007
@@ -94,7 +94,7 @@
     public void addSample(SampleResult res) {
         addBytes(res.getBytes());
         addValue(res.getTime(),res.getSampleCount());
-        if (!res.isSuccessful()) errors++;
+        errors+=res.getErrorCount(); // account for multiple samples
         if (startTime == 0){
             startTime=res.getStartTime();
         }
@@ -170,7 +170,7 @@
      * calculates the average page size, which means divide the bytes by number
      * of samples.
      * 
-     * @return
+     * @return average page size
      */
     public double getPageSize() {
         if (count > 0 && bytes > 0) {
@@ -182,11 +182,11 @@
     /**
      * Throughput in bytes / second
      * 
-     * @return
+     * @return throughput in bytes/second
      */
     public double getBytesPerSecond() {
         if (elapsedTime > 0) {
-            return bytes / ((double) elapsedTime / 1000);
+            return bytes / ((double) elapsedTime / 1000); // 1000 = 
millisecs/sec
         }
         return 0.0;
     }
@@ -194,10 +194,10 @@
     /**
      * Throughput in kilobytes / second
      * 
-     * @return
+     * @return Throughput in kilobytes / second
      */
     public double getKBPerSecond() {
-        return getBytesPerSecond() / 1024;
+        return getBytesPerSecond() / 1024; // 1024=bytes per kb
     }
 
 }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sat Sep 22 11:14:53 2007
@@ -40,7 +40,7 @@
 <li>Fixup broken jmeter-server script</li>
 <li>Bug 43364 - option to revert If Controller to pre 2.3RC3 behaviour</li>
 <li>Bug 43449 - Statistical Remote mode does not handle Latency</li>
-<li>Bug 43450 (partial fix) - Allow SampleCount to be saved/restored from 
files</li>
+<li>Bug 43450 (partial fix) - Allow SampleCount and ErrorCount to be saved 
to/restored from files</li>
 </ul>
 
 <h4>Improvements</h4>

Modified: jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv (original)
+++ jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv Sat Sep 22 11:14:53 
2007
@@ -1,19 +1,19 @@
-label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
+label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount,ErrorCount
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0

Modified: jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml (original)
+++ jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml Sat Sep 22 11:14:53 
2007
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <testResults version="1.2">
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -8,7 +8,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -16,7 +16,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" 
by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -24,105 +24,105 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" 
sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" 
dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" 
by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>

Modified: 
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
 (original)
+++ 
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
 Sat Sep 22 11:14:53 2007
@@ -364,6 +364,7 @@
                                                statsBuff.append("Load time: 
").append(res.getTime()).append(NL);
                                                statsBuff.append("Size in 
bytes: ").append(res.getBytes()).append(NL);
                                                statsBuff.append("Sample Count: 
").append(res.getSampleCount()).append(NL);
+                                               statsBuff.append("Error Count: 
").append(res.getErrorCount()).append(NL);
                                                
statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
                                                statsBuff = new StringBuffer(); 
//reset for reuse
                                                

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java 
Sat Sep 22 11:14:53 2007
@@ -834,6 +834,34 @@
        }
 
        /**
+        * Returns the count of errors.
+        * 
+        * @return 0 - or 1 if the sample failed
+        */
+       public int getErrorCount(){
+               return success ? 0 : 1;
+       }
+       
+       public void setErrorCount(int i){// for reading from CSV files
+               // ignored currently
+       }
+       /*
+        * TODO: error counting needs to be sorted out after 2.3 final.
+        * At present the Statistical Sampler tracks errors separately
+        * It would make sense to move the error count here, but this would
+        * mean lots of changes.
+        * It's also tricky maintaining the count - it can't just be 
incremented/decremented
+        * when the success flag is set as this may be done multiple times.
+        * The work-round for now is to do the work in the 
StatisticalSampleResult,
+        * which overrides this method.
+        * Note that some JMS samplers also create samples with > 1 sample count
+        * Also the Transaction Controller probably needs to be changed to do
+        * proper sample and error accounting.
+        * The purpose of this work-round is to allow at least minimal support 
for
+        * errors in remote statistical batch mode.
+        * 
+        */
+       /**
         * In the event the sampler does want to pass back the actual contents, 
we
         * still want to calculate the throughput. The bytes is the bytes of the
         * response data.

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
 Sat Sep 22 11:14:53 2007
@@ -21,23 +21,37 @@
 import java.io.Serializable;
 
 /**
- * @author Lars Krog-Jensen
- *         Created: 2005-okt-04
+ * Aggregates sample results for use by the Statistical remote batch mode.
+ * Samples are aggregated by the key defined by getKey().
+ * TODO: merge error count into parent class? 
  */
 public class StatisticalSampleResult extends SampleResult implements
                Serializable {
    
-       private static final long serialVersionUID = 23L;
+       private static final long serialVersionUID = 24L;
 
        private int errorCount;
 
     public StatisticalSampleResult(){// May be called by XStream
     }
     
+       /**
+        * Allow OldSaveService to generate a suitable result when sample/error 
counts have been saved.
+        * 
+        * @deprecated Needs to be replaced when multiple sample results are 
sorted out
+        * 
+        * @param stamp
+        * @param elapsed
+        */
+       public StatisticalSampleResult(long stamp, long elapsed) {
+               super(stamp, elapsed);
+       }
+
        public StatisticalSampleResult(SampleResult res) {
-               // Copy data that is shared between samples:
+               // Copy data that is shared between samples (i.e. the key 
items):
                setSampleLabel(res.getSampleLabel());
                setThreadName(res.getThreadName());
+
                setSuccessful(true); // Assume result is OK
                setSampleCount(0); // because we add the sample count in later
        }
@@ -51,6 +65,7 @@
                // Add Error Counter
                if (!res.isSuccessful()) {
                        errorCount++;
+                       this.setSuccessful(false);
                }
 
                // Set start/end times
@@ -73,14 +88,27 @@
                return getEndTime();
        }
 
-       public int getErrorCount() {
+       public int getErrorCount() {// Overrides SampleResult
                return errorCount;
        }
 
-       public static String getKey(SampleEvent event) {
-               String key = event.getResult().getSampleLabel() + "-"
-                               + event.getThreadGroup();
+       public void setErrorCount(int e) {// for reading CSV files
+               errorCount = e;
+       }
 
-               return key;
+       /**
+        * Generates the key to be used for aggregating samples as follows:<br/>
+        * <code>sampleLabel</code> "-" <code>threadGroup</code>
+        * 
+        * N.B. the key should agree with the fixed items that are saved in the 
sample.
+        * 
+        * @param event sample event whose key is to be calculated
+        * @return the key to use for aggregating samples
+        */
+       public static String getKey(SampleEvent event) {
+               SampleResult result = event.getResult();
+               StringBuffer sb = new StringBuffer(80);
+               
sb.append(result.getSampleLabel()).append("-").append(result.getThreadName());
+               return sb.toString();
        }
 }

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=578467&r1=578466&r2=578467&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 Sep 22 11:14:53 2007
@@ -43,6 +43,7 @@
 import org.apache.jmeter.assertions.AssertionResult;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.samplers.StatisticalSampleResult;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
@@ -100,6 +101,7 @@
     private static final String CSV_THREAD_COUNT1 = "grpThreads"; // 
$NON-NLS-1$
     private static final String CSV_THREAD_COUNT2 = "allThreads"; // 
$NON-NLS-1$
     private static final String CSV_SAMPLE_COUNT = "SampleCount"; // 
$NON-NLS-1$
+    private static final String CSV_ERROR_COUNT = "ErrorCount"; // $NON-NLS-1$
     private static final String CSV_URL = "URL"; // $NON-NLS-1$
     private static final String CSV_FILENAME = "Filename"; // $NON-NLS-1$
     private static final String CSV_LATENCY = "Latency"; // $NON-NLS-1$
@@ -184,7 +186,11 @@
                                elapsed = Long.parseLong(text);
                        }
 
-                       result = new SampleResult(timeStamp, elapsed);
+                       if (saveConfig.saveSampleCount()) {
+                               result = new StatisticalSampleResult(timeStamp, 
elapsed);
+                       } else {
+                               result = new SampleResult(timeStamp, elapsed);
+                       }
 
                        if (saveConfig.saveLabel()) {
                                field = LABEL;
@@ -264,10 +270,13 @@
                 result.setEncodingAndType(text);
             }
 
-            if (saveConfig.saveEncoding()) {
+            if (saveConfig.saveSampleCount()) {
                field = CSV_SAMPLE_COUNT;
                 text = parts[i++];
                 result.setSampleCount(Integer.parseInt(text));
+               field = CSV_ERROR_COUNT;
+                text = parts[i++];
+                result.setErrorCount(Integer.parseInt(text));
             }
 
             
@@ -382,6 +391,8 @@
                if (saveConfig.saveSampleCount()) {
                        text.append(CSV_SAMPLE_COUNT);
                        text.append(delim);
+                       text.append(CSV_ERROR_COUNT);
+                       text.append(delim);
                }
 
                String resultString = null;
@@ -418,7 +429,9 @@
             // Both these are needed in the list even though they set the same 
variable
             headerLabelMethods.put(CSV_THREAD_COUNT1,new 
Functor("setThreadCounts"));
             headerLabelMethods.put(CSV_THREAD_COUNT2,new 
Functor("setThreadCounts"));
+            // Both these are needed in the list even though they set the same 
variable
             headerLabelMethods.put(CSV_SAMPLE_COUNT, new 
Functor("setSampleCount"));
+            headerLabelMethods.put(CSV_ERROR_COUNT, new 
Functor("setSampleCount"));
        }
 
        /**
@@ -590,8 +603,10 @@
             text.append(delimiter);
         }
 
-       if (saveConfig.saveSampleCount()) {
+       if (saveConfig.saveSampleCount()) {// Need both sample and error count 
to be any use
                text.append(sample.getSampleCount());
+               text.append(delimiter);
+               text.append(sample.getErrorCount());
                text.append(delimiter);
        }
     

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
 Sat Sep 22 11:14:53 2007
@@ -63,6 +63,7 @@
     private static final String ATT_BYTES             = "by"; //$NON-NLS-1$
     private static final String ATT_DATA_ENCODING     = "de"; //$NON-NLS-1$
     private static final String ATT_DATA_TYPE         = "dt"; //$NON-NLS-1$
+    private static final String ATT_ERROR_COUNT      = "ec"; //$NON-NLS-1$
     private static final String ATT_LABEL             = "lb"; //$NON-NLS-1$
     private static final String ATT_LATENCY           = "lt"; //$NON-NLS-1$
 
@@ -250,6 +251,7 @@
                        writer.addAttribute(ATT_BYTES, 
String.valueOf(res.getBytes()));
         if (save.saveSampleCount()){
                writer.addAttribute(ATT_SAMPLE_COUNT, 
String.valueOf(res.getSampleCount()));
+               writer.addAttribute(ATT_ERROR_COUNT, 
String.valueOf(res.getErrorCount()));
         }
         if (save.saveThreadCounts()){
            writer.addAttribute(ATT_GRP_THRDS, 
String.valueOf(res.getGroupThreads()));
@@ -353,6 +355,7 @@
                
res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY)));
                res.setBytes(Converter.getInt(reader.getAttribute(ATT_BYTES)));
                
res.setSampleCount(Converter.getInt(reader.getAttribute(ATT_SAMPLE_COUNT),1)); 
// default is 1
+               
res.setErrorCount(Converter.getInt(reader.getAttribute(ATT_ERROR_COUNT),0)); // 
default is 0
                
res.setGroupThreads(Converter.getInt(reader.getAttribute(ATT_GRP_THRDS)));
                
res.setAllThreads(Converter.getInt(reader.getAttribute(ATT_ALL_THRDS)));
        }

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java Sat 
Sep 22 11:14:53 2007
@@ -94,7 +94,7 @@
     public void addSample(SampleResult res) {
         addBytes(res.getBytes());
         addValue(res.getTime(),res.getSampleCount());
-        if (!res.isSuccessful()) errors++;
+        errors+=res.getErrorCount(); // account for multiple samples
         if (startTime == 0){
             startTime=res.getStartTime();
         }
@@ -170,7 +170,7 @@
      * calculates the average page size, which means divide the bytes by number
      * of samples.
      * 
-     * @return
+     * @return average page size
      */
     public double getPageSize() {
         if (count > 0 && bytes > 0) {
@@ -182,11 +182,11 @@
     /**
      * Throughput in bytes / second
      * 
-     * @return
+     * @return throughput in bytes/second
      */
     public double getBytesPerSecond() {
         if (elapsedTime > 0) {
-            return bytes / ((double) elapsedTime / 1000);
+            return bytes / ((double) elapsedTime / 1000); // 1000 = 
millisecs/sec
         }
         return 0.0;
     }
@@ -194,10 +194,10 @@
     /**
      * Throughput in kilobytes / second
      * 
-     * @return
+     * @return Throughput in kilobytes / second
      */
     public double getKBPerSecond() {
-        return getBytesPerSecond() / 1024;
+        return getBytesPerSecond() / 1024; // 1024=bytes per kb
     }
 
 }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Sep 22 11:14:53 2007
@@ -58,7 +58,7 @@
 <li>Fixup broken jmeter-server script</li>
 <li>Bug 43364 - option to revert If Controller to pre 2.3RC3 behaviour</li>
 <li>Bug 43449 - Statistical Remote mode does not handle Latency</li>
-<li>Bug 43450 (partial fix) - Allow SampleCount to be saved/restored from 
files</li>
+<li>Bug 43450 (partial fix) - Allow SampleCount and ErrorCount to be saved 
to/restored from files</li>
 </ul>
 
 <h4>Improvements</h4>



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

Reply via email to