1 package com.atlassian.plugin.spring.pluginns;
2
3 import org.springframework.beans.factory.config.BeanDefinition;
4 import org.springframework.beans.factory.config.BeanDefinitionHolder;
5 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
6 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
7 import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
8 import org.springframework.beans.factory.xml.ParserContext;
9 import org.springframework.beans.factory.BeanFactory;
10 import org.springframework.beans.factory.HierarchicalBeanFactory;
11 import org.springframework.jms.*;
12 import org.w3c.dom.Attr;
13 import org.w3c.dom.Node;
14
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.lang.IllegalStateException;
18
19
20
21
22
23
24
25 public class PluginAvailableBeanDefinitionDecorator implements BeanDefinitionDecorator
26 {
27
28 private static final String HOST_COMPONENT_PROVIDER = "hostComponentProvider";
29
30
31
32
33
34
35
36
37 public BeanDefinitionHolder decorate(
38 Node source, BeanDefinitionHolder holder, ParserContext ctx)
39 {
40
41 String isAvailable = ((Attr) source).getValue();
42 if (Boolean.parseBoolean(isAvailable))
43 {
44 BeanDefinition providerDef = registerHostComponent(ctx);
45 List<String> registrations = (List<String>) providerDef.getPropertyValues().getPropertyValue("registrations").getValue();
46 registrations.add(holder.getBeanName());
47 }
48 return holder;
49
50 }
51
52
53
54
55
56
57 private BeanDefinition registerHostComponent(ParserContext ctx)
58 {
59 BeanDefinition providerDef;
60
61 BeanDefinitionRegistry registry = findRegistryContainingComponentProvider(HOST_COMPONENT_PROVIDER, ctx.getRegistry());
62
63 if (registry == null)
64 {
65 BeanDefinitionBuilder providerDefBuilder = BeanDefinitionBuilder.rootBeanDefinition(SpringXmlHostComponentProvider.class);
66 providerDefBuilder.addPropertyValue("registrations", new ArrayList());
67 providerDef = providerDefBuilder.getBeanDefinition();
68 ctx.getRegistry().registerBeanDefinition(HOST_COMPONENT_PROVIDER, providerDef);
69 }
70 else
71 {
72 providerDef = registry.getBeanDefinition(HOST_COMPONENT_PROVIDER);
73
74
75 if (registry != ctx.getRegistry())
76 {
77 registry.removeBeanDefinition(HOST_COMPONENT_PROVIDER);
78 ctx.getRegistry().registerBeanDefinition(HOST_COMPONENT_PROVIDER, providerDef);
79 }
80 }
81
82 if (providerDef == null)
83 {
84 throw new IllegalStateException("Host component provider not found or created. This should never happen.");
85 }
86
87 return providerDef;
88 }
89
90
91
92
93
94
95
96
97
98
99 private BeanDefinitionRegistry findRegistryContainingComponentProvider(String beanName, BeanDefinitionRegistry registry)
100 {
101 if (registry.containsBeanDefinition(beanName))
102 {
103 return registry;
104 }
105 else if (registry instanceof HierarchicalBeanFactory)
106 {
107 HierarchicalBeanFactory hbf = (HierarchicalBeanFactory) registry;
108 if (hbf.getParentBeanFactory() != null && hbf.getParentBeanFactory() instanceof BeanDefinitionRegistry)
109 {
110 return findRegistryContainingComponentProvider(beanName, (BeanDefinitionRegistry) hbf.getParentBeanFactory());
111 }
112 }
113
114 return null;
115 }
116 }