View Javadoc
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  }