IndexVariableResolver.java
package org.mvel2.integration.impl;
import org.mvel2.integration.VariableResolver;
import static org.mvel2.integration.impl.SimpleSTValueResolver.handleTypeCoercion;
import static org.mvel2.util.ParseTools.isNumeric;
public class IndexVariableResolver implements VariableResolver {
private int indexPos;
private Object[] vars;
private Class type;
public IndexVariableResolver(int indexPos, Object[] vars) {
this.indexPos = indexPos;
this.vars = vars;
initializeType(vars[indexPos]);
}
public String getName() {
return null;
}
public Class getType() {
return type;
}
public void setStaticType(Class type) {
this.type = type;
}
public int getFlags() {
return 0;
}
public Object getValue() {
return vars[indexPos];
}
public void setValue(Object value) {
initializeType(value); // Initialize type if not yet done
if (type == Object.class || type == null) {
// IndexVariableResolver doesn't know the original declared type, so cannot deal with polymorphism
// Just accept the value
vars[indexPos] = value;
} else {
// Coerce numeric types
vars[indexPos] = handleTypeCoercion(type, value);
}
}
private void initializeType(Object value) {
if (type == null && value != null) {
if (isNumeric(value)) {
// Use type only when numeric
type = value.getClass();
} else {
// Otherwise, accept any type
type = Object.class;
}
}
}
}