1 package com.atlassian.plugin.spring.pluginns;
2
3 import static com.atlassian.plugin.spring.pluginns.SpringXmlHostComponentProvider.HOST_COMPONENT_PROVIDER;
4 import org.springframework.beans.factory.config.BeanDefinition;
5 import org.springframework.beans.factory.config.BeanDefinitionHolder;
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.w3c.dom.Node;
10
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15
16
17
18
19 public class PluginInterfaceBeanDefinitionDecorator implements BeanDefinitionDecorator
20 {
21
22
23
24
25
26
27
28 public BeanDefinitionHolder decorate(
29 Node source, BeanDefinitionHolder holder, ParserContext ctx)
30 {
31
32 String inf = source.getTextContent();
33 if (inf != null)
34 {
35 inf = inf.trim();
36 }
37
38 BeanDefinitionRegistry registry = ctx.getRegistry();
39 BeanDefinition providerDef = registry.getBeanDefinition(HOST_COMPONENT_PROVIDER);
40 List<String> interfaces = loadBeanInterfaces(providerDef, holder.getBeanName());
41 interfaces.add(inf);
42 return holder;
43 }
44
45
46
47
48
49
50
51
52 private List<String> loadBeanInterfaces(BeanDefinition providerDef, String beanName)
53 {
54 Map<String, List<String>> interfaces = loadInterfaceMap(providerDef);
55 if (!interfaces.containsKey(beanName))
56 {
57 interfaces.put(beanName, new ArrayList<String>());
58 }
59 return interfaces.get(beanName);
60 }
61
62
63
64
65
66
67 private Map<String, List<String>> loadInterfaceMap(BeanDefinition providerDef)
68 {
69 Map<String,List<String>> interfaces;
70 if (providerDef.getPropertyValues().contains("interfaces"))
71 {
72 interfaces = (Map<String,List<String>>) providerDef.getPropertyValues().getPropertyValue("interfaces").getValue();
73 }
74 else
75 {
76 interfaces = new HashMap<String,List<String>>();
77 providerDef.getPropertyValues().addPropertyValue("interfaces", interfaces);
78 }
79 return interfaces;
80 }
81 }