⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csvsaveservice.java

📁 测试工具
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -