jsr341-experts@el-spec.java.net

[jsr341-experts] Re: Local bean repository

From: Ramesh <rameshp_at_pramati.com>
Date: Wed, 17 Aug 2011 18:01:11 +0530

Though i felt, just adding constructors will not harm. This looks
absolutely perfect.

On 8/17/2011 5:12 AM, Kin-man Chung wrote:
> After my mail to Mark, discussing doing things that should be done in
> Java rather than in EL, I suddenly realize that we need a local
> repository to define beans that can be used in EL expressions. So I
> added a local bean repository that an user can deposit beans, and
> added a new method for he/she to do so.
>
> Example:
>
> elProcessor.defineBean("curDate", new Date()); // Define curDate
> to be a Date
> elProcessor.getValue("#{curDate.year}"); // and use it in another
> expression
> elProcessor.defineBean("curDate", null); // remove it after use;
>
> With this, I actually have weaken my case for the need to have EL
> constructors! :-)
>
> If there is no objections, I'll make the following change.
>
> misto:el%svn diff
> Index: StandardELContext.java
> ===================================================================
> --- StandardELContext.java (revision 4)
> +++ StandardELContext.java (working copy)
> @@ -1,6 +1,7 @@
> package javax.el;
>
> -import java.util.HashMap;
> +import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> import java.lang.reflect.Method;
>
> /*
> @@ -45,6 +46,11 @@
> private ELContext delegate = null;
>
> /**
> + * A bean repository local to this context
> + */
> + private Map<String, Object> beans = new ConcurrentHashMap<String,
> Object>();
> +
> + /**
> * Default Constructor
> */
> public StandardELContext() {
> @@ -90,6 +96,7 @@
> public ELResolver getELResolver() {
> if (elResolver == null) {
> CompositeELResolver resolver = new CompositeELResolver();
> + resolver.add(new BeanNameELResolver(new
> LocalBeanNameResolver()));
> resolver.add(new MapELResolver());
> resolver.add(new ResourceBundleELResolver());
> resolver.add(new ListELResolver());
> @@ -131,6 +138,14 @@
> }
>
> /**
> + * Get the local bean repository
> + * @return the bean repository
> + */
> + public Map<String, Object> getBeans() {
> + return beans;
> + }
> +
> + /**
> * Construct (if needed) and return a default FunctionMapper.
> * @param The default FunctionMapper
> */
> @@ -156,7 +171,7 @@
>
> private static class DefaultFunctionMapper extends FunctionMapper {
>
> - private HashMap<String, Method> functions = null;
> + private Map<String, Method> functions = null;
>
> @Override
> public Method resolveFunction(String prefix, String localName) {
> @@ -170,7 +185,7 @@
> @Override
> public void mapFunction(String prefix, String localName,
> Method meth){
> if (functions == null) {
> - functions = new HashMap<String, Method>();
> + functions = new ConcurrentHashMap<String, Method>();
> }
> functions.put(prefix + ":" + localName, meth);
> }
> @@ -178,7 +193,7 @@
>
> private static class DefaultVariableMapper extends VariableMapper {
>
> - private HashMap<String, ValueExpression> variables = null;
> + private Map<String, ValueExpression> variables = null;
>
> @Override
> public ValueExpression resolveVariable (String variable) {
> @@ -190,16 +205,36 @@
>
> @Override
> public ValueExpression setVariable(String variable,
> - ValueExpression expression) {
> + ValueExpression expression) {
> + if (variables == null) {
> + variables = new ConcurrentHashMap<String,
> ValueExpression>();
> + }
> ValueExpression prev = null;
> if (expression == null) {
> - variables.remove(variable);
> + prev = variables.remove(variable);
> } else {
> - prev = variables.get(variable);
> - variables.put(variable, expression);
> + prev = variables.put(variable, expression);
> }
> return prev;
> }
> }
> +
> + private class LocalBeanNameResolver extends BeanNameResolver {
> +
> + @Override
> + public String getBean(String beanName) {
> + return beans.get(beanName);
> + }
> +
> + @Override
> + public void setBeanValue(String beanName, Object value) {
> + beans.set(beanName, value);
> + }
> +
> + @Override
> + public boolean isReadOnly(String beanName) {
> + return false;
> + }
> + }
> }
>
> Index: ELProcessor.java
> ===================================================================
> --- ELProcessor.java (revision 3)
> +++ ELProcessor.java (working copy)
> @@ -131,5 +131,14 @@
> }
> elManager.mapFunction(prefix, localName, meth);
> }
> +
> + /**
> + * Define a bean in a local bean repository
> + * @name The name of the bean
> + * @bean The bean instance to be defined
> + */
> + public void defineBean(String name, Object bean) {
> + elManage.defineBean(name, bean);
> + }
> }
>
> Index: ELManager.java
> ===================================================================
> --- ELManager.java (revision 4)
> +++ ELManager.java (working copy)
> @@ -102,8 +102,6 @@
> * @param variable The variable name
> * @param expression The ValueExpression to be assigned
> * to the variable.
> - * @return The previous ValueExpression assigned to this variable,
> - * null if there is no previouse assignment to this
> variable.
> */
> public void setVariable(String variable, ValueExpression
> expression) {
> getELContext().getVariableMapper().setVariable(variable,
> expression);
> @@ -126,4 +124,12 @@
> getELContext().getImportHandler().importPackage(packageName);
> }
>
> + /**
> + * Define a bean in the local bean repository
> + * @name The name of the bean
> + * @bean The bean instance to be defined
> + */
> + public void defineBean(String name, Object bean) {
> + getELContext().getBeans().set(name, bean);
> + }
> }
>
>