1 package com.atlassian.spring.extension.registration;
2
3 import org.springframework.beans.factory.xml.BeanDefinitionParser;
4 import org.springframework.beans.factory.xml.ParserContext;
5 import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
6 import org.springframework.beans.factory.config.BeanDefinition;
7 import org.springframework.beans.factory.config.BeanDefinitionHolder;
8 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
9 import org.w3c.dom.Element;
10 import org.w3c.dom.Node;
11
12 import java.util.List;
13 import java.util.ArrayList;
14
15 public class BeanRegistrationNamespaceHandler implements BeanDefinitionDecorator
16 {
17 private static final String REGISTRATION_BEAN_NAME = "__registration_bean";
18
19
20 public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext)
21 {
22 Element element = (Element)node;
23
24 BeanDefinition registration = createRegistrationIfNecessary(parserContext);
25 List registrations = (List) registration.getPropertyValues().getPropertyValue("registrations").getValue();
26 registrations.add(new KeyValueRegistration(element.getAttribute("target"), element.getAttribute("key"), definition.getBeanName(), element.getAttribute("registrationMethod")));
27 return definition;
28 }
29
30 private BeanDefinition createRegistrationIfNecessary(ParserContext parserContext)
31 {
32 if (!parserContext.getRegistry().containsBeanDefinition(REGISTRATION_BEAN_NAME))
33 {
34 BeanDefinitionBuilder registrationBean = BeanDefinitionBuilder.rootBeanDefinition(BeanRegistration.class);
35 registrationBean.addPropertyValue("registrations", new ArrayList());
36 parserContext.getRegistry().registerBeanDefinition(REGISTRATION_BEAN_NAME, registrationBean.getBeanDefinition());
37 }
38
39 return parserContext.getRegistry().getBeanDefinition(REGISTRATION_BEAN_NAME);
40 }
41 }