package eu.dnetlib.contract.ctx;

import java.util.HashMap;
import java.util.Map;

import eu.dnetlib.contract.node.EvaluationResult;
import eu.dnetlib.contract.node.IContractDefinitionNode;
import eu.dnetlib.contract.node.cursor.IContractDefinitionNodeCursor;
import eu.dnetlib.contract.runner.IRunnable;
import eu.dnetlib.contract.runner.RunnerResultContext;


/**
 * GlobalContractObject shared for whole contract evaluation process.
 * Collects {@link EvaluationResult} objects for all processed check points.
 * @author mhorst
 *
 */
public class GlobalContractContext {
	
	/**
	 * CheckPoint validation flag.
	 * Required for preventing contract validator module from validating 
	 * events fired at service startup or shutdown.
	 * Should be set to true just before running validated method.
	 */
	private boolean performCheckPointValidation = false;
	
	/**
	 * Contract definition node cursor.
	 */
	private IContractDefinitionNodeCursor cursor = null;
	
	/**
	 * Contract failure if any.
	 */
	private Throwable failure;
	
	/**
	 * Result context containing results returned by tested method, 
	 * 'before' and 'after' modules methods.
	 */
	private RunnerResultContext resultContext;
	
	/**
	 * Auxilary context.
	 * Can be used by {@link IRunnable} 'before' and 'after' modules.
	 */
	private Map<Object, Object> auxContext = new HashMap<Object, Object>();
	
	
	/**
	 * Default constructor.
	 */
	public GlobalContractContext() {
		this.resultContext = new RunnerResultContext();
	}


	/**
	 * Returns contract failure.
	 * @return contract failure
	 */
	public Throwable getFailure() {
		return failure;
	}

	/**
	 * Sets contract failure.
	 * @param failure
	 */
	public void setFailure(Throwable failure) {
		this.failure = failure;
	}

	/**
	 * Returns CheckPoint validation flag.
	 * @return CheckPoint validation flag
	 */
	public boolean isPerformCheckPointValidation() {
		return performCheckPointValidation;
	}

	/**
	 * Sets CheckPoint validation flag.
	 * @param performCheckPointValidation
	 */
	public void setPerformCheckPointValidation(boolean performCheckPointValidation) {
		this.performCheckPointValidation = performCheckPointValidation;
	}

	/**
	 * Returns result context.
	 * @return result context
	 */
	public RunnerResultContext getResultContext() {
		return resultContext;
	}
	
	/**
	 * Returns auxilary context.
	 * @return auxilary context
	 */
	public Map<Object, Object> getAuxContext() {
		return auxContext;
	}

	/**
	 * Sets auxilary context.
	 * @param auxContext
	 */
	public void setAuxContext(Map<Object, Object> auxContext) {
		this.auxContext = auxContext;
	}

	/**
	 * Returns {@link IContractDefinitionNode} cursor.
	 * @return IContractDefinitionNode cursor
	 */
	public IContractDefinitionNodeCursor getCursor() {
		return cursor;
	}

	/**
	 * Sets {@link IContractDefinitionNode} cursor.
	 * @param cursor
	 */
	public void setCursor(IContractDefinitionNodeCursor cursor) {
		this.cursor = cursor;
	}
}
