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.core.joran;
016
017import ch.qos.logback.core.Context;
018import ch.qos.logback.core.model.*;
019import ch.qos.logback.core.model.conditional.ByPropertiesConditionModel;
020import ch.qos.logback.core.model.conditional.ElseModel;
021import ch.qos.logback.core.model.conditional.IfModel;
022import ch.qos.logback.core.model.conditional.ThenModel;
023import ch.qos.logback.core.model.processor.*;
024import ch.qos.logback.core.model.processor.conditional.ByPropertiesConditionModelHandler;
025import ch.qos.logback.core.model.processor.conditional.ElseModelHandler;
026import ch.qos.logback.core.model.processor.conditional.IfModelHandler;
027import ch.qos.logback.core.model.processor.conditional.ThenModelHandler;
028import ch.qos.logback.core.sift.SiftModelHandler;
029
030/**
031 * For a given DefaultProcessor instance link a {@link ch.qos.logback.core.model.Model Model} class to
032 * a {@link ch.qos.logback.core.model.processor.ModelHandlerBase ModelHandler} instance in logback-core.
033 *
034 * <p>Derived classes are likely to add further links.</p>
035 *
036 * @since 1.3.9/1.4.9
037 */
038public class ModelClassToModelHandlerLinkerBase {
039
040
041    protected Context context;
042
043    public ModelClassToModelHandlerLinkerBase(Context context) {
044        this.context = context;
045    }
046
047    public void link(DefaultProcessor defaultProcessor) {
048        defaultProcessor.addHandler(ImportModel.class, ImportModelHandler::makeInstance);
049
050        defaultProcessor.addHandler(ShutdownHookModel.class, ShutdownHookModelHandler::makeInstance);
051        defaultProcessor.addHandler(SequenceNumberGeneratorModel.class, SequenceNumberGeneratorModelHandler::makeInstance);
052        defaultProcessor.addHandler(SerializeModelModel.class, SerializeModelModelHandler::makeInstance);
053
054        defaultProcessor.addHandler(EventEvaluatorModel.class, EventEvaluatorModelHandler::makeInstance);
055        defaultProcessor.addHandler(ConversionRuleModel.class, ConversionRuleModelHandler::makeInstance);
056
057        defaultProcessor.addHandler(DefineModel.class, DefineModelHandler::makeInstance);
058        defaultProcessor.addHandler(IncludeModel.class, IncludeModelHandler::makeInstance);
059
060
061        defaultProcessor.addHandler(ParamModel.class, ParamModelHandler::makeInstance);
062        defaultProcessor.addHandler(PropertyModel.class, PropertyModelHandler::makeInstance);
063        defaultProcessor.addHandler(TimestampModel.class, TimestampModelHandler::makeInstance);
064        defaultProcessor.addHandler(StatusListenerModel.class, StatusListenerModelHandler::makeInstance);
065        defaultProcessor.addHandler(ImplicitModel.class, ImplicitModelHandler::makeInstance);
066
067
068        defaultProcessor.addHandler(ByPropertiesConditionModel.class, ByPropertiesConditionModelHandler::makeInstance);
069        defaultProcessor.addHandler(IfModel.class, IfModelHandler::makeInstance);
070        defaultProcessor.addHandler(ThenModel.class, ThenModelHandler::makeInstance);
071        defaultProcessor.addHandler(ElseModel.class, ElseModelHandler::makeInstance);
072
073        defaultProcessor.addHandler(SiftModel.class, SiftModelHandler::makeInstance);
074    }
075
076    // The final filters in the two filter chain are rather crucial.
077    // They ensure that only Models attached to the firstPhaseFilter will
078    // be handled in the first phase and all models not previously handled
079    // in the second phase will be handled in a catch-all fallback case.
080    protected void sealModelFilters(DefaultProcessor defaultProcessor) {
081        defaultProcessor.getPhaseOneFilter().denyAll();
082        defaultProcessor.getPhaseTwoFilter().allowAll();
083    }
084}