1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.core.model.processor;
15
16 import java.util.Map;
17
18 import ch.qos.logback.core.Appender;
19 import ch.qos.logback.core.Context;
20 import ch.qos.logback.core.joran.JoranConstants;
21 import ch.qos.logback.core.model.AppenderModel;
22 import ch.qos.logback.core.model.Model;
23 import ch.qos.logback.core.spi.AppenderAttachable;
24 import ch.qos.logback.core.spi.LifeCycle;
25 import ch.qos.logback.core.util.OptionHelper;
26
27 public class AppenderModelHandler<E> extends ModelHandlerBase {
28 Appender<E> appender;
29 private boolean inError = false;
30 private boolean skipped = false;
31 AppenderAttachable<E> appenderAttachable;
32
33 public AppenderModelHandler(Context context) {
34 super(context);
35 }
36
37 @SuppressWarnings("rawtypes")
38 static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext mic) {
39 return new AppenderModelHandler(context);
40 }
41
42 @Override
43 @SuppressWarnings("unchecked")
44 public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
45 this.appender = null;
46 this.inError = false;
47
48 AppenderModel appenderModel = (AppenderModel) model;
49
50
51 String appenderName = appenderModel.getName();
52
53 if (!mic.hasDependers(appenderName)) {
54 addWarn("Appender named [" + appenderName + "] not referenced. Skipping further processing.");
55 skipped = true;
56 appenderModel.markAsSkipped();
57 return;
58 }
59
60 addInfo("Processing appender named [" + appenderName + "]");
61
62 String originalClassName = appenderModel.getClassName();
63 String className = mic.getImport(originalClassName);
64
65 try {
66 addInfo("About to instantiate appender of type [" + className + "]");
67
68 appender = (Appender<E>) OptionHelper.instantiateByClassName(className, ch.qos.logback.core.Appender.class,
69 context);
70 appender.setContext(context);
71 appender.setName(appenderName);
72 mic.pushObject(appender);
73 } catch (Exception oops) {
74 inError = true;
75 addError("Could not create an Appender of type [" + className + "].", oops);
76 throw new ModelHandlerException(oops);
77 }
78 }
79
80 public void postHandle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
81 if (inError || skipped) {
82 return;
83 }
84 if (appender instanceof LifeCycle) {
85 ((LifeCycle) appender).start();
86 }
87 mic.markStartOfNamedDependee(appender.getName());
88
89 Object o = mic.peekObject();
90
91 @SuppressWarnings("unchecked")
92 Map<String, Appender<E>> appenderBag = (Map<String, Appender<E>>) mic.getObjectMap()
93 .get(JoranConstants.APPENDER_BAG);
94 appenderBag.put(appender.getName(), appender);
95
96 if (o != appender) {
97 addWarn("The object at the of the stack is not the appender named [" + appender.getName()
98 + "] pushed earlier.");
99 } else {
100 mic.popObject();
101 }
102
103 }
104
105 }