On 14/12/2009, hen...@apache.org <hen...@apache.org> wrote: > Author: henrib > Date: Mon Dec 14 17:38:45 2009 > New Revision: 890409 > > URL: http://svn.apache.org/viewvc?rev=890409&view=rev > Log: > fixed JEXL-94; modified test accordingly. Also fixed a bug in > MethodKey#isApplicable that surfaced through test. > > Modified: > > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java > > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/JexlEngine.java > > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/internal/introspection/MethodKey.java > > commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/MethodTest.java > > Modified: > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java > URL: > http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java?rev=890409&r1=890408&r2=890409&view=diff > > ============================================================================== > --- > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java > (original) > +++ > commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java > Mon Dec 14 17:38:45 2009 > @@ -97,6 +97,8 @@ > protected final JexlArithmetic arithmetic; > /** The map of registered functions. */ > protected final Map<String, Object> functions; > + /** The map of registered functions. */ > + protected Map<String, Object> functors;
Could/should be private. Indeed so should all the other instance variables... > /** The context to store/retrieve variables. */ > protected final JexlContext context; > /** Strict interpreter flag. */ > @@ -124,6 +126,7 @@ > this.silent = jexl.silent; > this.cache = jexl.cache != null; > this.context = aContext; > + this.functors = null; Why not allocate an empty HashMap here? It would save a lot of null checking later, and the variable could then be final. > } > > /** > @@ -231,6 +234,46 @@ > return null; > } > > + /** > + * Resolves a namespace, eventually allocating an instance using > context as constructor argument. > + * The lifetime of such instances span the current expression or script > evaluation. > + * > + * @param prefix the prefix name (may be null for global namespace) > + * @param node the AST node > + * @return the namespace instance > + */ > + protected Object resolveNamespace(String prefix, JexlNode node) { > + Object namespace; > + // check whether this namespace is a functor > + if (functors != null) { > + namespace = functors.get(prefix); > + if (namespace != null) { > + return namespace; > + } > + } > + namespace = functions.get(prefix); > + if (namespace == null) { > + throw new JexlException(node, "no such function namespace " + > prefix); > + } > + // allow namespace to be instantiated as functor with context > + if (namespace instanceof Class<?>) { > + Object[] args = new Object[]{context}; > + Constructor<?> ctor = uberspect.getConstructor(namespace,args, > node); > + if (ctor != null) { > + try { > + namespace = ctor.newInstance(args); > + if (functors == null) { > + functors = new HashMap<String, Object>(); > + } > + functors.put(prefix, namespace); > + } catch (Exception xinst) { > + throw new JexlException(node, "unable to instantiate > namespace " + prefix, xinst); > + } > + } > + } > + return namespace; > + } > + --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org