package com.ryantenney.zookeeper.spring.config;

import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.ryantenney.zookeeper.spring.CuratorFrameworkFactoryBean;

import static org.springframework.beans.factory.config.BeanDefinition.ROLE_APPLICATION;

public class CuratorFrameworkBeanDefinitionParser extends AbstractBeanDefinitionParser {

  @Override
  protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
    final BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(CuratorFrameworkFactoryBean.class);
    beanDefBuilder.setRole(ROLE_APPLICATION);
    beanDefBuilder.getRawBeanDefinition().setSource(parserContext.extractSource(element));
    
    beanDefBuilder.addPropertyValue("connectString", element.getAttribute("connect-string"));
    
    Element retryPolicyElement = DomUtils.getChildElementByTagName(element, "retry-policy");
    if (retryPolicyElement != null) {
      Element retryPolicyBeanElement = DomUtils.getChildElements(retryPolicyElement).get(0);
      BeanDefinitionHolder retryPolicy = parserContext.getDelegate().parseBeanDefinitionElement(retryPolicyBeanElement, beanDefBuilder.getBeanDefinition());
      beanDefBuilder.addPropertyValue("retryPolicy", retryPolicy);
    }

    Node namespace = element.getAttributeNode("namespace");
    if (namespace != null) {
      beanDefBuilder.addPropertyValue("namespace", namespace.getNodeValue());
    }

    return beanDefBuilder.getBeanDefinition();
  }

}