/*
 * 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.examples.sampler;

import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;

/**
 * Example Sampler (non-Bean version)
 * 
 * JMeter creates an instance of a sampler class for every occurrence of the
 * element in every thread. [some additional copies may be created before the
 * test run starts]
 * 
 * Thus each sampler is guaranteed to be called by a single thread - there is no
 * need to synchronize access to instance variables.
 * 
 * However, access to class fields must be synchronized.
 * 
 * @version $Revision: 493780 $ $Date: 2007-01-07 17:49:30 +0000 (Sun, 07 Jan 2007) $
 */
public class ExampleSampler extends AbstractSampler {

	private static final Logger log = LoggingManager.getLoggerForClass();

	// The name of the property used to hold our data
	public final static String DATA = "ExampleSampler.data"; //$NON-NLS-1$

	private static int classCount = 0; // keep track of classes created

	// (for instructional purposes only!)

	public ExampleSampler() {
		classCount++;
		trace("ExampleSampler()");
	}

	/*
	 * (non-Javadoc) Performs the sample, and returns the result
	 * 
	 * @see org.apache.jmeter.samplers.Sampler#sample(org.apache.jmeter.samplers.Entry)
	 */
	public SampleResult sample(Entry e) {
		trace("sample()");
		SampleResult res = new SampleResult();
		boolean isOK = false; // Did sample succeed?
		String data = getData(); // Sampler data
		String response = null;

		res.setSampleLabel(getTitle());
		/*
		 * Perform the sampling
		 */
		res.sampleStart(); // Start timing
		try {

			// Do something here ...

			response = Thread.currentThread().getName();

			/*
			 * Set up the sample result details
			 */
			res.setSamplerData(data);
			res.setResponseData(response.getBytes());
			res.setDataType(SampleResult.TEXT);

			res.setResponseCodeOK();
			res.setResponseMessage("OK");// $NON-NLS-1$
			isOK = true;
		} catch (Exception ex) {
			log.debug("", ex);
			res.setResponseCode("500");// $NON-NLS-1$
			res.setResponseMessage(ex.toString());
		}
		res.sampleEnd(); // End timimg

		res.setSuccessful(isOK);

		return res;
	}

	/**
	 * @return a string for the sampleResult Title
	 */
	private String getTitle() {
		return this.getName();
	}

	/**
	 * @return the data for the sample
	 */
	public String getData() {
		return getPropertyAsString(DATA);
	}

	/*
	 * Helper method
	 */
	private void trace(String s) {
		String tl = getTitle();
		String tn = Thread.currentThread().getName();
		String th = this.toString();
		log.debug(tn + " (" + classCount + ") " + tl + " " + s + " " + th);
	}
}