001/*
002 * Logback: the reliable, generic, fast and flexible logging framework.
003 * Copyright (C) 1999-2023, QOS.ch. All rights reserved.
004 *
005 * This program and the accompanying materials are dual-licensed under
006 * either the terms of the Eclipse Public License v1.0 as published by
007 * the Eclipse Foundation
008 *
009 *   or (per the licensee's choosing)
010 *
011 * under the terms of the GNU Lesser General Public License version 2.1
012 * as published by the Free Software Foundation.
013 */
014
015package ch.qos.logback.classic.joran;
016
017import ch.qos.logback.classic.model.*;
018import ch.qos.logback.classic.model.processor.*;
019import ch.qos.logback.core.Context;
020import ch.qos.logback.core.joran.ModelClassToModelHandlerLinkerBase;
021import ch.qos.logback.core.model.AppenderModel;
022import ch.qos.logback.core.model.AppenderRefModel;
023import ch.qos.logback.core.model.InsertFromJNDIModel;
024import ch.qos.logback.core.model.ModelHandlerFactoryMethod;
025import ch.qos.logback.core.model.processor.*;
026
027/**
028 * For a given DefaultProcessor instance link a {@link ch.qos.logback.core.model.Model Model} class to a
029 * {@link ch.qos.logback.core.model.processor.ModelHandlerBase ModelHandler} instance for
030 * logback-classic.
031 *
032 * <p>Will also use links from super class.</p>
033 *
034 * @since 1.3.9/1.4.9
035 */
036public class ModelClassToModelHandlerLinker extends ModelClassToModelHandlerLinkerBase {
037
038    public ModelClassToModelHandlerLinker(Context context) {
039        super(context);
040    }
041
042    ModelHandlerFactoryMethod configurationModelHandlerFactoryMethod;
043
044    @Override
045    public void link(DefaultProcessor defaultProcessor) {
046        super.link(defaultProcessor);
047        defaultProcessor.addHandler(ConfigurationModel.class, getConfigurationModelHandlerFactoryMethod());
048        defaultProcessor.addHandler(ContextNameModel.class, ContextNameModelHandler::makeInstance);
049        defaultProcessor.addHandler(LoggerContextListenerModel.class, LoggerContextListenerModelHandler::makeInstance);
050
051        defaultProcessor.addHandler(PropertiesConfiguratorModel.class, PropertiesConfiguratorModelHandler::makeInstance);
052        defaultProcessor.addHandler(InsertFromJNDIModel.class, InsertFromJNDIModelHandler::makeInstance);
053
054        defaultProcessor.addHandler(AppenderModel.class, AppenderModelHandler::makeInstance);
055        defaultProcessor.addHandler(AppenderRefModel.class, AppenderRefModelHandler::makeInstance);
056        defaultProcessor.addHandler(RootLoggerModel.class, RootLoggerModelHandler::makeInstance);
057        defaultProcessor.addHandler(LoggerModel.class, LoggerModelHandler::makeInstance);
058        defaultProcessor.addHandler(LevelModel.class, LevelModelHandler::makeInstance);
059
060        defaultProcessor.addAnalyser(RootLoggerModel.class,
061                () -> new AppenderRefDependencyAnalyser(context));
062
063        defaultProcessor.addAnalyser(LoggerModel.class,
064                () -> new AppenderRefDependencyAnalyser(context));
065
066        // an appender may contain appender refs, e.g. AsyncAppender
067        defaultProcessor.addAnalyser(AppenderModel.class,
068                () -> new AppenderRefDependencyAnalyser(context));
069
070        defaultProcessor.addAnalyser(AppenderModel.class, () -> new FileCollisionAnalyser(context));
071
072
073        defaultProcessor.addAnalyser(AppenderModel.class, () -> new AppenderDeclarationAnalyser(context));
074
075        sealModelFilters(defaultProcessor);
076
077    }
078
079    public ModelHandlerFactoryMethod getConfigurationModelHandlerFactoryMethod() {
080        if (configurationModelHandlerFactoryMethod == null) {
081            //System.out.println("returning default ConfigurationModelHandler::makeInstance;");
082            return ConfigurationModelHandler::makeInstance;
083        } else {
084            //System.out.println("returning set "+configurationModelHandlerFactoryMethod);
085            return configurationModelHandlerFactoryMethod;
086        }
087    }
088
089
090    /**
091     * Allow configurators to override the factory method for ConfigurationModelHandler
092     *
093     */
094    public void setConfigurationModelHandlerFactoryMethod(ModelHandlerFactoryMethod cmhfm) {
095        //System.out.println("setConfigurationModelHandlerFactoryMethod called with "+cmhfm);
096        this.configurationModelHandlerFactoryMethod = cmhfm;
097    }
098
099}