All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mvel2.integration.impl.DefaultLocalVariableResolverFactory Maven / Gradle / Ivy

/**
 * MVEL 2.0
 * Copyright (C) 2007 The Codehaus
 * Mike Brock, Dhanji Prasanna, John Graham, Mark Proctor
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.mvel2.integration.impl;

import java.util.HashMap;
import java.util.Map;

import org.mvel2.UnresolveablePropertyException;
import org.mvel2.integration.VariableResolver;
import org.mvel2.integration.VariableResolverFactory;

public class DefaultLocalVariableResolverFactory extends MapVariableResolverFactory implements LocalVariableResolverFactory {

    private boolean noTilt = false;

    public DefaultLocalVariableResolverFactory() {
        super(new HashMap());
    }

    public DefaultLocalVariableResolverFactory(Map variables) {
        super(variables);
    }

    public DefaultLocalVariableResolverFactory(Map variables, VariableResolverFactory nextFactory) {
        super(variables, nextFactory);
    }

    public DefaultLocalVariableResolverFactory(Map variables, boolean cachingSafe) {
        super(variables);
    }

    public DefaultLocalVariableResolverFactory(VariableResolverFactory nextFactory) {
        super(new HashMap(), nextFactory);
    }

    public DefaultLocalVariableResolverFactory(VariableResolverFactory nextFactory, String[] indexedVariables) {
        super(new HashMap(), nextFactory);
        this.indexedVariableNames = indexedVariables;
        this.indexedVariableResolvers = new VariableResolver[indexedVariables.length];
    }

    public VariableResolver getIndexedVariableResolver(int index) {
        if (indexedVariableNames == null) return null;

        if (indexedVariableResolvers[index] == null) {
            /**
             * If the register is null, this means we need to forward-allocate the variable onto the
             * register table.
             */
            return indexedVariableResolvers[index] = super.getVariableResolver(indexedVariableNames[index]);
        }
        return indexedVariableResolvers[index];
    }

    public VariableResolver getVariableResolver(String name) {
        if (indexedVariableNames == null) return super.getVariableResolver(name);

        int idx;
        //   if (variableResolvers.containsKey(name)) return variableResolvers.get(name);
        if ((idx = variableIndexOf(name)) != -1) {
            if (indexedVariableResolvers[idx] == null) {
                indexedVariableResolvers[idx] = new SimpleValueResolver(null);
            }
            variableResolvers.put(indexedVariableNames[idx], null);
            return indexedVariableResolvers[idx];
        }

        return super.getVariableResolver(name);
    }

    public VariableResolver createVariable(String name, Object value, Class type) {
        if (indexedVariableNames == null) return super.createVariable(name, value, type);

        VariableResolver vr;
        boolean newVar = false;

        try {
            int idx;
            if ((idx = variableIndexOf(name)) != -1) {
                vr = new SimpleValueResolver(value);
                if (indexedVariableResolvers[idx] == null) {
                    indexedVariableResolvers[idx] = vr;
                }
                variableResolvers.put(indexedVariableNames[idx], vr);
                vr = indexedVariableResolvers[idx];

                newVar = true;
            } else {
                return super.createVariable(name, value, type);
            }

        } catch (UnresolveablePropertyException e) {
            vr = null;
        }

        if (!newVar && vr != null && vr.getType() != null) {
            throw new RuntimeException("variable already defined within scope: " + vr.getType() + " " + name);
        } else {
            addResolver(name, vr = new MapVariableResolver(variables, name, type)).setValue(value);
            return vr;
        }
    }

    public VariableResolverFactory setNoTilt(boolean noTilt) {
        this.noTilt = noTilt;
        return this;
    }

    @Override
    public void setTiltFlag(boolean tiltFlag) {
        if (!noTilt) super.setTiltFlag(tiltFlag);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy