1   /*
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2026, 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 v2.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  
15  package ch.qos.logback.classic.joran;
16  
17  import ch.qos.logback.classic.model.*;
18  import ch.qos.logback.classic.model.processor.*;
19  import ch.qos.logback.core.Context;
20  import ch.qos.logback.core.joran.ModelClassToModelHandlerLinkerBase;
21  import ch.qos.logback.core.model.AppenderModel;
22  import ch.qos.logback.core.model.AppenderRefModel;
23  import ch.qos.logback.core.model.InsertFromJNDIModel;
24  import ch.qos.logback.core.model.ModelHandlerFactoryMethod;
25  import ch.qos.logback.core.model.processor.*;
26  
27  /**
28   * For a given DefaultProcessor instance link a {@link ch.qos.logback.core.model.Model Model} class to a
29   * {@link ch.qos.logback.core.model.processor.ModelHandlerBase ModelHandler} instance for
30   * logback-classic.
31   *
32   * <p>Will also use links from super class.</p>
33   *
34   * @since 1.3.9/1.4.9
35   */
36  public class ModelClassToModelHandlerLinker extends ModelClassToModelHandlerLinkerBase {
37  
38      public ModelClassToModelHandlerLinker(Context context) {
39          super(context);
40      }
41  
42      ModelHandlerFactoryMethod configurationModelHandlerFactoryMethod;
43  
44      @Override
45      public void link(DefaultProcessor defaultProcessor) {
46          super.link(defaultProcessor);
47          defaultProcessor.addHandler(ConfigurationModel.class, getConfigurationModelHandlerFactoryMethod());
48          defaultProcessor.addHandler(ContextNameModel.class, ContextNameModelHandler::makeInstance);
49          defaultProcessor.addHandler(LoggerContextListenerModel.class, LoggerContextListenerModelHandler::makeInstance);
50  
51          defaultProcessor.addHandler(PropertiesConfiguratorModel.class, PropertiesConfiguratorModelHandler::makeInstance);
52          defaultProcessor.addHandler(InsertFromJNDIModel.class, InsertFromJNDIModelHandler::makeInstance);
53  
54          defaultProcessor.addHandler(AppenderModel.class, AppenderModelHandler::makeInstance);
55          defaultProcessor.addHandler(AppenderRefModel.class, AppenderRefModelHandler::makeInstance);
56          defaultProcessor.addHandler(RootLoggerModel.class, RootLoggerModelHandler::makeInstance);
57          defaultProcessor.addHandler(LoggerModel.class, LoggerModelHandler::makeInstance);
58          defaultProcessor.addHandler(LevelModel.class, LevelModelHandler::makeInstance);
59  
60          defaultProcessor.addAnalyser(RootLoggerModel.class,
61                  () -> new AppenderRefDependencyAnalyser(context));
62  
63          defaultProcessor.addAnalyser(LoggerModel.class,
64                  () -> new AppenderRefDependencyAnalyser(context));
65  
66          // an appender may contain appender refs, e.g. AsyncAppender
67          defaultProcessor.addAnalyser(AppenderModel.class,
68                  () -> new AppenderRefDependencyAnalyser(context));
69  
70          defaultProcessor.addAnalyser(AppenderModel.class, () -> new FileCollisionAnalyser(context));
71  
72  
73          defaultProcessor.addAnalyser(AppenderModel.class, () -> new AppenderDeclarationAnalyser(context));
74  
75          sealModelFilters(defaultProcessor);
76  
77      }
78  
79      public ModelHandlerFactoryMethod getConfigurationModelHandlerFactoryMethod() {
80          if (configurationModelHandlerFactoryMethod == null) {
81              //System.out.println("returning default ConfigurationModelHandler::makeInstance;");
82              return ConfigurationModelHandler::makeInstance;
83          } else {
84              //System.out.println("returning set "+configurationModelHandlerFactoryMethod);
85              return configurationModelHandlerFactoryMethod;
86          }
87      }
88  
89  
90      /**
91       * Allow configurators to override the factory method for ConfigurationModelHandler
92       *
93       */
94      public void setConfigurationModelHandlerFactoryMethod(ModelHandlerFactoryMethod cmhfm) {
95          //System.out.println("setConfigurationModelHandlerFactoryMethod called with "+cmhfm);
96          this.configurationModelHandlerFactoryMethod = cmhfm;
97      }
98  
99  }