1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package ch.elca.el4j.core.context;
19
20 import java.io.BufferedReader;
21 import java.io.IOException;
22 import java.io.InputStreamReader;
23 import java.util.Collection;
24
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
28 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
29 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
30 import org.springframework.context.ApplicationContext;
31 import org.springframework.context.support.AbstractXmlApplicationContext;
32 import org.springframework.core.Ordered;
33 import org.springframework.core.io.Resource;
34 import org.springframework.core.io.support.ResourcePatternResolver;
35 import org.springframework.util.Assert;
36 import org.springframework.util.StringUtils;
37
38 import ch.elca.el4j.core.io.support.ListResourcePatternResolverDecorator;
39 import ch.elca.el4j.core.io.support.ManifestOrderedConfigLocationProvider;
40 import ch.elca.el4j.util.codingsupport.annotations.FindBugsSuppressWarnings;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 public class ModuleApplicationContext extends AbstractXmlApplicationContext
100 implements RefreshableModuleApplicationContext {
101
102
103
104 public static final String EL4J_DEBUGGING_LOGGER = "el4j.debugging";
105
106
107
108
109
110 protected static final Logger s_el4jLogger
111 = LoggerFactory.getLogger(EL4J_DEBUGGING_LOGGER);
112
113
114
115
116 private final String[] m_inclusiveConfigLocations;
117
118
119
120
121 private final String[] m_exclusiveConfigLocations;
122
123
124
125
126 private final String[] m_configLocations;
127
128
129
130
131 private final boolean m_allowBeanDefinitionOverriding;
132
133
134
135
136 private final boolean m_mergeWithOuterResources;
137
138
139
140
141
142
143
144 private final boolean m_mostSpecificResourceLast;
145
146
147
148
149 private final boolean m_mostSpecificBeanDefinitionCounts;
150
151
152
153
154 private ListResourcePatternResolverDecorator m_patternResolver;
155
156
157
158
159 private boolean m_refreshed = false;
160
161
162
163
164 private final Object m_refreshedMonitor = new Object();
165
166
167
168
169 private final ModuleApplicationContextCreationListener m_creationListener;
170
171
172
173
174
175 public ModuleApplicationContext(String inclusiveConfigLocation,
176 boolean allowBeanDefinitionOverriding) {
177 this(new String[] {inclusiveConfigLocation},
178 allowBeanDefinitionOverriding);
179 }
180
181
182
183
184
185 public ModuleApplicationContext(String[] inclusiveConfigLocations,
186 boolean allowBeanDefinitionOverriding) {
187 this(inclusiveConfigLocations, new String[] {},
188 allowBeanDefinitionOverriding, null);
189 }
190
191
192
193
194
195 public ModuleApplicationContext(String inclusiveConfigLocation,
196 String exclusiveConfigLocation,
197 boolean allowBeanDefinitionOverriding) {
198 this(new String[] {inclusiveConfigLocation},
199 new String[] {exclusiveConfigLocation},
200 allowBeanDefinitionOverriding, null);
201 }
202
203
204
205
206
207 public ModuleApplicationContext(String[] inclusiveConfigLocations,
208 String exclusiveConfigLocation,
209 boolean allowBeanDefinitionOverriding) {
210 this(inclusiveConfigLocations,
211 new String[] {exclusiveConfigLocation},
212 allowBeanDefinitionOverriding, null);
213 }
214
215
216
217
218
219 public ModuleApplicationContext(String inclusiveConfigLocation,
220 String[] exclusiveConfigLocations,
221 boolean allowBeanDefinitionOverriding) {
222 this(new String[] {inclusiveConfigLocation},
223 exclusiveConfigLocations, allowBeanDefinitionOverriding, null);
224 }
225
226
227
228
229
230
231
232
233
234 public ModuleApplicationContext(String[] inclusiveConfigLocations,
235 String[] exclusiveConfigLocations,
236 boolean allowBeanDefinitionOverriding, ApplicationContext parent) {
237 this(inclusiveConfigLocations, exclusiveConfigLocations,
238 allowBeanDefinitionOverriding, parent, true);
239 }
240
241
242
243
244
245
246
247
248
249
250
251
252 public ModuleApplicationContext(String[] inclusiveConfigLocations,
253 String[] exclusiveConfigLocations,
254 boolean allowBeanDefinitionOverriding, ApplicationContext parent,
255 boolean mergeWithOuterResources) {
256 this(inclusiveConfigLocations, exclusiveConfigLocations,
257 allowBeanDefinitionOverriding, parent, mergeWithOuterResources,
258 false, true, null);
259 }
260
261
262
263
264
265
266
267
268 public ModuleApplicationContext(String[] inclusiveConfigLocations,
269 String[] exclusiveConfigLocations,
270 boolean allowBeanDefinitionOverriding, ApplicationContext parent,
271 boolean mergeWithOuterResources,
272 boolean mostSpecificResourceLast,
273 boolean mostSpecificBeanDefinitionCounts) {
274 this(inclusiveConfigLocations, exclusiveConfigLocations,
275 allowBeanDefinitionOverriding, parent, mergeWithOuterResources,
276 mostSpecificResourceLast, mostSpecificBeanDefinitionCounts, null);
277 }
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310 @FindBugsSuppressWarnings(value = "UR_UNINIT_READ",
311 justification = "Pattern resolver initialized by a super class.")
312 public ModuleApplicationContext(String[] inclusiveConfigLocations,
313 String[] exclusiveConfigLocations,
314 boolean allowBeanDefinitionOverriding, ApplicationContext parent,
315 boolean mergeWithOuterResources,
316 boolean mostSpecificResourceLast,
317 boolean mostSpecificBeanDefinitionCounts,
318 ModuleApplicationContextCreationListener creationListener) {
319 super(parent);
320 m_inclusiveConfigLocations = inclusiveConfigLocations;
321 m_exclusiveConfigLocations = exclusiveConfigLocations;
322 m_allowBeanDefinitionOverriding = allowBeanDefinitionOverriding;
323 m_mergeWithOuterResources = mergeWithOuterResources;
324 m_mostSpecificResourceLast = mostSpecificResourceLast;
325 m_mostSpecificBeanDefinitionCounts = mostSpecificBeanDefinitionCounts;
326 m_creationListener = creationListener;
327
328
329
330
331
332 Assert.notNull(m_patternResolver);
333 Assert.isInstanceOf(ListResourcePatternResolverDecorator.class,
334 m_patternResolver);
335 ListResourcePatternResolverDecorator listResourcePatternResolver
336 = (ListResourcePatternResolverDecorator) m_patternResolver;
337 listResourcePatternResolver.setMostSpecificResourceLast(
338 isMostSpecificResourceLast());
339 listResourcePatternResolver.setMergeWithOuterResources(
340 isMergeWithOuterResources());
341
342 ModuleApplicationContextUtils utils
343 = new ModuleApplicationContextUtils(this);
344 utils.setReverseConfigLocationResourceArray(
345 isMostSpecificResourceLast()
346 != isMostSpecificBeanDefinitionCounts());
347
348 m_configLocations = utils.calculateInputFiles(inclusiveConfigLocations,
349 exclusiveConfigLocations, allowBeanDefinitionOverriding);
350
351 additionalLoggingOutput(allowBeanDefinitionOverriding,
352 mergeWithOuterResources, mostSpecificResourceLast,
353 mostSpecificBeanDefinitionCounts);
354
355 refresh();
356 }
357
358
359
360
361
362
363
364 public ModuleApplicationContext(
365 ModuleApplicationContextConfiguration config) {
366 this(config.getInclusiveConfigLocations(),
367 config.getExclusiveConfigLocations(),
368 config.isAllowBeanDefinitionOverriding(),
369 config.getParent(),
370 config.isMergeWithOuterResources(),
371 config.isMostSpecificResourceLast(),
372 config.isMostSpecificBeanDefinitionCounts(),
373 config.getModuleApplicationContextCreationListener());
374 }
375
376
377
378
379 protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
380 if (m_creationListener != null) {
381 m_creationListener.postProcessBeanFactory(beanFactory);
382 }
383 }
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406 private void additionalLoggingOutput(boolean allowBeanDefinitionOverriding,
407 boolean mergeWithOuterResources, boolean mostSpecificResourceLast,
408 boolean mostSpecificBeanDefinitionCounts) {
409
410 s_el4jLogger.info(
411 "Starting up ModuleApplicationContext. configLocations :"
412 + StringUtils.arrayToDelimitedString(m_configLocations, ", "));
413 if (s_el4jLogger.isDebugEnabled()) {
414 s_el4jLogger.debug("inclusiveLocation:"
415 + StringUtils.arrayToDelimitedString(
416 m_inclusiveConfigLocations, ", "));
417 s_el4jLogger.debug("exclusiveLocation:"
418 + StringUtils.arrayToDelimitedString(
419 m_exclusiveConfigLocations, ", "));
420 s_el4jLogger.debug("allowBeanDefinitionOverriding:"
421 + allowBeanDefinitionOverriding);
422 s_el4jLogger.debug("mergeWithOuterResources:"
423 + mergeWithOuterResources);
424 s_el4jLogger.debug("mostSpecificResourceLast:"
425 + mostSpecificResourceLast);
426 s_el4jLogger.debug("mostSpecificBeanDefinitionCounts:"
427 + mostSpecificBeanDefinitionCounts);
428
429
430 if (m_configLocations == null) {
431 return;
432 }
433 for (String configLocation : m_configLocations) {
434 Resource res = getResource(configLocation);
435 BufferedReader reader = null;
436 try {
437 reader = new BufferedReader(new InputStreamReader(res
438 .getInputStream()));
439 StringBuffer buf = new StringBuffer();
440 while (reader.ready()) {
441 buf.append(reader.readLine());
442 buf.append("\n");
443 }
444 s_el4jLogger.debug("Content of " + configLocation + " : "
445 + buf.toString() + "\n---");
446 } catch (IOException e) {
447
448 s_el4jLogger.debug(
449 "Error during printing of config location "
450 + configLocation, e);
451 } finally {
452 if (reader != null) {
453 try {
454 reader.close();
455 } catch (IOException e) {
456 s_el4jLogger.debug(
457 "Error during printing of config location "
458 + configLocation, e);
459 }
460 }
461 }
462 }
463 }
464 }
465
466
467
468
469 @Override
470 public String[] getConfigLocations() {
471 return m_configLocations;
472 }
473
474
475
476
477 public String[] getExclusiveConfigLocations() {
478 return m_exclusiveConfigLocations;
479 }
480
481
482
483
484 public String[] getInclusiveConfigLocations() {
485 return m_inclusiveConfigLocations;
486 }
487
488
489
490
491 public boolean isAllowBeanDefinitionOverriding() {
492 return m_allowBeanDefinitionOverriding;
493 }
494
495
496
497
498 public boolean isMergeWithOuterResources() {
499 return m_mergeWithOuterResources;
500 }
501
502
503
504
505 public boolean isMostSpecificResourceLast() {
506 return m_mostSpecificResourceLast;
507 }
508
509
510
511
512 public boolean isMostSpecificBeanDefinitionCounts() {
513 return m_mostSpecificBeanDefinitionCounts;
514 }
515
516
517
518
519 @Override
520 public Resource getResource(String location) {
521 return m_patternResolver.getResource(location);
522 }
523
524
525
526
527 @Override
528 public Resource[] getResources(String locationPattern) throws IOException {
529 return m_patternResolver.getResources(locationPattern);
530 }
531
532
533
534
535
536
537
538
539
540 @Override
541 protected DefaultListableBeanFactory createBeanFactory() {
542 DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory(
543 getInternalParentBeanFactory());
544 dlbf.setAllowBeanDefinitionOverriding(
545 isAllowBeanDefinitionOverriding());
546 return dlbf;
547 }
548
549
550
551
552 @Override
553 protected ResourcePatternResolver getResourcePatternResolver() {
554 ListResourcePatternResolverDecorator patternResolver
555 = new ListResourcePatternResolverDecorator(
556 new ManifestOrderedConfigLocationProvider());
557 patternResolver.setMostSpecificResourceLast(
558 isMostSpecificResourceLast());
559 patternResolver.setMergeWithOuterResources(
560 isMergeWithOuterResources());
561 m_patternResolver = patternResolver;
562 return m_patternResolver;
563 }
564
565
566
567
568
569
570
571
572 protected void invokeBeanFactoryPostProcessors(
573 ConfigurableListableBeanFactory beanFactory) {
574 ModuleApplicationContextUtils ctxUtil
575 = new ModuleApplicationContextUtils(this);
576 ctxUtil.invokeBeanFactoryPostProcessorsStrictlyOrdered(beanFactory);
577 }
578
579
580
581 @Override
582 protected void prepareRefresh() {
583 synchronized (m_refreshedMonitor) {
584 m_refreshed = false;
585 }
586
587 super.prepareRefresh();
588 }
589
590
591
592
593
594
595 @SuppressWarnings("unchecked")
596 @Override
597 protected void finishRefresh() {
598 synchronized (m_refreshedMonitor) {
599 m_refreshed = true;
600 }
601
602 Collection<ModuleApplicationListener> listeners = getBeansOfType(
603 ModuleApplicationListener.class, true, false).values();
604 for (ModuleApplicationListener listener : listeners) {
605 listener.onContextRefreshed();
606 }
607 super.finishRefresh();
608
609 if (m_creationListener != null) {
610 m_creationListener.finishRefresh(this);
611 }
612 }
613
614
615 public boolean isRefreshed() {
616 synchronized (m_refreshedMonitor) {
617 return m_refreshed;
618 }
619 }
620 }