ConfigurationBeanDefenitionParser.java

package com.tradecloud.infrastructure.configuration;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Allows us to add spring bean definitions inside each client configuration
 * file.
 */
public final class ConfigurationBeanDefenitionParser extends AbstractBeanDefinitionParser {

    @Override
    protected AbstractBeanDefinition parseInternal(final Element element, final ParserContext parserContext) {
        BeanDefinitionParserDelegate delegate = parserContext.getDelegate();
        BeanDefinitionRegistry registry = parserContext.getRegistry();
        Element beansElement = DomUtils.getChildElementByTagName(element, "beans");
        if (beansElement != null) {
            // multi-tenant config contains spring bean definitions.
            NodeList beanDefinitions = beansElement.getChildNodes();
            for (int x = 0; x < beanDefinitions.getLength(); x++) {
                Node item = beanDefinitions.item(x);
                if (item.getNodeType() == Node.ELEMENT_NODE) {
                    Element beanElement = (Element) item;
                    BeanDefinitionHolder beanDefinitionHolder = null;
                    if (delegate.isDefaultNamespace(beanElement)) {
                        beanDefinitionHolder = delegate.parseBeanDefinitionElement(beanElement);
                        if (registry.containsBeanDefinition(beanDefinitionHolder.getBeanName())) {
                            throw new IllegalStateException(String.format(
                                    "Multi-tanant configuration contains " + "bean definitions with same id:%s", beanDefinitionHolder.getBeanName()));
                        }
                        registerBeanDefinition(beanDefinitionHolder, registry);
                    } else {
                        BeanDefinition beanDefinition = delegate.parseCustomElement(beanElement);
                        // String beanName = super.resolveId(beanElement,
                        // (AbstractBeanDefinition) beanDefinition,
                        // parserContext);
                        // beanDefinitionHolder = new BeanDefinitionHolder(
                        // beanDefinition, beanName);
                    }

                }
            }

        }
        return null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected boolean shouldGenerateIdAsFallback() {
        return true;
    }

    /**
     * Maps configuration namespace
     * (http://www.tradecloud.com/schema/configuration) to the
     * {@link ConfigurationBeanDefenitionParser}.
     */
    public static final class ConfigurationNamespaceHandler extends NamespaceHandlerSupport {

        /**
         * {@inheritDoc}
         */
        @Override
        public void init() {
            registerBeanDefinitionParser("configuration", new ConfigurationBeanDefenitionParser());
        }
    }

}