Author: sebb
Date: Sun Nov 11 13:37:25 2007
New Revision: 593962
URL: http://svn.apache.org/viewvc?rev=593962&view=rev
Log:
Split off CSV into separate class
Added:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
(with props)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java?rev=593962&r1=593961&r2=593962&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
(original)
+++
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
Sun Nov 11 13:37:25 2007
@@ -52,6 +52,7 @@
import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.samplers.Clearable;
import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.save.CSVSaveService;
import org.apache.jmeter.save.OldSaveService;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
@@ -388,7 +389,7 @@
try {
writer = new FileWriter(output);
Vector data = this.getAllTableData();
- OldSaveService.saveCSVStats(data,writer);
+ CSVSaveService.saveCSVStats(data,writer);
} catch (FileNotFoundException e) {
log.warn(e.getMessage());
} catch (IOException e) {
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=593962&r1=593961&r2=593962&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
Sun Nov 11 13:37:25 2007
@@ -52,6 +52,7 @@
import org.apache.jmeter.samplers.SampleListener;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.save.CSVSaveService;
import org.apache.jmeter.save.OldSaveService;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.save.TestResultWrapper;
@@ -198,7 +199,7 @@
} else {
if (!line.startsWith("<?xml ")){// No, must be CSV
//$NON-NLS-1$
long lineNumber=1;
- SampleSaveConfiguration saveConfig =
OldSaveService.getSampleSaveConfiguration(line,filename);
+ SampleSaveConfiguration saveConfig =
CSVSaveService.getSampleSaveConfiguration(line,filename);
if (saveConfig == null) {// not a valid header
saveConfig = (SampleSaveConfiguration)
getSaveConfig().clone(); // OldSaveService may change the format
} else { // header line has been processed, so read the
next
@@ -206,7 +207,7 @@
lineNumber++;
}
while (line != null) { // Already read 1st line
- SampleEvent event =
OldSaveService.makeResultFromDelimitedString(line,saveConfig,lineNumber);
+ SampleEvent event =
CSVSaveService.makeResultFromDelimitedString(line,saveConfig,lineNumber);
if (event != null) sendToVisualizer(event);
line = dataReader.readLine();
lineNumber++;
@@ -266,7 +267,7 @@
// Write the EOL separately so we generate LF line ends
on Unix and Windows
writer.print("\n"); // $NON-NLS-1$
} else if (saveConfig.saveFieldNames()) {
-
writer.println(OldSaveService.printableFieldNamesToString(saveConfig));
+
writer.println(CSVSaveService.printableFieldNamesToString(saveConfig));
}
}
@@ -405,7 +406,7 @@
if (config.saveAsXml()) {
recordResult(result);
} else {
- String savee =
OldSaveService.resultToDelimitedString(e);
+ String savee =
CSVSaveService.resultToDelimitedString(e);
out.println(savee);
}
} catch (Exception err) {
Added: 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=593962&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
(added)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
Sun Nov 11 13:37:25 2007
@@ -0,0 +1,647 @@
+/*
+ * 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.save;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Vector;
+
+import org.apache.commons.collections.map.LinkedMap;
+import org.apache.jmeter.assertions.AssertionResult;
+import org.apache.jmeter.samplers.SampleEvent;
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.samplers.StatisticalSampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.reflect.Functor;
+import org.apache.jorphan.util.JMeterError;
+import org.apache.log.Logger;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternMatcherInput;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
+
+/**
+ * This class provides a means for saving/reading test results as CSV files.
+ */
+public final class CSVSaveService {
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ // ---------------------------------------------------------------------
+ // XML RESULT FILE CONSTANTS AND FIELD NAME CONSTANTS
+ // ---------------------------------------------------------------------
+
+ private static final String DATA_TYPE = "dataType"; // $NON-NLS-1$
+ private static final String FAILURE_MESSAGE = "failureMessage"; //
$NON-NLS-1$
+ private static final String LABEL = "label"; // $NON-NLS-1$
+ private static final String RESPONSE_CODE = "responseCode"; // $NON-NLS-1$
+ private static final String RESPONSE_MESSAGE = "responseMessage"; //
$NON-NLS-1$
+ private static final String SUCCESSFUL = "success"; // $NON-NLS-1$
+ private static final String THREAD_NAME = "threadName"; // $NON-NLS-1$
+ private static final String TIME_STAMP = "timeStamp"; // $NON-NLS-1$
+
+ // ---------------------------------------------------------------------
+ // ADDITIONAL CSV RESULT FILE CONSTANTS AND FIELD NAME CONSTANTS
+ // ---------------------------------------------------------------------
+
+ private static final String CSV_ELAPSED = "elapsed"; // $NON-NLS-1$
+ private static final String CSV_BYTES= "bytes"; // $NON-NLS-1$
+ 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$
+ private static final String CSV_ENCODING = "Encoding"; // $NON-NLS-1$
+ private static final String CSV_HOSTNAME = "Hostname"; // $NON-NLS-1$
+
+ // Initial config from properties
+ static private final SampleSaveConfiguration _saveConfig =
SampleSaveConfiguration.staticConfig();
+
+ // Date format to try if the time format does not parse as milliseconds
+ // (this is the suggested value in jmeter.properties)
+ private static final String DEFAULT_DATE_FORMAT_STRING = "MM/dd/yy
HH:mm:ss"; // $NON-NLS-1$
+ private static final DateFormat DEFAULT_DATE_FORMAT = new
SimpleDateFormat(DEFAULT_DATE_FORMAT_STRING);
+
+ /**
+ * Private constructor to prevent instantiation.
+ */
+ private CSVSaveService() {
+ }
+
+ /**
+ * Make a SampleResult given a delimited string.
+ *
+ * @param inputLine - line from CSV file
+ * @param saveConfig - configuration
+ * @param lineNumber - line number for error reporting
+ * @return SampleResult or null if header line detected
+ *
+ * @throws JMeterError
+ */
+ public static SampleEvent makeResultFromDelimitedString(
+ final String inputLine,
+ final SampleSaveConfiguration saveConfig, // may be updated
+ final long lineNumber) {
+
+ SampleResult result = null;
+ String hostname = "";// $NON-NLS-1$
+ long timeStamp = 0;
+ long elapsed = 0;
+ /*
+ * Bug 40772: replaced StringTokenizer with String.split(), as
the
+ * former does not return empty tokens.
+ */
+ // The \Q prefix is needed to ensure that meta-characters (e.g.
".") work.
+ String
parts[]=inputLine.split("\\Q"+saveConfig.getDelimiter());// $NON-NLS-1$
+ String text = null;
+ String field = null; // Save the name for error reporting
+ int i=0;
+
+ try {
+ if (saveConfig.saveTimestamp()){
+ field = TIME_STAMP;
+ text = parts[i++];
+ if (saveConfig.printMilliseconds()) {
+ try {
+ timeStamp =
Long.parseLong(text);
+ } catch (NumberFormatException e) {//
see if this works
+ log.warn(e.toString());
+ Date stamp =
DEFAULT_DATE_FORMAT.parse(text);
+ timeStamp = stamp.getTime();
+ log.warn("Setting date format
to: "+DEFAULT_DATE_FORMAT_STRING);
+
saveConfig.setFormatter(DEFAULT_DATE_FORMAT);
+ }
+ } else if (saveConfig.formatter() != null) {
+ Date stamp =
saveConfig.formatter().parse(text);
+ timeStamp = stamp.getTime();
+ } else { // can this happen?
+ final String msg = "Unknown timestamp
format";
+ log.warn(msg);
+ throw new JMeterError(msg);
+ }
+ }
+
+ if (saveConfig.saveTime()) {
+ field = CSV_ELAPSED;
+ text = parts[i++];
+ elapsed = Long.parseLong(text);
+ }
+
+ if (saveConfig.saveSampleCount()) {
+ result = new StatisticalSampleResult(timeStamp,
elapsed);
+ } else {
+ result = new SampleResult(timeStamp, elapsed);
+ }
+
+ if (saveConfig.saveLabel()) {
+ field = LABEL;
+ text = parts[i++];
+ result.setSampleLabel(text);
+ }
+ if (saveConfig.saveCode()) {
+ field = RESPONSE_CODE;
+ text = parts[i++];
+ result.setResponseCode(text);
+ }
+
+ if (saveConfig.saveMessage()) {
+ field = RESPONSE_MESSAGE;
+ text = parts[i++];
+ result.setResponseMessage(text);
+ }
+
+ if (saveConfig.saveThreadName()) {
+ field = THREAD_NAME;
+ text = parts[i++];
+ result.setThreadName(text);
+ }
+
+ if (saveConfig.saveDataType()) {
+ field = DATA_TYPE;
+ text = parts[i++];
+ result.setDataType(text);
+ }
+
+ if (saveConfig.saveSuccess()) {
+ field = SUCCESSFUL;
+ text = parts[i++];
+
result.setSuccessful(Boolean.valueOf(text).booleanValue());
+ }
+
+ if (saveConfig.saveAssertionResultsFailureMessage()) {
+ i++;
+ // TODO - should this be restored?
+ }
+
+ if (saveConfig.saveBytes()) {
+ field = CSV_BYTES;
+ text = parts[i++];
+ result.setBytes(Integer.parseInt(text));
+ }
+
+ if (saveConfig.saveThreadCounts()) {
+ field = CSV_THREAD_COUNT1;
+ text = parts[i++];
+ result.setGroupThreads(Integer.parseInt(text));
+
+ field = CSV_THREAD_COUNT2;
+ text = parts[i++];
+ result.setAllThreads(Integer.parseInt(text));
+ }
+
+ if (saveConfig.saveUrl()) {
+ i++;
+ // TODO: should this be restored?
+ }
+
+ if (saveConfig.saveFileName()) {
+ field = CSV_FILENAME;
+ text = parts[i++];
+ result.setResultFileName(text);
+ }
+ if (saveConfig.saveLatency()) {
+ field = CSV_LATENCY;
+ text = parts[i++];
+ result.setLatency(Long.parseLong(text));
+ }
+
+ if (saveConfig.saveEncoding()) {
+ field = CSV_ENCODING;
+ text = parts[i++];
+ result.setEncodingAndType(text);
+ }
+
+ 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));
+ }
+
+ if (saveConfig.saveHostname()) {
+ field = CSV_HOSTNAME;
+ hostname = parts[i++];
+ }
+
+ } catch (NumberFormatException e) {
+ log.warn("Error parsing field '" + field + "' at line "
+ lineNumber + " " + e);
+ throw new JMeterError(e);
+ } catch (ParseException e) {
+ log.warn("Error parsing field '" + field + "' at line "
+ lineNumber + " " + e);
+ throw new JMeterError(e);
+ } catch (ArrayIndexOutOfBoundsException e){
+ log.warn("Insufficient columns to parse field '" +
field + "' at line " + lineNumber);
+ throw new JMeterError(e);
+ }
+ return new SampleEvent(result,"",hostname);
+ }
+
+ /**
+ * Generates the field names for the output file
+ *
+ * @return the field names as a string
+ */
+ public static String printableFieldNamesToString() {
+ return printableFieldNamesToString(_saveConfig);
+ }
+
+ /**
+ * Generates the field names for the output file
+ *
+ * @return the field names as a string
+ */
+ public static String
printableFieldNamesToString(SampleSaveConfiguration saveConfig) {
+ StringBuffer text = new StringBuffer();
+ String delim = saveConfig.getDelimiter();
+
+ if (saveConfig.saveTimestamp()) {
+ text.append(TIME_STAMP);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveTime()) {
+ text.append(CSV_ELAPSED);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveLabel()) {
+ text.append(LABEL);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveCode()) {
+ text.append(RESPONSE_CODE);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveMessage()) {
+ text.append(RESPONSE_MESSAGE);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveThreadName()) {
+ text.append(THREAD_NAME);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveDataType()) {
+ text.append(DATA_TYPE);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveSuccess()) {
+ text.append(SUCCESSFUL);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveAssertionResultsFailureMessage()) {
+ text.append(FAILURE_MESSAGE);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveBytes()) {
+ text.append(CSV_BYTES);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveThreadCounts()) {
+ text.append(CSV_THREAD_COUNT1);
+ text.append(delim);
+ text.append(CSV_THREAD_COUNT2);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveUrl()) {
+ text.append(CSV_URL);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveFileName()) {
+ text.append(CSV_FILENAME);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveLatency()) {
+ text.append(CSV_LATENCY);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveEncoding()) {
+ text.append(CSV_ENCODING);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveSampleCount()) {
+ text.append(CSV_SAMPLE_COUNT);
+ text.append(delim);
+ text.append(CSV_ERROR_COUNT);
+ text.append(delim);
+ }
+
+ if (saveConfig.saveHostname()) {
+ text.append(CSV_HOSTNAME);
+ text.append(delim);
+ }
+
+ String resultString = null;
+ int size = text.length();
+ int delSize = delim.length();
+
+ // Strip off the trailing delimiter
+ if (size >= delSize) {
+ resultString = text.substring(0, size - delSize);
+ } else {
+ resultString = text.toString();
+ }
+ return resultString;
+ }
+
+ // Map header names to set() methods
+ private static final LinkedMap headerLabelMethods = new LinkedMap();
+
+ // These entries must be in the same order as columns are
saved/restored.
+
+ static {
+ headerLabelMethods.put(TIME_STAMP, new
Functor("setTimestamp"));
+ headerLabelMethods.put(CSV_ELAPSED, new
Functor("setTime"));
+ headerLabelMethods.put(LABEL, new Functor("setLabel"));
+ headerLabelMethods.put(RESPONSE_CODE, new
Functor("setCode"));
+ headerLabelMethods.put(RESPONSE_MESSAGE, new
Functor("setMessage"));
+ headerLabelMethods.put(THREAD_NAME, new
Functor("setThreadName"));
+ headerLabelMethods.put(DATA_TYPE, new
Functor("setDataType"));
+ headerLabelMethods.put(SUCCESSFUL, new
Functor("setSuccess"));
+ headerLabelMethods.put(FAILURE_MESSAGE, new
Functor("setAssertionResultsFailureMessage"));
+ headerLabelMethods.put(CSV_BYTES, new Functor("setBytes"));
+ // 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"));
+ headerLabelMethods.put(CSV_URL, new Functor("setUrl"));
+ headerLabelMethods.put(CSV_FILENAME, new Functor("setFileName"));
+ headerLabelMethods.put(CSV_LATENCY, new Functor("setLatency"));
+ headerLabelMethods.put(CSV_ENCODING, new Functor("setEncoding"));
+ // 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"));
+ headerLabelMethods.put(CSV_HOSTNAME, new Functor("setHostname"));
+ }
+
+ /**
+ * Parse a CSV header line
+ * @param headerLine from CSV file
+ * @param filename name of file (for log message only)
+ * @return config corresponding to the header items found or null if
not a header line
+ */
+ public static SampleSaveConfiguration getSampleSaveConfiguration(String
headerLine, String filename){
+ String[] parts =
splitHeader(headerLine,_saveConfig.getDelimiter()); // Try default delimiter
+
+ String delim = null;
+
+ if (parts == null){
+ Perl5Matcher matcher = JMeterUtils.getMatcher();
+ PatternMatcherInput input = new
PatternMatcherInput(headerLine);
+ Pattern pattern = JMeterUtils.getPatternCache()
+ // This assumes the header names are all single words
with no spaces
+ // word followed by 0 or more repeats of (non-word char
+ word)
+ // where the non-word char (\2) is the same
+ // e.g. abc|def|ghi but not abd|def~ghi
+ .getPattern("\\w+((\\W)\\w+)?(\\2\\w+)*", //
$NON-NLS-1$
+ Perl5Compiler.READ_ONLY_MASK);
+ if (matcher.matches(input, pattern)) {
+ delim = matcher.getMatch().group(2);
+ parts = splitHeader(headerLine,delim);// now
validate the result
+ }
+ }
+
+ if (parts == null) {
+ return null; // failed to recognise the header
+ }
+
+ // We know the column names all exist, so create the config
+ SampleSaveConfiguration saveConfig=new
SampleSaveConfiguration(false);
+
+ for(int i=0;i<parts.length;i++){
+ Functor set = (Functor)
headerLabelMethods.get(parts[i]);
+ set.invoke(saveConfig,new Boolean[]{Boolean.TRUE});
+ }
+
+ if (delim != null){
+ log.warn("Default delimiter
'"+_saveConfig.getDelimiter()+"' did not work; using alternate '"+delim+"' for
reading "+filename);
+ saveConfig.setDelimiter(delim);
+ }
+ return saveConfig;
+ }
+
+ private static String[] splitHeader(String headerLine, String delim) {
+ String parts[]=headerLine.split("\\Q"+delim);// $NON-NLS-1$
+ int previous = -1;
+ // Check if the line is a header
+ for(int i=0;i<parts.length;i++){
+ final String label = parts[i];
+ int current = headerLabelMethods.indexOf(label);
+ if (current == -1){
+ return null; // unknown column name
+ }
+ if (current <= previous){
+ log.warn("Column header number "+(i+1)+" name
"+ label + " is out of order.");
+ return null; // out of order
+ }
+ previous = current;
+ }
+ return parts;
+ }
+
+ /**
+ * Method will save aggregate statistics as CSV. For now I put it here.
+ * Not sure if it should go in the newer SaveService instead of here.
+ * if we ever decide to get rid of this class, we'll need to move this
+ * method to the new save service.
+ * @param data
+ * @param writer
+ * @throws IOException
+ */
+ public static void saveCSVStats(Vector data, FileWriter writer) throws
IOException {
+ for (int idx=0; idx < data.size(); idx++) {
+ Vector row = (Vector)data.elementAt(idx);
+ for (int idy=0; idy < row.size(); idy++) {
+ if (idy > 0) {
+ writer.write(","); // $NON-NLS-1$
+ }
+ Object item = row.elementAt(idy);
+ writer.write( String.valueOf(item) );
+ }
+ writer.write(System.getProperty("line.separator")); // $NON-NLS-1$
+ }
+ }
+
+ /**
+ * Convert a result into a string, where the fields of the result are
+ * separated by the default delimiter.
+ *
+ * @param event
+ * the sample event to be converted
+ * @return the separated value representation of the result
+ */
+ public static String resultToDelimitedString(SampleEvent event) {
+ return resultToDelimitedString(event,
event.getResult().getSaveConfig().getDelimiter());
+ }
+
+ /**
+ * Convert a result into a string, where the fields of the result are
+ * separated by a specified String.
+ *
+ * @param event
+ * the sample event to be converted
+ * @param delimiter
+ * the separation string
+ * @return the separated value representation of the result
+ */
+ public static String resultToDelimitedString(SampleEvent event, String
delimiter) {
+ StringBuffer text = new StringBuffer();
+ SampleResult sample = event.getResult();
+ SampleSaveConfiguration saveConfig = sample.getSaveConfig();
+
+ if (saveConfig.saveTimestamp()) {
+ if (saveConfig.printMilliseconds()){
+ text.append(sample.getTimeStamp());
+ text.append(delimiter);
+ } else if (saveConfig.formatter() != null) {
+ String stamp = saveConfig.formatter().format(new
Date(sample.getTimeStamp()));
+ text.append(stamp);
+ text.append(delimiter);
+ }
+ }
+
+ if (saveConfig.saveTime()) {
+ text.append(sample.getTime());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveLabel()) {
+ text.append(sample.getSampleLabel());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveCode()) {
+ text.append(sample.getResponseCode());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveMessage()) {
+ text.append(sample.getResponseMessage());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveThreadName()) {
+ text.append(sample.getThreadName());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveDataType()) {
+ text.append(sample.getDataType());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveSuccess()) {
+ text.append(sample.isSuccessful());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveAssertionResultsFailureMessage()) {
+ String message = null;
+ AssertionResult[] results = sample.getAssertionResults();
+
+ if (results != null) {
+ // Find the first non-null message
+ for (int i = 0; i < results.length; i++){
+ message = results[i].getFailureMessage();
+ if (message != null) break;
+ }
+ }
+
+ if (message != null) {
+ text.append(message);
+ }
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveBytes()) {
+ text.append(sample.getBytes());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveThreadCounts()) {
+ text.append(sample.getGroupThreads());
+ text.append(delimiter);
+ text.append(sample.getAllThreads());
+ text.append(delimiter);
+ }
+ if (saveConfig.saveUrl()) {
+ text.append(sample.getURL());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveFileName()) {
+ text.append(sample.getResultFileName());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveLatency()) {
+ text.append(sample.getLatency());
+ text.append(delimiter);
+ }
+
+ if (saveConfig.saveEncoding()) {
+ text.append(sample.getDataEncoding());
+ text.append(delimiter);
+ }
+
+ 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);
+ }
+
+ if (saveConfig.saveHostname()) {
+ text.append(event.getHostname());
+ text.append(delimiter);
+ }
+
+ String resultString = null;
+ int size = text.length();
+ int delSize = delimiter.length();
+
+ // Strip off the trailing delimiter
+ if (size >= delSize) {
+ resultString = text.substring(0, size - delSize);
+ } else {
+ resultString = text.toString();
+ }
+ return resultString;
+ }
+}
Propchange:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
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=593962&r1=593961&r2=593962&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
Sun Nov 11 13:37:25 2007
@@ -18,56 +18,41 @@
package org.apache.jmeter.save;
-import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import
org.apache.avalon.framework.configuration.DefaultConfigurationSerializer;
-import org.apache.commons.collections.map.LinkedMap;
import org.apache.jmeter.assertions.AssertionResult;
-import org.apache.jmeter.samplers.SampleEvent;
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;
import org.apache.jmeter.testelement.property.MapProperty;
import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.testelement.property.TestElementProperty;
-import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.util.NameUpdater;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.ListedHashTree;
import org.apache.jorphan.logging.LoggingManager;
-import org.apache.jorphan.reflect.Functor;
-import org.apache.jorphan.util.JMeterError;
import org.apache.log.Logger;
-import org.apache.oro.text.regex.Pattern;
-import org.apache.oro.text.regex.PatternMatcherInput;
-import org.apache.oro.text.regex.Perl5Compiler;
-import org.apache.oro.text.regex.Perl5Matcher;
import org.xml.sax.SAXException;
/**
- * This class provides a means for saving/reading test results as CSV files.
- * It also saves/restores the original Avalon XML format (not used by default).
+ * This class saves/restores the original Avalon XML format (not used by
default).
+ * @deprecated to be removed in a future release.
*/
public final class OldSaveService {
private static final Logger log = LoggingManager.getLoggerForClass();
@@ -95,30 +80,6 @@
private static final String TIME = "time"; // $NON-NLS-1$
private static final String TIME_STAMP = "timeStamp"; // $NON-NLS-1$
- // ---------------------------------------------------------------------
- // ADDITIONAL CSV RESULT FILE CONSTANTS AND FIELD NAME CONSTANTS
- // ---------------------------------------------------------------------
-
- private static final String CSV_ELAPSED = "elapsed"; // $NON-NLS-1$
- private static final String CSV_BYTES= "bytes"; // $NON-NLS-1$
- 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$
- private static final String CSV_ENCODING = "Encoding"; // $NON-NLS-1$
- private static final String CSV_HOSTNAME = "Hostname"; // $NON-NLS-1$
-
- // Initial config from properties
- static private final SampleSaveConfiguration _saveConfig =
SampleSaveConfiguration.staticConfig();
-
- // Date format to try if the time format does not parse as milliseconds
- // (this is the suggested value in jmeter.properties)
- private static final String DEFAULT_DATE_FORMAT_STRING = "MM/dd/yy
HH:mm:ss"; // $NON-NLS-1$
- private static final DateFormat DEFAULT_DATE_FORMAT = new
SimpleDateFormat(DEFAULT_DATE_FORMAT_STRING);
-
private static DefaultConfigurationBuilder builder = new
DefaultConfigurationBuilder();
/**
@@ -127,566 +88,6 @@
private OldSaveService() {
}
-
//////////////////////////////////////////////////////////////////////////////
- // Start of CSV methods
-
- /**
- * Make a SampleResult given a delimited string.
- *
- * @param inputLine - line from CSV file
- * @param saveConfig - configuration
- * @param lineNumber - line number for error reporting
- * @return SampleResult or null if header line detected
- *
- * @throws JMeterError
- */
- public static SampleEvent makeResultFromDelimitedString(
- final String inputLine,
- final SampleSaveConfiguration saveConfig, // may be updated
- final long lineNumber) {
-
- SampleResult result = null;
- String hostname = "";// $NON-NLS-1$
- long timeStamp = 0;
- long elapsed = 0;
- /*
- * Bug 40772: replaced StringTokenizer with String.split(), as
the
- * former does not return empty tokens.
- */
- // The \Q prefix is needed to ensure that meta-characters (e.g.
".") work.
- String
parts[]=inputLine.split("\\Q"+saveConfig.getDelimiter());// $NON-NLS-1$
- String text = null;
- String field = null; // Save the name for error reporting
- int i=0;
-
- try {
- if (saveConfig.saveTimestamp()){
- field = TIME_STAMP;
- text = parts[i++];
- if (saveConfig.printMilliseconds()) {
- try {
- timeStamp =
Long.parseLong(text);
- } catch (NumberFormatException e) {//
see if this works
- log.warn(e.toString());
- Date stamp =
DEFAULT_DATE_FORMAT.parse(text);
- timeStamp = stamp.getTime();
- log.warn("Setting date format
to: "+DEFAULT_DATE_FORMAT_STRING);
-
saveConfig.setFormatter(DEFAULT_DATE_FORMAT);
- }
- } else if (saveConfig.formatter() != null) {
- Date stamp =
saveConfig.formatter().parse(text);
- timeStamp = stamp.getTime();
- } else { // can this happen?
- final String msg = "Unknown timestamp
format";
- log.warn(msg);
- throw new JMeterError(msg);
- }
- }
-
- if (saveConfig.saveTime()) {
- field = CSV_ELAPSED;
- text = parts[i++];
- elapsed = Long.parseLong(text);
- }
-
- if (saveConfig.saveSampleCount()) {
- result = new StatisticalSampleResult(timeStamp,
elapsed);
- } else {
- result = new SampleResult(timeStamp, elapsed);
- }
-
- if (saveConfig.saveLabel()) {
- field = LABEL;
- text = parts[i++];
- result.setSampleLabel(text);
- }
- if (saveConfig.saveCode()) {
- field = RESPONSE_CODE;
- text = parts[i++];
- result.setResponseCode(text);
- }
-
- if (saveConfig.saveMessage()) {
- field = RESPONSE_MESSAGE;
- text = parts[i++];
- result.setResponseMessage(text);
- }
-
- if (saveConfig.saveThreadName()) {
- field = THREAD_NAME;
- text = parts[i++];
- result.setThreadName(text);
- }
-
- if (saveConfig.saveDataType()) {
- field = DATA_TYPE;
- text = parts[i++];
- result.setDataType(text);
- }
-
- if (saveConfig.saveSuccess()) {
- field = SUCCESSFUL;
- text = parts[i++];
-
result.setSuccessful(Boolean.valueOf(text).booleanValue());
- }
-
- if (saveConfig.saveAssertionResultsFailureMessage()) {
- i++;
- // TODO - should this be restored?
- }
-
- if (saveConfig.saveBytes()) {
- field = CSV_BYTES;
- text = parts[i++];
- result.setBytes(Integer.parseInt(text));
- }
-
- if (saveConfig.saveThreadCounts()) {
- field = CSV_THREAD_COUNT1;
- text = parts[i++];
- result.setGroupThreads(Integer.parseInt(text));
-
- field = CSV_THREAD_COUNT2;
- text = parts[i++];
- result.setAllThreads(Integer.parseInt(text));
- }
-
- if (saveConfig.saveUrl()) {
- i++;
- // TODO: should this be restored?
- }
-
- if (saveConfig.saveFileName()) {
- field = CSV_FILENAME;
- text = parts[i++];
- result.setResultFileName(text);
- }
- if (saveConfig.saveLatency()) {
- field = CSV_LATENCY;
- text = parts[i++];
- result.setLatency(Long.parseLong(text));
- }
-
- if (saveConfig.saveEncoding()) {
- field = CSV_ENCODING;
- text = parts[i++];
- result.setEncodingAndType(text);
- }
-
- 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));
- }
-
- if (saveConfig.saveHostname()) {
- field = CSV_HOSTNAME;
- hostname = parts[i++];
- }
-
- } catch (NumberFormatException e) {
- log.warn("Error parsing field '" + field + "' at line "
+ lineNumber + " " + e);
- throw new JMeterError(e);
- } catch (ParseException e) {
- log.warn("Error parsing field '" + field + "' at line "
+ lineNumber + " " + e);
- throw new JMeterError(e);
- } catch (ArrayIndexOutOfBoundsException e){
- log.warn("Insufficient columns to parse field '" +
field + "' at line " + lineNumber);
- throw new JMeterError(e);
- }
- return new SampleEvent(result,"",hostname);
- }
-
- /**
- * Generates the field names for the output file
- *
- * @return the field names as a string
- */
- public static String printableFieldNamesToString() {
- return printableFieldNamesToString(_saveConfig);
- }
-
- /**
- * Generates the field names for the output file
- *
- * @return the field names as a string
- */
- public static String
printableFieldNamesToString(SampleSaveConfiguration saveConfig) {
- StringBuffer text = new StringBuffer();
- String delim = saveConfig.getDelimiter();
-
- if (saveConfig.saveTimestamp()) {
- text.append(TIME_STAMP);
- text.append(delim);
- }
-
- if (saveConfig.saveTime()) {
- text.append(CSV_ELAPSED);
- text.append(delim);
- }
-
- if (saveConfig.saveLabel()) {
- text.append(LABEL);
- text.append(delim);
- }
-
- if (saveConfig.saveCode()) {
- text.append(RESPONSE_CODE);
- text.append(delim);
- }
-
- if (saveConfig.saveMessage()) {
- text.append(RESPONSE_MESSAGE);
- text.append(delim);
- }
-
- if (saveConfig.saveThreadName()) {
- text.append(THREAD_NAME);
- text.append(delim);
- }
-
- if (saveConfig.saveDataType()) {
- text.append(DATA_TYPE);
- text.append(delim);
- }
-
- if (saveConfig.saveSuccess()) {
- text.append(SUCCESSFUL);
- text.append(delim);
- }
-
- if (saveConfig.saveAssertionResultsFailureMessage()) {
- text.append(FAILURE_MESSAGE);
- text.append(delim);
- }
-
- if (saveConfig.saveBytes()) {
- text.append(CSV_BYTES);
- text.append(delim);
- }
-
- if (saveConfig.saveThreadCounts()) {
- text.append(CSV_THREAD_COUNT1);
- text.append(delim);
- text.append(CSV_THREAD_COUNT2);
- text.append(delim);
- }
-
- if (saveConfig.saveUrl()) {
- text.append(CSV_URL);
- text.append(delim);
- }
-
- if (saveConfig.saveFileName()) {
- text.append(CSV_FILENAME);
- text.append(delim);
- }
-
- if (saveConfig.saveLatency()) {
- text.append(CSV_LATENCY);
- text.append(delim);
- }
-
- if (saveConfig.saveEncoding()) {
- text.append(CSV_ENCODING);
- text.append(delim);
- }
-
- if (saveConfig.saveSampleCount()) {
- text.append(CSV_SAMPLE_COUNT);
- text.append(delim);
- text.append(CSV_ERROR_COUNT);
- text.append(delim);
- }
-
- if (saveConfig.saveHostname()) {
- text.append(CSV_HOSTNAME);
- text.append(delim);
- }
-
- String resultString = null;
- int size = text.length();
- int delSize = delim.length();
-
- // Strip off the trailing delimiter
- if (size >= delSize) {
- resultString = text.substring(0, size - delSize);
- } else {
- resultString = text.toString();
- }
- return resultString;
- }
-
- // Map header names to set() methods
- private static final LinkedMap headerLabelMethods = new LinkedMap();
-
- // These entries must be in the same order as columns are
saved/restored.
-
- static {
- headerLabelMethods.put(TIME_STAMP, new
Functor("setTimestamp"));
- headerLabelMethods.put(CSV_ELAPSED, new
Functor("setTime"));
- headerLabelMethods.put(LABEL, new Functor("setLabel"));
- headerLabelMethods.put(RESPONSE_CODE, new
Functor("setCode"));
- headerLabelMethods.put(RESPONSE_MESSAGE, new
Functor("setMessage"));
- headerLabelMethods.put(THREAD_NAME, new
Functor("setThreadName"));
- headerLabelMethods.put(DATA_TYPE, new
Functor("setDataType"));
- headerLabelMethods.put(SUCCESSFUL, new
Functor("setSuccess"));
- headerLabelMethods.put(FAILURE_MESSAGE, new
Functor("setAssertionResultsFailureMessage"));
- headerLabelMethods.put(CSV_BYTES, new Functor("setBytes"));
- // 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"));
- headerLabelMethods.put(CSV_URL, new Functor("setUrl"));
- headerLabelMethods.put(CSV_FILENAME, new Functor("setFileName"));
- headerLabelMethods.put(CSV_LATENCY, new Functor("setLatency"));
- headerLabelMethods.put(CSV_ENCODING, new Functor("setEncoding"));
- // 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"));
- headerLabelMethods.put(CSV_HOSTNAME, new Functor("setHostname"));
- }
-
- /**
- * Parse a CSV header line
- * @param headerLine from CSV file
- * @param filename name of file (for log message only)
- * @return config corresponding to the header items found or null if
not a header line
- */
- public static SampleSaveConfiguration getSampleSaveConfiguration(String
headerLine, String filename){
- String[] parts =
splitHeader(headerLine,_saveConfig.getDelimiter()); // Try default delimiter
-
- String delim = null;
-
- if (parts == null){
- Perl5Matcher matcher = JMeterUtils.getMatcher();
- PatternMatcherInput input = new
PatternMatcherInput(headerLine);
- Pattern pattern = JMeterUtils.getPatternCache()
- // This assumes the header names are all single words
with no spaces
- // word followed by 0 or more repeats of (non-word char
+ word)
- // where the non-word char (\2) is the same
- // e.g. abc|def|ghi but not abd|def~ghi
- .getPattern("\\w+((\\W)\\w+)?(\\2\\w+)*", //
$NON-NLS-1$
- Perl5Compiler.READ_ONLY_MASK);
- if (matcher.matches(input, pattern)) {
- delim = matcher.getMatch().group(2);
- parts = splitHeader(headerLine,delim);// now
validate the result
- }
- }
-
- if (parts == null) {
- return null; // failed to recognise the header
- }
-
- // We know the column names all exist, so create the config
- SampleSaveConfiguration saveConfig=new
SampleSaveConfiguration(false);
-
- for(int i=0;i<parts.length;i++){
- Functor set = (Functor)
headerLabelMethods.get(parts[i]);
- set.invoke(saveConfig,new Boolean[]{Boolean.TRUE});
- }
-
- if (delim != null){
- log.warn("Default delimiter
'"+_saveConfig.getDelimiter()+"' did not work; using alternate '"+delim+"' for
reading "+filename);
- saveConfig.setDelimiter(delim);
- }
- return saveConfig;
- }
-
- private static String[] splitHeader(String headerLine, String delim) {
- String parts[]=headerLine.split("\\Q"+delim);// $NON-NLS-1$
- int previous = -1;
- // Check if the line is a header
- for(int i=0;i<parts.length;i++){
- final String label = parts[i];
- int current = headerLabelMethods.indexOf(label);
- if (current == -1){
- return null; // unknown column name
- }
- if (current <= previous){
- log.warn("Column header number "+(i+1)+" name
"+ label + " is out of order.");
- return null; // out of order
- }
- previous = current;
- }
- return parts;
- }
-
- /**
- * Method will save aggregate statistics as CSV. For now I put it here.
- * Not sure if it should go in the newer SaveService instead of here.
- * if we ever decide to get rid of this class, we'll need to move this
- * method to the new save service.
- * @param data
- * @param writer
- * @throws IOException
- */
- public static void saveCSVStats(Vector data, FileWriter writer) throws
IOException {
- for (int idx=0; idx < data.size(); idx++) {
- Vector row = (Vector)data.elementAt(idx);
- for (int idy=0; idy < row.size(); idy++) {
- if (idy > 0) {
- writer.write(","); // $NON-NLS-1$
- }
- Object item = row.elementAt(idy);
- writer.write( String.valueOf(item) );
- }
- writer.write(System.getProperty("line.separator")); // $NON-NLS-1$
- }
- }
-
- /**
- * Convert a result into a string, where the fields of the result are
- * separated by the default delimiter.
- *
- * @param event
- * the sample event to be converted
- * @return the separated value representation of the result
- */
- public static String resultToDelimitedString(SampleEvent event) {
- return resultToDelimitedString(event,
event.getResult().getSaveConfig().getDelimiter());
- }
-
- /**
- * Convert a result into a string, where the fields of the result are
- * separated by a specified String.
- *
- * @param event
- * the sample event to be converted
- * @param delimiter
- * the separation string
- * @return the separated value representation of the result
- */
- public static String resultToDelimitedString(SampleEvent event, String
delimiter) {
- StringBuffer text = new StringBuffer();
- SampleResult sample = event.getResult();
- SampleSaveConfiguration saveConfig = sample.getSaveConfig();
-
- if (saveConfig.saveTimestamp()) {
- if (saveConfig.printMilliseconds()){
- text.append(sample.getTimeStamp());
- text.append(delimiter);
- } else if (saveConfig.formatter() != null) {
- String stamp = saveConfig.formatter().format(new
Date(sample.getTimeStamp()));
- text.append(stamp);
- text.append(delimiter);
- }
- }
-
- if (saveConfig.saveTime()) {
- text.append(sample.getTime());
- text.append(delimiter);
- }
-
- if (saveConfig.saveLabel()) {
- text.append(sample.getSampleLabel());
- text.append(delimiter);
- }
-
- if (saveConfig.saveCode()) {
- text.append(sample.getResponseCode());
- text.append(delimiter);
- }
-
- if (saveConfig.saveMessage()) {
- text.append(sample.getResponseMessage());
- text.append(delimiter);
- }
-
- if (saveConfig.saveThreadName()) {
- text.append(sample.getThreadName());
- text.append(delimiter);
- }
-
- if (saveConfig.saveDataType()) {
- text.append(sample.getDataType());
- text.append(delimiter);
- }
-
- if (saveConfig.saveSuccess()) {
- text.append(sample.isSuccessful());
- text.append(delimiter);
- }
-
- if (saveConfig.saveAssertionResultsFailureMessage()) {
- String message = null;
- AssertionResult[] results = sample.getAssertionResults();
-
- if (results != null) {
- // Find the first non-null message
- for (int i = 0; i < results.length; i++){
- message = results[i].getFailureMessage();
- if (message != null) break;
- }
- }
-
- if (message != null) {
- text.append(message);
- }
- text.append(delimiter);
- }
-
- if (saveConfig.saveBytes()) {
- text.append(sample.getBytes());
- text.append(delimiter);
- }
-
- if (saveConfig.saveThreadCounts()) {
- text.append(sample.getGroupThreads());
- text.append(delimiter);
- text.append(sample.getAllThreads());
- text.append(delimiter);
- }
- if (saveConfig.saveUrl()) {
- text.append(sample.getURL());
- text.append(delimiter);
- }
-
- if (saveConfig.saveFileName()) {
- text.append(sample.getResultFileName());
- text.append(delimiter);
- }
-
- if (saveConfig.saveLatency()) {
- text.append(sample.getLatency());
- text.append(delimiter);
- }
-
- if (saveConfig.saveEncoding()) {
- text.append(sample.getDataEncoding());
- text.append(delimiter);
- }
-
- 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);
- }
-
- if (saveConfig.saveHostname()) {
- text.append(event.getHostname());
- text.append(delimiter);
- }
-
- String resultString = null;
- int size = text.length();
- int delSize = delimiter.length();
-
- // Strip off the trailing delimiter
- if (size >= delSize) {
- resultString = text.substring(0, size - delSize);
- } else {
- resultString = text.toString();
- }
- return resultString;
- }
-
- // End of CSV methods
-
//////////////////////////////////////////////////////////////////////////////////////////
- // Start of Avalon methods
public static void saveSubTree(HashTree subTree, OutputStream writer)
throws IOException {
Configuration config = (Configuration)
getConfigsFromTree(subTree).get(0);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]