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}