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());
}
}
}