content: package com.ctrip.framework.apollo.spring.config;
  
  import org.springframework.beans.factory.support.BeanDefinitionBuilder;
  import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
  import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
  import org.springframework.core.Ordered;
  import org.w3c.dom.Element;
  
  import com.ctrip.framework.apollo.core.ConfigConsts;
  import com.google.common.base.Splitter;
  import com.google.common.base.Strings;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  public class NamespaceHandler extends NamespaceHandlerSupport {
    private static final Splitter NAMESPACE_SPLITTER = Splitter.on(",").omitEmptyStrings().trimResults();
  
    @Override
    public void init() {
      registerBeanDefinitionParser("config", new BeanParser());
    }
  
    static class BeanParser extends AbstractSingleBeanDefinitionParser {
      @Override
      protected Class<?> getBeanClass(Element element) {
        return ConfigPropertySourcesProcessor.class;
      }
  
      @Override
      protected boolean shouldGenerateId() {
        return true;
      }
  
      @Override
      protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String namespaces = element.getAttribute("namespaces");
        //default to application
        if (Strings.isNullOrEmpty(namespaces)) {
          namespaces = ConfigConsts.NAMESPACE_APPLICATION;
        }
  
        int order = Ordered.LOWEST_PRECEDENCE;
        String orderAttribute = element.getAttribute("order");
  
        if (!Strings.isNullOrEmpty(orderAttribute)) {
          try {
            order = Integer.parseInt(orderAttribute);
          } catch (Throwable ex) {
            throw new IllegalArgumentException(
                String.format("Invalid order: %s for namespaces: %s", orderAttribute, namespaces));
          }
        }
        PropertySourcesProcessor.addNamespaces(NAMESPACE_SPLITTER.splitToList(namespaces), order);
      }
    }
  }
  