blob: 6e35f30742d0b1fe67d48b50887534c99393f62b [file] [log] [blame]
/*
* 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.samplers;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.rmi.RemoteException;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* The standard remote sample reporting should be more friendly to the main purpose of
* remote testing - which is scalability. To increase scalability, this class strips out the
* response data before sending.
*
*
*/
public class DataStrippingSampleSender extends AbstractSampleSender implements Serializable {
private static final long serialVersionUID = -5556040298982085715L;
private static final Logger log = LoggingManager.getLoggerForClass();
private final RemoteSampleListener listener;
private final SampleSender decoratedSender;
/**
* @deprecated only for use by test code
*/
@Deprecated
public DataStrippingSampleSender(){
log.warn("Constructor only intended for use in testing"); // $NON-NLS-1$
listener = null;
decoratedSender = null;
}
DataStrippingSampleSender(RemoteSampleListener listener) {
this.listener = listener;
decoratedSender = null;
log.info("Using DataStrippingSampleSender for this run");
}
DataStrippingSampleSender(SampleSender decorate)
{
this.decoratedSender = decorate;
this.listener = null;
log.info("Using DataStrippingSampleSender for this run");
}
@Override
public void testEnded(String host) {
log.info("Test Ended on " + host);
if(decoratedSender != null) {
decoratedSender.testEnded(host);
}
}
@Override
public void sampleOccurred(SampleEvent event) {
//Strip the response data before writing, but only for a successful request.
SampleResult result = event.getResult();
if(result.isSuccessful()) {
// Compute bytes before stripping
stripResponse(result);
// see Bug 57449
for (SampleResult subResult : result.getSubResults()) {
stripResponse(subResult);
}
}
if(decoratedSender == null)
{
try {
listener.sampleOccurred(event);
} catch (RemoteException e) {
log.error("Error sending sample result over network ",e);
}
}
else
{
decoratedSender.sampleOccurred(event);
}
}
/**
* Strip response but fill in bytes field.
* @param result {@link SampleResult}
*/
private void stripResponse(SampleResult result) {
result.setBytes(result.getBytes());
result.setResponseData(SampleResult.EMPTY_BA);
}
/**
* Processed by the RMI server code; acts as testStarted().
*
* @return this
* @throws ObjectStreamException
* never
*/
private Object readResolve() throws ObjectStreamException{
log.info("Using DataStrippingSampleSender for this run");
return this;
}
}