📄 csvsaveservice.java
字号:
}
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -