001/*
002 * Copyright (c) 2024 QOS.ch Sarl (Switzerland)
003 * All rights reserved.
004 *
005 * Permission is hereby granted, free  of charge, to any person obtaining
006 * a  copy  of this  software  and  associated  documentation files  (the
007 * "Software"), to  deal in  the Software without  restriction, including
008 * without limitation  the rights to  use, copy, modify,  merge, publish,
009 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
010 * permit persons to whom the Software  is furnished to do so, subject to
011 * the following conditions:
012 *
013 * The  above  copyright  notice  and  this permission  notice  shall  be
014 * included in all copies or substantial portions of the Software.
015 *
016 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
017 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
018 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
019 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
020 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
021 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
022 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
023 *
024 *
025 *
026 */
027
028package ch.qos.logback.tyler.base.handler;
029
030import ch.qos.logback.core.Context;
031import ch.qos.logback.core.model.ComponentModel;
032import ch.qos.logback.core.model.Model;
033import ch.qos.logback.core.model.conditional.IfModel;
034import ch.qos.logback.core.model.processor.ModelHandlerBase;
035import ch.qos.logback.core.model.processor.ModelHandlerException;
036import ch.qos.logback.core.model.processor.ModelInterpretationContext;
037import ch.qos.logback.core.spi.ScanException;
038import ch.qos.logback.core.util.OptionHelper;
039import ch.qos.logback.tyler.base.TylerModelInterpretationContext;
040import com.squareup.javapoet.MethodSpec;
041
042public class IfModelHandler extends ModelHandlerBase {
043
044    public IfModelHandler(Context context) {
045        super(context);
046    }
047
048
049
050    static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
051        return new IfModelHandler(context);
052    }
053
054    @Override
055    protected Class<IfModel> getSupportedModelClass() {
056        return IfModel.class;
057    }
058
059    @Override
060    public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
061        IfModel ifModel = (IfModel) model;
062        TylerModelInterpretationContext tmic = (TylerModelInterpretationContext) mic;
063
064        mic.pushModel(ifModel);
065        String conditionStr = ifModel.getCondition();
066        int lineNum = model.getLineNumber();
067
068        if (!OptionHelper.isNullOrEmptyOrAllSpaces(conditionStr)) {
069            addJavaStatement(tmic, conditionStr);
070        } else {
071            addError("Empty condition for <if> element on line "+lineNum);
072        }
073    }
074
075    protected void addJavaStatement(TylerModelInterpretationContext tmic, String conditionStr) {
076        tmic.configureMethodSpecBuilder.beginControlFlow("if($N)", conditionStr);
077    }
078
079    @Override
080    public void postHandle(ModelInterpretationContext mic, Model model) {
081        if(mic.isModelStackEmpty()) {
082            addError("Unexpected unexpected empty model stack.");
083            return;
084        }
085
086        Object o = mic.peekModel();
087        if (!(o instanceof IfModel)) {
088            addWarn("The object [" + o + "] on the top the of the stack is not of type [" + IfModel.class);
089        } else {
090            TylerModelInterpretationContext tmic = (TylerModelInterpretationContext) mic;
091            tmic.configureMethodSpecBuilder.endControlFlow();
092            mic.popModel();
093        }
094
095    }
096}