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 }