1 package ch.qos.logback.core.model.processor;
2
3 import java.util.Map;
4
5 import ch.qos.logback.core.Appender;
6 import ch.qos.logback.core.Context;
7 import ch.qos.logback.core.joran.JoranConstants;
8 import ch.qos.logback.core.model.AppenderRefModel;
9 import ch.qos.logback.core.model.Model;
10 import ch.qos.logback.core.spi.AppenderAttachable;
11
12 public class AppenderRefModelHandler extends ModelHandlerBase {
13 boolean inError = false;
14
15 public AppenderRefModelHandler(Context context) {
16 super(context);
17 }
18
19 static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
20 return new AppenderRefModelHandler(context);
21 }
22
23 @Override
24 protected Class<? extends AppenderRefModel> getSupportedModelClass() {
25 return AppenderRefModel.class;
26 }
27
28 @Override
29 public void handle(ModelInterpretationContext interpContext, Model model) throws ModelHandlerException {
30
31 Object o = interpContext.peekObject();
32
33 if (!(o instanceof AppenderAttachable)) {
34 inError = true;
35 String errMsg = "Could not find an AppenderAttachable at the top of execution stack. Near "
36 + model.idString();
37 addError(errMsg);
38 return;
39 }
40
41 AppenderRefModel appenderRefModel = (AppenderRefModel) model;
42 AppenderAttachable<?> appenderAttachable = (AppenderAttachable<?>) o;
43
44 attachRefencedAppenders(interpContext, appenderRefModel, appenderAttachable);
45
46 }
47
48 @SuppressWarnings({ "unchecked", "rawtypes" })
49 void attachRefencedAppenders(ModelInterpretationContext mic, AppenderRefModel appenderRefModel,
50 AppenderAttachable<?> appenderAttachable) {
51 String appenderName = mic.subst(appenderRefModel.getRef());
52
53 Map<String, Appender> appenderBag = (Map<String, Appender>) mic.getObjectMap().get(JoranConstants.APPENDER_BAG);
54
55 Appender appender = appenderBag.get(appenderName);
56 if (appender == null) {
57 addError("Failed to find appender named [" + appenderName + "]");
58 } else {
59 addInfo("Attaching appender named [" + appenderName + "] to " + appenderAttachable);
60 appenderAttachable.addAppender(appender);
61 }
62
63 }
64 }