org.mvel2.integration.impl.IndexedVariableResolverFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of virtdata-lib-realer Show documentation
Show all versions of virtdata-lib-realer Show documentation
With inspiration from other libraries
/**
* 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 org.mvel2.UnresolveablePropertyException;
import org.mvel2.integration.VariableResolver;
import org.mvel2.integration.VariableResolverFactory;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class IndexedVariableResolverFactory extends BaseVariableResolverFactory {
public IndexedVariableResolverFactory(String[] varNames, VariableResolver[] resolvers) {
this.indexedVariableNames = varNames;
this.indexedVariableResolvers = resolvers;
}
public IndexedVariableResolverFactory(String[] varNames, Object[] values) {
this.indexedVariableNames = varNames;
this.indexedVariableResolvers = createResolvers(values, varNames.length);
}
public IndexedVariableResolverFactory(String[] varNames, Object[] values, VariableResolverFactory nextFactory) {
this.indexedVariableNames = varNames;
this.nextFactory = new MapVariableResolverFactory();
this.nextFactory.setNextFactory(nextFactory);
this.indexedVariableResolvers = createResolvers(values, varNames.length);
}
private static VariableResolver[] createResolvers(Object[] values, int size) {
VariableResolver[] vr = new VariableResolver[size];
for (int i = 0; i < size; i++) {
vr[i] = i >= values.length ? new SimpleValueResolver(null) : new IndexVariableResolver(i, values);
}
return vr;
}
public VariableResolver createIndexedVariable(int index, String name, Object value) {
VariableResolver r = indexedVariableResolvers[index];
r.setValue(value);
return r;
}
public VariableResolver getIndexedVariableResolver(int index) {
return indexedVariableResolvers[index];
}
public VariableResolver createVariable(String name, Object value) {
VariableResolver vr = getResolver(name);
if (vr != null) {
vr.setValue(value);
}
return vr;
}
public VariableResolver createVariable(String name, Object value, Class> type) {
VariableResolver vr = getResolver(name);
if (vr != null) {
vr.setValue(value);
}
return vr;
// if (nextFactory == null) nextFactory = new MapVariableResolverFactory(new HashMap());
// return nextFactory.createVariable(name, value, type);
}
public VariableResolver getVariableResolver(String name) {
VariableResolver vr = getResolver(name);
if (vr != null) return vr;
else if (nextFactory != null) {
return nextFactory.getVariableResolver(name);
}
throw new UnresolveablePropertyException("unable to resolve variable '" + name + "'");
}
public boolean isResolveable(String name) {
return isTarget(name) || (nextFactory != null && nextFactory.isResolveable(name));
}
protected VariableResolver addResolver(String name, VariableResolver vr) {
variableResolvers.put(name, vr);
return vr;
}
private VariableResolver getResolver(String name) {
for (int i = 0; i < indexedVariableNames.length; i++) {
if (indexedVariableNames[i].equals(name)) {
return indexedVariableResolvers[i];
}
}
return null;
}
public boolean isTarget(String name) {
for (String indexedVariableName : indexedVariableNames) {
if (indexedVariableName.equals(name)) {
return true;
}
}
return false;
}
public Set getKnownVariables() {
return new HashSet(Arrays.asList(indexedVariableNames));
}
public void clear() {
// variableResolvers.clear();
}
@Override
public boolean isIndexedFactory() {
return true;
}
}