001/*
002 *  Copyright (c) 2004-2024 QOS.ch
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
025package ch.qos.logback.tyler.base.handler;
026
027import ch.qos.logback.classic.model.PropertiesConfiguratorModel;
028import ch.qos.logback.classic.model.processor.PropertiesConfiguratorModelHandler;
029import ch.qos.logback.core.Context;
030import ch.qos.logback.core.model.Model;
031import ch.qos.logback.core.model.processor.ModelHandlerBase;
032import ch.qos.logback.core.model.processor.ModelHandlerException;
033import ch.qos.logback.core.model.processor.ModelInterpretationContext;
034import ch.qos.logback.core.util.OptionHelper;
035import ch.qos.logback.tyler.base.TylerModelInterpretationContext;
036
037public class TylerPropertiesConfiguratorModelHandler extends ModelHandlerBase {
038
039    public TylerPropertiesConfiguratorModelHandler(Context context) {
040        super(context);
041    }
042
043    static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
044        return new TylerPropertiesConfiguratorModelHandler(context);
045    }
046
047    @Override
048    protected Class<PropertiesConfiguratorModel> getSupportedModelClass() {
049        return PropertiesConfiguratorModel.class;
050    }
051
052    @Override
053    public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
054        PropertiesConfiguratorModel propertyConfiguratorModel = (PropertiesConfiguratorModel) model;
055        TylerModelInterpretationContext tmic  = (TylerModelInterpretationContext) mic;
056        addJavaStatement(tmic, propertyConfiguratorModel);
057    }
058
059    protected void addJavaStatement(TylerModelInterpretationContext tmic, PropertiesConfiguratorModel pcModel) {
060
061        // code to produce
062        //PropertiesConfiguratorModel propertyConfiguratorModel = new PropertiesConfiguratorModel();
063        //propertyConfiguratorModel.setFile(pcModel.getFile());  // use actual string value of pcModel.getFile()
064        //propertyConfiguratorModel.setUrl(pcModel.getUrl()); // use actual string value of pcModel.getUrl()
065        //propertyConfiguratorModel.setResource(pcModel.getResource());
066        //propertyConfiguratorModel.setOptional(pcModel.getOptional());
067        //PropertiesConfiguratorModelHandler propertiesConfiguratorModelHandler = new PropertiesConfiguratorModelHandler(context);
068        //propertiesConfiguratorModelHandler.handle((ContextAwarePropertyContainer) this, propertyConfiguratorModel);
069
070        String pcmVarName = "propertyConfiguratorModel";
071        String pcmhVarName = "propertiesConfiguratorModelHandler";
072        tmic.configureMethodSpecBuilder.addStatement("$1T $2N = new $1T()", PropertiesConfiguratorModel.class, pcmVarName);
073        if (!OptionHelper.isNullOrEmptyOrAllSpaces(pcModel.getFile())) {
074            tmic.configureMethodSpecBuilder.addStatement("$N.setFile(subst($S))", pcmVarName, pcModel.getFile());
075        }
076        if (!OptionHelper.isNullOrEmptyOrAllSpaces(pcModel.getUrl())) {
077            tmic.configureMethodSpecBuilder.addStatement("$N.setUrl(subst($S))", pcmVarName, pcModel.getUrl());
078        }
079        if (!OptionHelper.isNullOrEmptyOrAllSpaces(pcModel.getResource())) {
080            tmic.configureMethodSpecBuilder.addStatement("$N.setResource(subst($S))", pcmVarName, pcModel.getResource());
081        }
082        if (!OptionHelper.isNullOrEmptyOrAllSpaces(pcModel.getOptional())) {
083            tmic.configureMethodSpecBuilder.addStatement("$N.setOptional(subst($S))", pcmVarName, pcModel.getOptional());
084        }
085        tmic.configureMethodSpecBuilder.addStatement("$1T $2N = new $1T($3N)", PropertiesConfiguratorModelHandler.class, pcmhVarName,
086                        tmic.getContextFieldSpec());
087        // "this is the calling TylerConfigurator instance of type ContextAwarePropertyContainer"
088        tmic.configureMethodSpecBuilder.beginControlFlow("try");
089        tmic.configureMethodSpecBuilder.addStatement("$N.detachedHandle(this, $N)", pcmhVarName, pcmVarName);
090        tmic.configureMethodSpecBuilder.nextControlFlow("catch($T e)", ModelHandlerException.class);
091        tmic.configureMethodSpecBuilder.addStatement("addError(\"Failed to process PropertyConfiguratorModel\", e)");
092        tmic.configureMethodSpecBuilder.endControlFlow();
093
094    }
095}