1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.eclipse.jetty.spring;
21
22 import java.net.URL;
23 import java.nio.charset.StandardCharsets;
24 import java.util.Arrays;
25 import java.util.Map;
26 import java.util.ServiceLoader;
27
28 import org.eclipse.jetty.util.log.Log;
29 import org.eclipse.jetty.util.log.Logger;
30 import org.eclipse.jetty.xml.ConfigurationProcessor;
31 import org.eclipse.jetty.xml.ConfigurationProcessorFactory;
32 import org.eclipse.jetty.xml.XmlConfiguration;
33 import org.eclipse.jetty.xml.XmlParser;
34 import org.springframework.beans.BeanWrapper;
35 import org.springframework.beans.PropertyValues;
36 import org.springframework.beans.factory.config.BeanDefinition;
37 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
38 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
39 import org.springframework.core.io.ByteArrayResource;
40 import org.springframework.core.io.Resource;
41 import org.springframework.core.io.UrlResource;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public class SpringConfigurationProcessor implements ConfigurationProcessor
64 {
65 private static final Logger LOG = Log.getLogger(SpringConfigurationProcessor.class);
66
67 private XmlConfiguration _configuration;
68 private DefaultListableBeanFactory _beanFactory;
69 private String _main;
70
71 @Override
72 public void init(URL url, XmlParser.Node config, XmlConfiguration configuration)
73 {
74 try
75 {
76 _configuration = configuration;
77
78 Resource resource = url != null
79 ? new UrlResource(url)
80 : new ByteArrayResource(("" +
81 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
82 "<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \"http://www.springframework.org/dtd/spring-beans.dtd\">" +
83 config).getBytes(StandardCharsets.UTF_8));
84
85 _beanFactory = new DefaultListableBeanFactory()
86 {
87 @Override
88 protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
89 {
90 _configuration.initializeDefaults(bw.getWrappedInstance());
91 super.applyPropertyValues(beanName, mbd, bw, pvs);
92 }
93 };
94
95 new XmlBeanDefinitionReader(_beanFactory).loadBeanDefinitions(resource);
96 }
97 catch (Exception e)
98 {
99 throw new RuntimeException(e);
100 }
101 }
102
103 @Override
104 public Object configure(Object obj) throws Exception
105 {
106 doConfigure();
107 return _beanFactory.configureBean(obj, _main);
108 }
109
110
111
112
113
114
115 @Override
116 public Object configure() throws Exception
117 {
118 doConfigure();
119 return _beanFactory.getBean(_main);
120 }
121
122 private void doConfigure()
123 {
124 _beanFactory.registerSingleton("properties", _configuration.getProperties());
125
126
127 for (String bean : _beanFactory.getBeanDefinitionNames())
128 {
129 LOG.debug("{} - {}", bean, Arrays.asList(_beanFactory.getAliases(bean)));
130 String[] aliases = _beanFactory.getAliases(bean);
131 if ("Main".equals(bean) || aliases != null && Arrays.asList(aliases).contains("Main"))
132 {
133 _main = bean;
134 break;
135 }
136 }
137 if (_main == null)
138 _main = _beanFactory.getBeanDefinitionNames()[0];
139
140
141 Map<String, Object> idMap = _configuration.getIdMap();
142 LOG.debug("idMap {}", idMap);
143 for (String id : idMap.keySet())
144 {
145 LOG.debug("register {}", id);
146 _beanFactory.registerSingleton(id, idMap.get(id));
147 }
148
149
150 for (String id : idMap.keySet())
151 {
152 if (_beanFactory.containsBeanDefinition(id))
153 {
154 LOG.debug("reconfigure {}", id);
155 _beanFactory.configureBean(idMap.get(id), id);
156 }
157 }
158
159
160 for (String id : _beanFactory.getSingletonNames())
161 idMap.put(id, _beanFactory.getBean(id));
162 }
163 }