package eu.dnetlib.dlms.jdbc.server;

import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.dnetlib.dlms.jdbc.DataResultsContainer;
import eu.dnetlib.dlms.jdbc.ExecutorContext;
import eu.dnetlib.dlms.jdbc.ast.Statement;
import eu.dnetlib.dlms.jdbc.server.visitors.ParametersChecker;

/**
 * Default implementation for the AbstractDOLExecuter class.
 * <p>
 * Before the statement is executed, parameters' correctness is checked first.
 * </p>
 * before executing the statement.
 * 
 * @author alessia
 * 
 */
public class DOLExecutor extends AbstractDOLExecuter {
	/** logger. */
	private static final Log log = LogFactory.getLog(DOLExecutor.class); // NOPMD by marko on 11/24/08 5:02 PM
	/** check that parameters are set before executing a Statement. */
	private ParametersChecker parametersChecker;
	/** Executor of Statements. */
	private IStatementExecutor stmExecutor;

	/**
	 * {@inheritDoc}
	 * 
	 * @see eu.dnetlib.dlms.jdbc.server.AbstractDOLExecuter#executeImpl(eu.dnetlib.dlms.jdbc.ast.ASTNode)
	 */
	@Override
	protected DataResultsContainer executeImpl(final Statement stm, final ExecutorContext context) throws SQLException {
		try {
			log.debug("Checking parameters...");
			stm.execute(this.parametersChecker, context);
		} catch (final RuntimeException e) {
			throw new SQLException(e);
		}
		log.debug("All Parameters are set.");
		log.info("Executing " + stm);
		final DataResultsContainer result = (DataResultsContainer) stm.execute(this.stmExecutor, context);
		log.info(stm + " executed");
		log.debug("EXECUTE returned: " + result);
		return result;
	}

	/**
	 * No args constructor for Spring.
	 */
	public DOLExecutor() {
		// intentionally blank
	}

	/**
	 * Constructor.
	 * 
	 * @param parametersChecker
	 *            instance used to check that parameters are set before executing a Statement.
	 * @param stmExecutor
	 *            IStatementExecutor for the execution of Statement
	 */
	public DOLExecutor(final ParametersChecker parametersChecker, final IStatementExecutor stmExecutor) {
		super();
		this.parametersChecker = parametersChecker;
		this.stmExecutor = stmExecutor;
	}

	public IStatementExecutor getStmExecutor() {
		return this.stmExecutor;
	}

	public void setStmExecutor(final IStatementExecutor stmExecutor) {
		this.stmExecutor = stmExecutor;
	}

	public void setParametersChecker(final ParametersChecker parametersChecker) {
		this.parametersChecker = parametersChecker;
	}

	public ParametersChecker getParametersChecker() {
		return this.parametersChecker;
	}

}
