Simple Resolver

JUEL provides the de.odysseus.el.util.SimpleResolver class for use as a simple resolver, suitable to resolve top-level identifiers and to delegate to another resolver provided at construction time.

If no resolver delegate is supplied, a composite resolver will be used as default, capable of resolving bean properties, array values, list values, resource values and map values.

A resolver is made to resolve properties. It operates on a pair of objects, called base and property. JUEL's simple resolver maintains a map to directly resolve top-level properties, that is base == null. Resolution for base/property pairs with base != null is delegated.

Finally, a simple resolver may also be flagged as "read-only". In this case, invoking the setValue(ELContext, Object, Object, Object) method will throw an exception.

import java.util.Date;
import javax.el.*;
import de.odysseus.el.util.SimpleContext;
import de.odysseus.el.util.SimpleResolver;
import de.odysseus.el.ExpressionFactoryImpl;
...
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext(new SimpleResolver());

// resolve top-level property
factory.createValueExpression(context, "#{pi}", double.class).setValue(context, Math.PI);
ValueExpression expr1 = factory.createValueExpression(context, "${pi/2}", double.class);
System.out.println("pi/2 = " + expr1.getValue(context)); // 1.5707963...

// resolve bean property
factory.createValueExpression(context, "#{current}", Date.class).setValue(context, new Date());
ValueExpression expr2 = factory.createValueExpression(context, "${current.time}", long.class);
System.out.println("current.time = " + expr2.getValue(context));