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  }