package eu.dnetlib.contract.spring.beans;

import java.util.List;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;

import eu.dnetlib.contract.runner.ContractTestRunnerConfiguration;


/**
 * {@link ContractTestRunnerConfiguration} bean definition parser.
 * @author mhorst
 *
 */
public class TestRunnerConfigBeanDefinitionParser extends AbstractContractBeanDefinitionParser {


	public static final String EXEC_DATALIST_ELEMENT_NAME	= "execution-data-list";
	public static final String EXEC_DATALIST_PROP_NAME		= "executionDataList";
	
	public static final String EXEC_RUNNABLE_ELEMENT_NAME	= "execution-runnable";
	public static final String EXEC_RUNNABLE_PROP_NAME		= "executionRunnable";
	
	public static final String BEFORE_DATALIST_ELEMENT_NAME	= "before-data-list";
	public static final String BEFORE_DATALIST_PROP_NAME	= "beforeDataList";
	
	public static final String BEFORE_RUNNABLE_ELEMENT_NAME	= "before-runnable";
	public static final String BEFORE_RUNNABLE_PROP_NAME	= "beforeRunnable";
	
	public static final String AFTER_DATALIST_ELEMENT_NAME	= "after-data-list";
	public static final String AFTER_DATALIST_PROP_NAME		= "afterDataList";
		
	public static final String AFTER_RUNNABLE_ELEMENT_NAME	= "after-runnable";
	public static final String AFTER_RUNNABLE_PROP_NAME		= "afterRunnable";

	/* (non-Javadoc)
	 * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#doParse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, org.springframework.beans.factory.support.BeanDefinitionBuilder)
	 */
	@Override
	protected void doParse(Element element, ParserContext parserContext,
			BeanDefinitionBuilder builder) {
		super.doParse(element, parserContext, builder);
		
//		handles execution-data-list
		Element executionDataListElement = DomUtils.getChildElementByTagName(element,EXEC_DATALIST_ELEMENT_NAME);
		if (executionDataListElement!=null) {
			List<?> list = parserContext.getDelegate().parseListElement((Element) executionDataListElement,
				builder.getBeanDefinition());
			builder.addPropertyValue(EXEC_DATALIST_PROP_NAME, list);
		}
//		handles execution-runnable
		Element executionRunnableElement = DomUtils.getChildElementByTagName(element,EXEC_RUNNABLE_ELEMENT_NAME);
		if (executionRunnableElement!=null) {
			setFirstChildAsProperty(executionRunnableElement, parserContext, builder, EXEC_RUNNABLE_PROP_NAME);
		}
		
//		handles before-data-list
		Element beforeDataListElement = DomUtils.getChildElementByTagName(element,BEFORE_DATALIST_ELEMENT_NAME);
		if (beforeDataListElement!=null) {
			List<?> list = parserContext.getDelegate().parseListElement((Element) beforeDataListElement,
				builder.getBeanDefinition());
			builder.addPropertyValue(BEFORE_DATALIST_PROP_NAME, list);
		}
//		handles before-runnable
		Element beforeRunnableElement = DomUtils.getChildElementByTagName(element,BEFORE_RUNNABLE_ELEMENT_NAME);
		if (beforeRunnableElement!=null) {
			setFirstChildAsProperty(beforeRunnableElement, parserContext, builder, BEFORE_RUNNABLE_PROP_NAME);
		}

//		handles after-data-list
		Element afterDataListElement = DomUtils.getChildElementByTagName(element,AFTER_DATALIST_ELEMENT_NAME);
		if (afterDataListElement!=null) {
			List<?> list = parserContext.getDelegate().parseListElement((Element) afterDataListElement,
				builder.getBeanDefinition());
			builder.addPropertyValue(AFTER_DATALIST_PROP_NAME, list);
		}
//		handles after-runnable
		Element afterRunnableElement = DomUtils.getChildElementByTagName(element,AFTER_RUNNABLE_ELEMENT_NAME);
		if (afterRunnableElement!=null) {
			setFirstChildAsProperty(afterRunnableElement, parserContext, builder, AFTER_RUNNABLE_PROP_NAME);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser#getBeanClass(org.w3c.dom.Element)
	 */
	@SuppressWarnings("unchecked")
	@Override
	protected Class getBeanClass(Element element) {
		return ContractTestRunnerConfiguration.class;
	}

}

