View Javadoc
1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.classic.joran;
15  
16  import ch.qos.logback.classic.joran.action.ConfigurationAction;
17  import ch.qos.logback.classic.joran.action.ConsolePluginAction;
18  import ch.qos.logback.classic.joran.action.ContextNameAction;
19  import ch.qos.logback.classic.joran.action.InsertFromJNDIAction;
20  import ch.qos.logback.classic.joran.action.LevelAction;
21  import ch.qos.logback.classic.joran.action.LoggerAction;
22  import ch.qos.logback.classic.joran.action.LoggerContextListenerAction;
23  import ch.qos.logback.classic.joran.action.ReceiverAction;
24  import ch.qos.logback.classic.joran.action.RootLoggerAction;
25  import ch.qos.logback.classic.model.ConfigurationModel;
26  import ch.qos.logback.classic.model.ContextNameModel;
27  import ch.qos.logback.classic.model.LevelModel;
28  import ch.qos.logback.classic.model.LoggerContextListenerModel;
29  import ch.qos.logback.classic.model.LoggerModel;
30  import ch.qos.logback.classic.model.RootLoggerModel;
31  import ch.qos.logback.classic.model.processor.ConfigurationModelHandler;
32  import ch.qos.logback.classic.model.processor.ContextNameModelHandler;
33  import ch.qos.logback.classic.model.processor.LevelModelHandler;
34  import ch.qos.logback.classic.model.processor.LogbackClassicDefaultNestedComponentRules;
35  import ch.qos.logback.classic.model.processor.LoggerContextListenerModelHandler;
36  import ch.qos.logback.classic.model.processor.LoggerModelHandler;
37  import ch.qos.logback.classic.model.processor.RootLoggerModelHandler;
38  import ch.qos.logback.classic.spi.ILoggingEvent;
39  import ch.qos.logback.classic.spi.PlatformInfo;
40  import ch.qos.logback.core.joran.JoranConfiguratorBase;
41  import ch.qos.logback.core.joran.action.AppenderRefAction;
42  import ch.qos.logback.core.joran.action.IncludeAction;
43  import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
44  import ch.qos.logback.core.joran.spi.ElementSelector;
45  import ch.qos.logback.core.joran.spi.RuleStore;
46  import ch.qos.logback.core.model.AppenderModel;
47  import ch.qos.logback.core.model.AppenderRefModel;
48  import ch.qos.logback.core.model.processor.AppenderModelHandler;
49  import ch.qos.logback.core.model.processor.AppenderRefDependencyAnalyser;
50  import ch.qos.logback.core.model.processor.AppenderRefModelHandler;
51  import ch.qos.logback.core.model.processor.DefaultProcessor;
52  import ch.qos.logback.core.model.processor.RefContainerDependencyAnalyser;
53  
54  /**
55   * JoranConfigurator class adds rules specific to logback-classic.
56   *
57   * @author Ceki Gülcü
58   */
59  public class JoranConfigurator extends JoranConfiguratorBase<ILoggingEvent> {
60  
61      @Override
62      public void addElementSelectorAndActionAssociations(RuleStore rs) {
63          // add parent rules
64          super.addElementSelectorAndActionAssociations(rs);
65  
66          rs.addRule(new ElementSelector("configuration"), () -> new ConfigurationAction());
67  
68          rs.addRule(new ElementSelector("configuration/contextName"), () -> new ContextNameAction());
69          rs.addRule(new ElementSelector("configuration/contextListener"), () -> new LoggerContextListenerAction());
70          rs.addRule(new ElementSelector("configuration/insertFromJNDI"), () -> new InsertFromJNDIAction());
71  
72          rs.addRule(new ElementSelector("configuration/logger"), () -> new LoggerAction());
73          rs.addRule(new ElementSelector("configuration/logger/level"), () -> new LevelAction());
74  
75          rs.addRule(new ElementSelector("configuration/root"), () -> new RootLoggerAction());
76          rs.addRule(new ElementSelector("configuration/root/level"), () -> new LevelAction());
77          rs.addRule(new ElementSelector("configuration/logger/appender-ref"), () -> new AppenderRefAction());
78          rs.addRule(new ElementSelector("configuration/root/appender-ref"), () -> new AppenderRefAction());
79  
80          rs.addRule(new ElementSelector("configuration/include"), () -> new IncludeAction());
81  
82          rs.addRule(new ElementSelector("configuration/consolePlugin"), () -> new ConsolePluginAction());
83  
84          rs.addRule(new ElementSelector("configuration/receiver"), () -> new ReceiverAction());
85  
86      }
87  
88      @Override
89      protected void addDefaultNestedComponentRegistryRules(DefaultNestedComponentRegistry registry) {
90          LogbackClassicDefaultNestedComponentRules.addDefaultNestedComponentRegistryRules(registry);
91      }
92  
93      @Override
94      protected void addModelHandlerAssociations(DefaultProcessor defaultProcessor) {
95          super.addModelHandlerAssociations(defaultProcessor);
96          defaultProcessor.addHandler(ConfigurationModel.class, ConfigurationModelHandler::makeInstance);
97          defaultProcessor.addHandler(ContextNameModel.class, ContextNameModelHandler::makeInstance);
98          defaultProcessor.addHandler(LoggerContextListenerModel.class, LoggerContextListenerModelHandler::makeInstance);
99  
100         defaultProcessor.addHandler(AppenderModel.class, AppenderModelHandler::makeInstance);
101         defaultProcessor.addHandler(AppenderRefModel.class, AppenderRefModelHandler::makeInstance);
102         defaultProcessor.addHandler(RootLoggerModel.class, RootLoggerModelHandler::makeInstance);
103         defaultProcessor.addHandler(LoggerModel.class, LoggerModelHandler::makeInstance);
104         defaultProcessor.addHandler(LevelModel.class, LevelModelHandler::makeInstance);
105 
106         defaultProcessor.addAnalyser(LoggerModel.class, 
107                 () -> new RefContainerDependencyAnalyser(context, LoggerModel.class));
108 
109         defaultProcessor.addAnalyser(RootLoggerModel.class,
110                 () -> new RefContainerDependencyAnalyser(context, RootLoggerModel.class));
111 
112         defaultProcessor.addAnalyser(AppenderModel.class,
113                 () -> new RefContainerDependencyAnalyser(context, AppenderModel.class));
114 
115         defaultProcessor.addAnalyser(AppenderRefModel.class, 
116                 () -> new AppenderRefDependencyAnalyser(context));
117 
118         sealModelFilters(defaultProcessor);
119     }
120 
121 
122     // The final filters in the two filter chain are rather crucial.
123     // They ensure that only Models attached to the firstPhaseFilter will
124     // be handled in the first phase and all models not previously handled
125     // in the second phase will be handled in a catch-all fallback case.
126     private void sealModelFilters(DefaultProcessor defaultProcessor) {
127         defaultProcessor.getPhaseOneFilter().denyAll();
128         defaultProcessor.getPhaseTwoFilter().allowAll();
129     }
130 
131 }