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 String appenderName = mic.subst(appenderModel.getName());
51
52 if (!mic.hasDependers(appenderName)) {
53 addWarn("Appender named [" + appenderName + "] not referenced. Skipping further processing.");
54 skipped = true;
55 appenderModel.markAsSkipped();
56 return;
57 }
58
59 addInfo("Processing appender named [" + appenderName + "]");
60
61 String originalClassName = appenderModel.getClassName();
62 String className = mic.getImport(originalClassName);
63
64 try {
65 addInfo("About to instantiate appender of type [" + className + "]");
66
67 appender = (Appender<E>) OptionHelper.instantiateByClassName(className, ch.qos.logback.core.Appender.class,
68 context);
69 appender.setContext(context);
70 appender.setName(appenderName);
71 mic.pushObject(appender);
72 } catch (Exception oops) {
73 inError = true;
74 addError("Could not create an Appender of type [" + className + "].", oops);
75 throw new ModelHandlerException(oops);
76 }
77 }
78
79 public void postHandle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
80 if (inError || skipped) {
81 return;
82 }
83 if (appender instanceof LifeCycle) {
84 ((LifeCycle) appender).start();
85 }
86 mic.markStartOfNamedDependee(appender.getName());
87
88 Object o = mic.peekObject();
89
90 @SuppressWarnings("unchecked")
91 Map<String, Appender<E>> appenderBag = (Map<String, Appender<E>>) mic.getObjectMap()
92 .get(JoranConstants.APPENDER_BAG);
93 appenderBag.put(appender.getName(), appender);
94
95 if (o != appender) {
96 addWarn("The object at the of the stack is not the appender named [" + appender.getName()
97 + "] pushed earlier.");
98 } else {
99 mic.popObject();
100 }
101
102 }
103
104 }