001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.jmeter.samplers;
020:
021: import java.io.Serializable;
022:
023: /**
024: * Aggregates sample results for use by the Statistical remote batch mode.
025: * Samples are aggregated by the key defined by getKey().
026: * TODO: merge error count into parent class?
027: */
028: public class StatisticalSampleResult extends SampleResult implements
029: Serializable {
030:
031: private static final long serialVersionUID = 24L;
032:
033: private int errorCount;
034:
035: public StatisticalSampleResult() {// May be called by XStream
036: }
037:
038: /**
039: * Allow OldSaveService to generate a suitable result when sample/error counts have been saved.
040: *
041: * @deprecated Needs to be replaced when multiple sample results are sorted out
042: *
043: * @param stamp
044: * @param elapsed
045: */
046: public StatisticalSampleResult(long stamp, long elapsed) {
047: super (stamp, elapsed);
048: }
049:
050: public StatisticalSampleResult(SampleResult res) {
051: // Copy data that is shared between samples (i.e. the key items):
052: setSampleLabel(res.getSampleLabel());
053: // Nothing else can be saved, as the samples may come from any thread
054:
055: setSuccessful(true); // Assume result is OK
056: setSampleCount(0); // because we add the sample count in later
057: }
058:
059: public void add(SampleResult res) {
060: // Add Sample Counter
061: setSampleCount(getSampleCount() + res.getSampleCount());
062:
063: setBytes(getBytes() + res.getBytes());
064:
065: // Add Error Counter
066: if (!res.isSuccessful()) {
067: errorCount++;
068: this .setSuccessful(false);
069: }
070:
071: // Set start/end times
072: if (getStartTime() == 0) { // Bug 40954 - ensure start time gets started!
073: this .setStartTime(res.getStartTime());
074: } else {
075: this .setStartTime(Math.min(getStartTime(), res
076: .getStartTime()));
077: }
078: this .setEndTime(Math.max(getEndTime(), res.getEndTime()));
079:
080: setLatency(getLatency() + res.getLatency());
081:
082: }
083:
084: public long getTime() {
085: return getEndTime() - getStartTime() - this .getIdleTime();
086: }
087:
088: public long getTimeStamp() {
089: return getEndTime();
090: }
091:
092: public int getErrorCount() {// Overrides SampleResult
093: return errorCount;
094: }
095:
096: public void setErrorCount(int e) {// for reading CSV files
097: errorCount = e;
098: }
099:
100: /**
101: * Generates the key to be used for aggregating samples as follows:<br/>
102: * <code>sampleLabel</code> "-" <code>threadGroup</code>
103: *
104: * N.B. the key should agree with the fixed items that are saved in the sample.
105: *
106: * @param event sample event whose key is to be calculated
107: * @return the key to use for aggregating samples
108: */
109: public static String getKey(SampleEvent event) {
110: StringBuffer sb = new StringBuffer(80);
111: sb.append(event.getResult().getSampleLabel()).append("-")
112: .append(event.getThreadGroup());
113: return sb.toString();
114: }
115: }
|