001package ch.qos.logback.core.model.processor;
002
003import ch.qos.logback.core.Context;
004import ch.qos.logback.core.joran.action.ActionUtil;
005import ch.qos.logback.core.joran.action.ActionUtil.Scope;
006import ch.qos.logback.core.model.InsertFromJNDIModel;
007import ch.qos.logback.core.model.Model;
008import ch.qos.logback.core.model.util.PropertyModelHandlerHelper;
009import ch.qos.logback.core.spi.ContextAwarePropertyContainer;
010import ch.qos.logback.core.util.JNDIUtil;
011import ch.qos.logback.core.util.OptionHelper;
012
013public class InsertFromJNDIModelHandler extends ModelHandlerBase {
014
015    public InsertFromJNDIModelHandler(Context context) {
016        super(context);
017    }
018
019    static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext ic) {
020        return new InsertFromJNDIModelHandler(context);
021    }
022
023    @Override
024    protected Class<InsertFromJNDIModel> getSupportedModelClass() {
025        return InsertFromJNDIModel.class;
026    }
027
028    @Override
029    public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
030        InsertFromJNDIModel ifjm = (InsertFromJNDIModel) model;
031        detachedHandle(mic, ifjm);
032    }
033
034    /**
035     *
036     * @param capc
037     * @param ifjm
038     * @since 1.5.11
039     */
040    public void detachedHandle(ContextAwarePropertyContainer capc, InsertFromJNDIModel ifjm) {
041        int errorCount = 0;
042        String envEntryName = capc.subst(ifjm.getEnvEntryName());
043        String asKey = capc.subst(ifjm.getAs());
044
045        String scopeStr = capc.subst(ifjm.getScopeStr());
046        Scope scope = ActionUtil.stringToScope(scopeStr);
047
048        String envEntryValue;
049
050        if (OptionHelper.isNullOrEmptyOrAllSpaces(envEntryName)) {
051            addError("[" + InsertFromJNDIModel.ENV_ENTRY_NAME_ATTR + "] missing");
052            errorCount++;
053        }
054
055        if (OptionHelper.isNullOrEmptyOrAllSpaces(asKey)) {
056            addError("[" + InsertFromJNDIModel.AS_ATTR + "] missing");
057            errorCount++;
058        }
059
060        if (errorCount != 0) {
061            return;
062        }
063
064        try {
065            javax.naming.Context ctx = JNDIUtil.getInitialContext();
066            envEntryValue = JNDIUtil.lookupString(ctx, envEntryName);
067            if (OptionHelper.isNullOrEmptyOrAllSpaces(envEntryValue)) {
068                addError("[" + envEntryName + "] has null or empty value");
069            } else {
070                addInfo("Setting variable [" + asKey + "] to [" + envEntryValue + "] in [" + scope + "] scope");
071                PropertyModelHandlerHelper.setProperty(capc, asKey, envEntryValue, scope);
072            }
073        } catch (Exception e) {
074            addError("Failed to lookup JNDI env-entry [" + envEntryName + "]");
075        }
076
077    }
078
079}