1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j;
19
20 import org.apache.log4j.helpers.LogLog;
21 import org.apache.log4j.or.ObjectRenderer;
22 import org.apache.log4j.or.RendererMap;
23 import org.apache.log4j.plugins.Plugin;
24 import org.apache.log4j.plugins.PluginRegistry;
25 import org.apache.log4j.scheduler.Scheduler;
26 import org.apache.log4j.spi.*;
27 import org.apache.log4j.xml.DOMConfigurator;
28 import org.apache.log4j.xml.UnrecognizedElementHandler;
29 import org.w3c.dom.Element;
30
31 import java.util.*;
32
33
34
35
36
37
38
39 public final class LoggerRepositoryExImpl
40 implements LoggerRepositoryEx,
41 RendererSupport,
42 UnrecognizedElementHandler {
43
44
45
46
47 private final LoggerRepository repo;
48
49
50
51
52
53 private LoggerFactory loggerFactory;
54
55
56
57
58 private final RendererSupport rendererSupport;
59
60
61
62
63 private final ArrayList<LoggerRepositoryEventListener> repositoryEventListeners = new ArrayList<>();
64
65
66
67 private final Map<LoggerEventListener, HierarchyEventListenerProxy> loggerEventListeners = new HashMap<>();
68
69
70
71 private String name;
72
73
74
75 private PluginRegistry pluginRegistry;
76
77
78
79 private final Map<String, String> properties = new Hashtable<>();
80
81
82
83 private Scheduler scheduler;
84
85
86
87
88
89 private Map<String, Object> objectMap = new HashMap<>();
90
91
92
93
94
95 private List<ErrorItem> errorList = new Vector<>();
96
97
98
99
100 private boolean pristine = true;
101
102
103
104
105
106
107 public LoggerRepositoryExImpl(final LoggerRepository repository) {
108 super();
109 if (repository == null) {
110 throw new NullPointerException("repository");
111 }
112 repo = repository;
113 if (repository instanceof RendererSupport) {
114 rendererSupport = (RendererSupport) repository;
115 } else {
116 rendererSupport = new RendererSupportImpl();
117 }
118 }
119
120
121
122
123
124
125
126
127 public void addLoggerRepositoryEventListener(
128 final LoggerRepositoryEventListener listener) {
129 synchronized (repositoryEventListeners) {
130 if (repositoryEventListeners.contains(listener)) {
131 LogLog.warn(
132 "Ignoring attempt to add a previously "
133 + "registered LoggerRepositoryEventListener.");
134 } else {
135 repositoryEventListeners.add(listener);
136 }
137 }
138 }
139
140
141
142
143
144
145
146 public void removeLoggerRepositoryEventListener(
147 final LoggerRepositoryEventListener listener) {
148 synchronized (repositoryEventListeners) {
149 if (!repositoryEventListeners.contains(listener)) {
150 LogLog.warn(
151 "Ignoring attempt to remove a "
152 + "non-registered LoggerRepositoryEventListener.");
153 } else {
154 repositoryEventListeners.remove(listener);
155 }
156 }
157 }
158
159
160
161
162
163
164
165 public void addLoggerEventListener(final LoggerEventListener listener) {
166 synchronized (loggerEventListeners) {
167 if (loggerEventListeners.get(listener) != null) {
168 LogLog.warn(
169 "Ignoring attempt to add a previously registerd LoggerEventListener.");
170 } else {
171 HierarchyEventListenerProxy proxy =
172 new HierarchyEventListenerProxy(listener);
173 loggerEventListeners.put(listener, proxy);
174 repo.addHierarchyEventListener(proxy);
175 }
176 }
177 }
178
179
180
181
182
183
184
185
186 public void addHierarchyEventListener(final HierarchyEventListener listener) {
187 repo.addHierarchyEventListener(listener);
188 }
189
190
191
192
193
194
195
196 public void removeLoggerEventListener(final LoggerEventListener listener) {
197 synchronized (loggerEventListeners) {
198 HierarchyEventListenerProxy proxy =
199 loggerEventListeners.get(listener);
200 if (proxy == null) {
201 LogLog.warn(
202 "Ignoring attempt to remove a non-registered LoggerEventListener.");
203 } else {
204 loggerEventListeners.remove(listener);
205 proxy.disable();
206 }
207 }
208 }
209
210
211
212
213
214
215 public void emitNoAppenderWarning(final Category cat) {
216 repo.emitNoAppenderWarning(cat);
217 }
218
219
220
221
222
223
224
225
226 public Logger exists(final String loggerName) {
227 return repo.exists(loggerName);
228 }
229
230
231
232
233
234
235 public String getName() {
236 return name;
237 }
238
239
240
241
242
243
244
245
246 public void setName(final String repoName) {
247 if (name == null) {
248 name = repoName;
249 } else if (!name.equals(repoName)) {
250 throw new IllegalStateException(
251 "Repository [" + name + "] cannot be renamed as [" + repoName + "].");
252 }
253 }
254
255
256
257
258 public Map<String, String> getProperties() {
259 return properties;
260 }
261
262
263
264
265 public String getProperty(final String key) {
266 return properties.get(key);
267 }
268
269
270
271
272
273
274
275
276 public void setProperty(final String key,
277 final String value) {
278 properties.put(key, value);
279 }
280
281
282
283
284
285
286 public void setThreshold(final String levelStr) {
287 repo.setThreshold(levelStr);
288 }
289
290
291
292
293
294
295
296
297 public void setThreshold(final Level l) {
298 repo.setThreshold(l);
299 }
300
301
302
303
304 public PluginRegistry getPluginRegistry() {
305 if (pluginRegistry == null) {
306 pluginRegistry = new PluginRegistry(this);
307 }
308 return pluginRegistry;
309 }
310
311
312
313
314
315
316
317
318
319 public void fireAddAppenderEvent(final Category logger,
320 final Appender appender) {
321 repo.fireAddAppenderEvent(logger, appender);
322 }
323
324
325
326
327
328
329
330
331
332 public void fireRemoveAppenderEvent(final Category logger,
333 final Appender appender) {
334 if (repo instanceof Hierarchy) {
335 ((Hierarchy) repo).fireRemoveAppenderEvent(logger, appender);
336 }
337 }
338
339
340
341
342
343
344
345
346 public void fireLevelChangedEvent(final Logger logger) {
347 }
348
349
350
351
352
353 public void fireConfigurationChangedEvent() {
354 }
355
356
357
358
359
360
361
362
363 public Level getThreshold() {
364 return repo.getThreshold();
365 }
366
367
368
369
370
371
372
373
374
375
376
377
378
379 public Logger getLogger(final String loggerName) {
380 return repo.getLogger(loggerName);
381 }
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396 public Logger getLogger(final String loggerName,
397 final LoggerFactory factory) {
398 return repo.getLogger(loggerName, factory);
399 }
400
401
402
403
404
405
406
407
408
409
410 public Enumeration getCurrentLoggers() {
411 return repo.getCurrentLoggers();
412 }
413
414
415
416
417
418
419 public List<ErrorItem> getErrorList() {
420 return errorList;
421 }
422
423
424
425
426
427
428 public void addErrorItem(final ErrorItem errorItem) {
429 getErrorList().add(errorItem);
430 }
431
432
433
434
435
436
437
438 public Enumeration getCurrentCategories() {
439 return repo.getCurrentCategories();
440 }
441
442
443
444
445
446
447 public RendererMap getRendererMap() {
448 return rendererSupport.getRendererMap();
449 }
450
451
452
453
454
455
456
457 public Logger getRootLogger() {
458 return repo.getRootLogger();
459 }
460
461
462
463
464
465
466
467
468
469
470 public boolean isDisabled(final int level) {
471 return repo.isDisabled(level);
472 }
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489 public void resetConfiguration() {
490 repo.resetConfiguration();
491 }
492
493
494
495
496
497
498
499 public void setRenderer(final Class renderedClass,
500 final ObjectRenderer renderer) {
501 rendererSupport.setRenderer(renderedClass, renderer);
502 }
503
504
505
506
507 public boolean isPristine() {
508 return pristine;
509 }
510
511
512
513
514 public void setPristine(final boolean state) {
515 pristine = state;
516 }
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534 public void shutdown() {
535 repo.shutdown();
536 }
537
538
539
540
541
542
543
544
545 public Scheduler getScheduler() {
546 if (scheduler == null) {
547 scheduler = new Scheduler();
548 scheduler.setDaemon(true);
549 scheduler.start();
550 }
551 return scheduler;
552 }
553
554
555
556
557
558
559
560 public void putObject(final String key,
561 final Object value) {
562 objectMap.put(key, value);
563 }
564
565
566
567
568
569
570
571 public Object getObject(final String key) {
572 return objectMap.get(key);
573 }
574
575
576
577
578
579
580 public void setLoggerFactory(final LoggerFactory factory) {
581 if (factory == null) {
582 throw new NullPointerException();
583 }
584 this.loggerFactory = factory;
585 }
586
587
588
589
590
591
592 public LoggerFactory getLoggerFactory() {
593 return loggerFactory;
594 }
595
596
597
598
599 public boolean parseUnrecognizedElement(
600 final Element element,
601 final Properties props) throws Exception {
602 if ("plugin".equals(element.getNodeName())) {
603 Object instance =
604 DOMConfigurator.parseElement(element, props, Plugin.class);
605 if (instance instanceof Plugin) {
606 Plugin plugin = (Plugin) instance;
607 String pluginName = DOMConfigurator.subst(element.getAttribute("name"), props);
608 if (pluginName.length() > 0) {
609 plugin.setName(pluginName);
610 }
611 getPluginRegistry().addPlugin(plugin);
612 plugin.setLoggerRepository(this);
613
614 LogLog.debug("Pushing plugin on to the object stack.");
615 plugin.activateOptions();
616 return true;
617 }
618 }
619 return false;
620 }
621
622
623
624
625
626
627 private static final class RendererSupportImpl implements RendererSupport {
628
629
630
631 private final RendererMap renderers = new RendererMap();
632
633
634
635
636 public RendererSupportImpl() {
637 super();
638 }
639
640
641
642
643 public RendererMap getRendererMap() {
644 return renderers;
645 }
646
647
648
649
650 public void setRenderer(final Class renderedClass,
651 final ObjectRenderer renderer) {
652 renderers.put(renderedClass, renderer);
653 }
654 }
655
656
657
658
659
660 private static final class HierarchyEventListenerProxy
661 implements HierarchyEventListener {
662
663
664
665 private LoggerEventListener listener;
666
667
668
669
670
671
672 public HierarchyEventListenerProxy(final LoggerEventListener l) {
673 super();
674 if (l == null) {
675 throw new NullPointerException("l");
676 }
677 listener = l;
678 }
679
680
681
682
683 public void addAppenderEvent(final Category cat,
684 final Appender appender) {
685 if (isEnabled() && cat instanceof Logger) {
686 listener.appenderAddedEvent((Logger) cat, appender);
687 }
688 }
689
690
691
692
693 public void removeAppenderEvent(final Category cat,
694 final Appender appender) {
695 if (isEnabled() && cat instanceof Logger) {
696 listener.appenderRemovedEvent((Logger) cat, appender);
697 }
698 }
699
700
701
702
703
704 public synchronized void disable() {
705 listener = null;
706 }
707
708
709
710
711
712
713 private synchronized boolean isEnabled() {
714 return listener != null;
715 }
716 }
717
718 }