package eu.dnetlib.contract.spring.beans;

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

import eu.dnetlib.contract.cp.AbstractCheckPoint;


/**
 * Abstract check point bean definition parser.
 * Parses all common {@link AbstractCheckPoint} properties.
 * @author mhorst
 *
 */
public abstract class AbstractCheckPointBeanDefinitionParser extends AbstractContractDefinitionNodeBeanDefinitionParser {

	public static final String CRITICAL_ATTR_NAME 		= "critical";
	public static final String CLASS_NAME_ATTR_NAME 	= "className";
	public static final String METHOD_NAME_ATTR_NAME 	= "methodName";
	public static final String TARGET_REF_ATTR_NAME 	= "targetRef";
	
	/* (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);
		String critical = element.getAttribute(CRITICAL_ATTR_NAME);
		if (isAttributeSet(critical)) {
			builder.addPropertyValue(CRITICAL_ATTR_NAME, Boolean.parseBoolean(critical));
		}
		String className = element.getAttribute(CLASS_NAME_ATTR_NAME);
		if (isAttributeSet(className)) {
			builder.addPropertyValue(CLASS_NAME_ATTR_NAME, className);
		}
		String methodName = element.getAttribute(METHOD_NAME_ATTR_NAME);
		if (isAttributeSet(methodName)) {
			builder.addPropertyValue(METHOD_NAME_ATTR_NAME, methodName);
		}
		String targetRef = element.getAttribute(TARGET_REF_ATTR_NAME);
		if (isAttributeSet(targetRef)) {
			builder.addPropertyReference("target", targetRef);
		}
	}
	
}
