View Javadoc
1   package ch.qos.logback.core.model.processor;
2   
3   import static ch.qos.logback.core.joran.action.Action.CLASS_ATTRIBUTE;
4   
5   import java.util.Map;
6   
7   import ch.qos.logback.core.Context;
8   import ch.qos.logback.core.CoreConstants;
9   import ch.qos.logback.core.boolex.EventEvaluator;
10  import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
11  import ch.qos.logback.core.model.EventEvaluatorModel;
12  import ch.qos.logback.core.model.Model;
13  import ch.qos.logback.core.spi.LifeCycle;
14  import ch.qos.logback.core.util.OptionHelper;
15  
16  public class EventEvaluatorModelHandler extends ModelHandlerBase {
17  
18      EventEvaluator<?> evaluator;
19      boolean inError = false;
20  
21      public EventEvaluatorModelHandler(Context context) {
22          super(context);
23      }
24  
25      static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
26          return new EventEvaluatorModelHandler(context);
27      }
28  
29      @Override
30      protected Class<EventEvaluatorModel> getSupportedModelClass() {
31          return EventEvaluatorModel.class;
32      }
33  
34      @Override
35      public void handle(ModelInterpretationContext intercon, Model model) throws ModelHandlerException {
36          EventEvaluatorModel eem = (EventEvaluatorModel) model;
37  
38          String className = eem.getClassName();
39          if (OptionHelper.isNullOrEmptyOrAllSpaces(className)) {
40              String defaultClassName = defaultClassName(intercon, eem);
41              if (OptionHelper.isNullOrEmptyOrAllSpaces(defaultClassName)) {
42                  inError = true;
43                  addError("Mandatory \"" + CLASS_ATTRIBUTE + "\" attribute missing for <evaluator>");
44                  addError("No default classname could be found.");
45                  return;
46              } else {
47                  addInfo("Assuming default evaluator class [" + defaultClassName + "]");
48                  className = defaultClassName;
49              }
50          } else {
51              className = intercon.getImport(className);
52          }
53  
54          String evaluatorName = intercon.subst(eem.getName());
55          try {
56              evaluator = (EventEvaluator<?>) OptionHelper.instantiateByClassName(className,
57                      ch.qos.logback.core.boolex.EventEvaluator.class, context);
58              evaluator.setContext(this.context);
59              evaluator.setName(evaluatorName);
60              intercon.pushObject(evaluator);
61  
62          } catch (Exception oops) {
63              inError = true;
64              addError("Could not create evaluator of type " + className + "].", oops);
65          }
66  
67      }
68  
69      private String defaultClassName(ModelInterpretationContext mic, EventEvaluatorModel model) {
70          DefaultNestedComponentRegistry registry = mic.getDefaultNestedComponentRegistry();
71          return registry.findDefaultComponentTypeByTag(model.getTag());
72      }
73  
74      @Override
75      public void postHandle(ModelInterpretationContext intercon, Model model) throws ModelHandlerException {
76          if (inError) {
77              return;
78          }
79  
80          if (evaluator instanceof LifeCycle) {
81              ((LifeCycle) evaluator).start();
82              addInfo("Starting evaluator named [" + evaluator.getName() + "]");
83          }
84  
85          Object o = intercon.peekObject();
86  
87          if (o != evaluator) {
88              addWarn("The object on the top the of the stack is not the evaluator pushed earlier.");
89          } else {
90              intercon.popObject();
91  
92              try {
93                  @SuppressWarnings("unchecked")
94                  Map<String, EventEvaluator<?>> evaluatorMap = (Map<String, EventEvaluator<?>>) context
95                          .getObject(CoreConstants.EVALUATOR_MAP);
96                  if (evaluatorMap == null) {
97                      addError("Could not find EvaluatorMap");
98                  } else {
99                      evaluatorMap.put(evaluator.getName(), evaluator);
100                 }
101             } catch (Exception ex) {
102                 addError("Could not set evaluator named [" + evaluator + "].", ex);
103             }
104         }
105     }
106 
107 }