package eu.dnetlib.contract.runner;

import java.util.ArrayList;
import java.util.List;

/**
 * ContractTestRunner configuration object.
 * Encapsulates all entry parameters required by ContractTestRunner.
 * @author mhorst
 *
 */
public class ContractTestRunnerConfiguration {
	
	/**
	 * Execution data object list.
	 */
	private  List<InvokerData> executionDataList;
	
	/**
	 * Execution runnable object. Can be used alternatively to executionData object especially 
	 * when more complex or multithreaded operations should be tested.
	 */
	private IRunnable executionRunnable;
	
	/**
	 * Before data objects. Contains invocation details of method(s) run before executing tested method.
	 */
	private List<InvokerData> beforeDataList;
	
	/**
	 * After data objects. Contains invocation details of method(s) run after executing tested method.
	 */
	private List<InvokerData> afterDataList;
	
	/**
	 * Before runnable object. Its run() method will be run before executing tested method.
	 */
	private IRunnable beforeRunnable;
	
	/**
	 * After runnable object. Its run() method will be run after executing tested method.
	 */
	private IRunnable afterRunnable;
	
	/**
	 * Default constructor.
	 */
	public ContractTestRunnerConfiguration() {
//		for spring conf purposes only
	}
	
	/**
	 * Constructor with executionData parameter.
	 * @param executionData
	 */
	public ContractTestRunnerConfiguration(InvokerData executionData) {
		if (executionData!=null) {
			this.executionDataList = new ArrayList<InvokerData>(1);
			this.executionDataList.add(executionData);
		}
	}
	
	/**
	 * Constructor with executionDataList as parameter.
	 * @param executionData
	 */
	public ContractTestRunnerConfiguration(List<InvokerData> executionDataList) {
		this.executionDataList = executionDataList;
	}

	/**
	 * Returns execution data.
	 * @return execution data
	 */
	public List<InvokerData> getExecutionDataList() {
		return executionDataList;
	}

	/**
	 * Sets execution data.
	 * @param executionData
	 */
	public void setExecutionDataList(List<InvokerData> executionDataList) {
		this.executionDataList = executionDataList;
	}

	/**
	 * Returns execution runnable object.
	 * @return execution runnable object
	 */
	public IRunnable getExecutionRunnable() {
		return executionRunnable;
	}

	/**
	 * Sets execution runnable object.
	 * @param executionRunnable
	 */
	public void setExecutionRunnable(IRunnable executionRunnable) {
		this.executionRunnable = executionRunnable;
	}
	
	/**
	 * Returns before data objects list.
	 * @return before data objects list
	 */
	public List<InvokerData> getBeforeDataList() {
		return beforeDataList;
	}

	/**
	 * Sets before data objects list.
	 * @param beforeDataList
	 */
	public void setBeforeDataList(List<InvokerData> beforeDataList) {
		this.beforeDataList = beforeDataList;
	}

	/**
	 * Returns after data objects list.
	 * @return after data objects list
	 */
	public List<InvokerData> getAfterDataList() {
		return afterDataList;
	}

	/**
	 * Sets after data objects list.
	 * @param afterDataList
	 */
	public void setAfterDataList(List<InvokerData> afterDataList) {
		this.afterDataList = afterDataList;
	}

	/**
	 * Returns before runnable object.
	 * @return before runnable object
	 */
	public IRunnable getBeforeRunnable() {
		return beforeRunnable;
	}

	/**
	 * Sets before runnable object.
	 * @param beforeRunnable
	 */
	public void setBeforeRunnable(IRunnable beforeRunnable) {
		this.beforeRunnable = beforeRunnable;
	}

	/**
	 * Returns after runnable object.
	 * @return after runnable object
	 */
	public IRunnable getAfterRunnable() {
		return afterRunnable;
	}

	/**
	 * Sets after runnable object.
	 * @param afterRunnable
	 */
	public void setAfterRunnable(IRunnable afterRunnable) {
		this.afterRunnable = afterRunnable;
	}

}
