1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.springframework.osgi.context.support;
19
20 import java.io.IOException;
21
22 import org.osgi.framework.BundleContext;
23 import org.springframework.beans.BeansException;
24 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
25 import org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver;
26 import org.springframework.beans.factory.xml.DelegatingEntityResolver;
27 import org.springframework.beans.factory.xml.NamespaceHandlerResolver;
28 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
29 import org.springframework.context.ApplicationContext;
30 import org.springframework.osgi.io.OsgiBundleResource;
31 import org.springframework.osgi.util.OsgiStringUtils;
32 import org.springframework.util.Assert;
33 import org.xml.sax.EntityResolver;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class OsgiBundleXmlApplicationContext extends AbstractDelegatedExecutionApplicationContext {
61
62
63 public static final String DEFAULT_CONFIG_LOCATION = OsgiBundleResource.BUNDLE_URL_PREFIX
64 + "/META-INF/spring/*.xml";
65
66
67
68
69
70
71
72
73 public OsgiBundleXmlApplicationContext() {
74 this((String[]) null);
75 }
76
77
78
79
80
81
82
83 public OsgiBundleXmlApplicationContext(ApplicationContext parent) {
84 this(null, parent);
85 }
86
87
88
89
90
91
92
93 public OsgiBundleXmlApplicationContext(String[] configLocations) {
94 this(configLocations, null);
95 }
96
97
98
99
100
101
102
103
104 public OsgiBundleXmlApplicationContext(String[] configLocations, ApplicationContext parent) {
105 super(parent);
106 setConfigLocations(configLocations);
107 }
108
109
110
111
112
113
114
115 protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
116
117 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
118
119
120
121 beanDefinitionReader.setResourceLoader(this);
122
123 NamespaceHandlerResolver nsResolver = createNamespaceHandlerResolver(getBundleContext(), getClassLoader());
124 EntityResolver enResolver = createEntityResolver(getBundleContext(), getClassLoader());
125
126 beanDefinitionReader.setEntityResolver(enResolver);
127 beanDefinitionReader.setNamespaceHandlerResolver(nsResolver);
128
129
130
131 initBeanDefinitionReader(beanDefinitionReader);
132 loadBeanDefinitions(beanDefinitionReader);
133 }
134
135
136
137
138
139
140 protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
141 }
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162 protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
163 String[] configLocations = getConfigLocations();
164 if (configLocations != null) {
165 for (int i = 0; i < configLocations.length; i++) {
166 reader.loadBeanDefinitions(configLocations[i]);
167 }
168 }
169 }
170
171
172
173
174
175
176
177
178
179
180
181
182 protected String[] getDefaultConfigLocations() {
183 return new String[] { DEFAULT_CONFIG_LOCATION };
184 }
185
186
187
188
189
190
191
192
193
194
195
196
197
198 private NamespaceHandlerResolver createNamespaceHandlerResolver(BundleContext bundleContext,
199 ClassLoader bundleClassLoader) {
200 Assert.notNull(bundleContext, "bundleContext is required");
201
202
203 NamespaceHandlerResolver localNamespaceResolver = new DefaultNamespaceHandlerResolver(bundleClassLoader);
204
205
206 NamespaceHandlerResolver osgiServiceNamespaceResolver = lookupNamespaceHandlerResolver(bundleContext,
207 localNamespaceResolver);
208
209 DelegatedNamespaceHandlerResolver delegate = new DelegatedNamespaceHandlerResolver();
210 delegate.addNamespaceHandler(localNamespaceResolver, "LocalNamespaceResolver for bundle "
211 + OsgiStringUtils.nullSafeNameAndSymName(bundleContext.getBundle()));
212 delegate.addNamespaceHandler(osgiServiceNamespaceResolver, "OSGi Service resolver");
213
214 return delegate;
215 }
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 private EntityResolver createEntityResolver(BundleContext bundleContext, ClassLoader bundleClassLoader) {
231 Assert.notNull(bundleContext, "bundleContext is required");
232
233 EntityResolver localEntityResolver = new DelegatingEntityResolver(bundleClassLoader);
234
235 EntityResolver osgiServiceEntityResolver = lookupEntityResolver(bundleContext, localEntityResolver);
236
237 DelegatedEntityResolver delegate = new DelegatedEntityResolver();
238 delegate.addEntityResolver(localEntityResolver, "LocalEntityResolver for bundle "
239 + OsgiStringUtils.nullSafeNameAndSymName(bundleContext.getBundle()));
240
241
242 delegate.addEntityResolver(osgiServiceEntityResolver, "OSGi Service resolver");
243
244 return delegate;
245 }
246
247 private NamespaceHandlerResolver lookupNamespaceHandlerResolver(BundleContext bundleContext, Object fallbackObject) {
248 return (NamespaceHandlerResolver) TrackingUtil.getService(new Class[] { NamespaceHandlerResolver.class }, null,
249 NamespaceHandlerResolver.class.getClassLoader(), bundleContext, fallbackObject);
250 }
251
252 private EntityResolver lookupEntityResolver(BundleContext bundleContext, Object fallbackObject) {
253 return (EntityResolver) TrackingUtil.getService(new Class[] { EntityResolver.class }, null,
254 EntityResolver.class.getClassLoader(), bundleContext, fallbackObject);
255 }
256
257 public String[] getConfigLocations() {
258 return super.getConfigLocations();
259 }
260 }