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.ExceptionCheckPoint;


/**
 * {@link ExceptionCheckPoint} bean definition parser.
 * @author mhorst
 *
 */
public class ExceptionCheckPointBeanDefinitionParser extends AbstractCheckPointBeanDefinitionParser {

	public static final String EXC_CLASS_NAME_ATTR_NAME		= "exceptionClassName";
	public static final String EXC_MESSAGE_ATTR_NAME		= "exceptionMessage";
	public static final String EXC_DERIVED_FROM_ATTR_NAME	= "exceptionDerivedFrom";
	

	/* (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 exception class name
		String excClassName = element.getAttribute(EXC_CLASS_NAME_ATTR_NAME);
		if (isAttributeSet(excClassName)) {
			builder.addPropertyValue(EXC_CLASS_NAME_ATTR_NAME, excClassName);
		}
		
//		handles exception message
		String excMessage = element.getAttribute(EXC_MESSAGE_ATTR_NAME);
		if (isAttributeSet(excMessage)) {
			builder.addPropertyValue(EXC_MESSAGE_ATTR_NAME, excMessage);
		}
		
//		handles exception derived from class
		String excDerivedFrom = element.getAttribute(EXC_DERIVED_FROM_ATTR_NAME);
		if (isAttributeSet(excDerivedFrom)) {
			builder.addPropertyValue(EXC_DERIVED_FROM_ATTR_NAME, excDerivedFrom);
		}
	}

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