1 package ch.qos.logback.classic.model.processor;
2
3 import static ch.qos.logback.core.joran.JoranConstants.INHERITED;
4 import static ch.qos.logback.core.joran.JoranConstants.NULL;
5
6 import ch.qos.logback.classic.Level;
7 import ch.qos.logback.classic.Logger;
8 import ch.qos.logback.classic.model.LevelModel;
9 import ch.qos.logback.core.Context;
10 import ch.qos.logback.core.model.Model;
11 import ch.qos.logback.core.model.processor.ModelHandlerBase;
12 import ch.qos.logback.core.model.processor.ModelHandlerException;
13 import ch.qos.logback.core.model.processor.ModelInterpretationContext;
14 import ch.qos.logback.core.spi.ErrorCodes;
15
16 public class LevelModelHandler extends ModelHandlerBase {
17
18 boolean inError = false;
19
20 public LevelModelHandler(Context context) {
21 super(context);
22 }
23
24 static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
25 return new LevelModelHandler(context);
26 }
27
28 @Override
29 protected Class<? extends LevelModel> getSupportedModelClass() {
30 return LevelModel.class;
31 }
32
33 @Override
34 public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
35
36 Object o = mic.peekObject();
37
38 if (!(o instanceof Logger)) {
39 inError = true;
40 addError("For element <level>, could not find a logger at the top of execution stack.");
41 return;
42 }
43
44 Logger l = (Logger) o;
45 String loggerName = l.getName();
46
47 LevelModel levelModel = (LevelModel) model;
48 String levelStr = mic.subst(levelModel.getValue());
49 if (INHERITED.equalsIgnoreCase(levelStr) || NULL.equalsIgnoreCase(levelStr)) {
50 if(Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(loggerName))
51 addError(ErrorCodes.ROOT_LEVEL_CANNOT_BE_SET_TO_NULL);
52 else
53 l.setLevel(null);
54 } else {
55 l.setLevel(Level.toLevel(levelStr, Level.DEBUG));
56 }
57
58 addInfo(loggerName + " level set to " + l.getLevel());
59
60 }
61
62 }