From b9f15565da743ac447afcd1e3702d8515fa518d3 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Mon, 21 Apr 2008 15:30:30 +0000 Subject: [PATCH] flow EL resolver --- .../faces/webflow/FlowPropertyResolver.java | 1 + .../faces/webflow/FlowResourceELResolver.java | 71 ------------ .../faces/webflow/FlowVariableResolver.java | 1 + ...JsfManagedBeanAwareELExpressionParser.java | 2 + .../expression/el/FlowResourceELResolver.java | 104 ++++++++++++++++++ .../el/WebFlowELExpressionParser.java | 1 + 6 files changed, 109 insertions(+), 71 deletions(-) delete mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowResourceELResolver.java create mode 100644 spring-webflow/src/main/java/org/springframework/webflow/expression/el/FlowResourceELResolver.java diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java index 6c8f3d7b..a43f55d4 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java @@ -20,6 +20,7 @@ import javax.faces.el.PropertyResolver; import org.springframework.binding.expression.el.MapAdaptableELResolver; import org.springframework.faces.expression.ELDelegatingPropertyResolver; +import org.springframework.webflow.expression.el.FlowResourceELResolver; /** * For resolving MapAdaptable properties with JSF 1.1 or >. diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResourceELResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResourceELResolver.java deleted file mode 100644 index ab97070b..00000000 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowResourceELResolver.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.springframework.faces.webflow; - -import java.util.Iterator; - -import javax.el.ELContext; -import javax.el.ELResolver; -import javax.el.PropertyNotWritableException; - -import org.springframework.context.MessageSource; -import org.springframework.util.StringUtils; -import org.springframework.webflow.execution.RequestContextHolder; - -public class FlowResourceELResolver extends ELResolver { - - private String MESSAGE_SOURCE_KEY = "resourceBundle"; - - public Class getCommonPropertyType(ELContext context, Object base) { - return Object.class; - } - - public Iterator getFeatureDescriptors(ELContext context, Object base) { - return null; - } - - public Class getType(ELContext context, Object base, Object property) { - if (base == null && MESSAGE_SOURCE_KEY.equals(property)) { - context.setPropertyResolved(true); - return MessageSource.class; - } else if (base != null && base instanceof MessageSource) { - MessageSource messageSource = (MessageSource) base; - String message = messageSource.getMessage(property.toString(), null, RequestContextHolder - .getRequestContext().getExternalContext().getLocale()); - if (StringUtils.hasText(message)) { - context.setPropertyResolved(true); - return String.class; - } - } - return null; - } - - public Object getValue(ELContext context, Object base, Object property) { - if (base == null && MESSAGE_SOURCE_KEY.equals(property)) { - context.setPropertyResolved(true); - return RequestContextHolder.getRequestContext().getActiveFlow().getApplicationContext(); - } else if (base != null && base instanceof MessageSource) { - MessageSource messageSource = (MessageSource) base; - String message = messageSource.getMessage(property.toString(), null, RequestContextHolder - .getRequestContext().getExternalContext().getLocale()); - if (StringUtils.hasText(message)) { - context.setPropertyResolved(true); - return message; - } - } - return null; - } - - public boolean isReadOnly(ELContext context, Object base, Object property) { - if (base == null && MESSAGE_SOURCE_KEY.equals(property)) { - context.setPropertyResolved(true); - return true; - } - return false; - } - - public void setValue(ELContext context, Object base, Object property, Object value) { - if (base == null && MESSAGE_SOURCE_KEY.equals(property)) { - throw new PropertyNotWritableException("The flow's MessageSource is not writable."); - } - } - -} diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java index 6b8b780d..66515aeb 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowVariableResolver.java @@ -19,6 +19,7 @@ import javax.el.CompositeELResolver; import javax.faces.el.VariableResolver; import org.springframework.faces.expression.ELDelegatingVariableResolver; +import org.springframework.webflow.expression.el.FlowResourceELResolver; import org.springframework.webflow.expression.el.ImplicitFlowVariableELResolver; import org.springframework.webflow.expression.el.RequestContextELResolver; import org.springframework.webflow.expression.el.ScopeSearchingELResolver; diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java index 90c8f087..d76fd0c5 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/JsfManagedBeanAwareELExpressionParser.java @@ -29,6 +29,7 @@ import org.springframework.binding.expression.el.ELContextFactory; import org.springframework.binding.expression.el.ELExpressionParser; import org.springframework.webflow.execution.RequestContext; import org.springframework.webflow.expression.el.ActionMethodELResolver; +import org.springframework.webflow.expression.el.FlowResourceELResolver; import org.springframework.webflow.expression.el.ImplicitFlowVariableELResolver; import org.springframework.webflow.expression.el.RequestContextELResolver; import org.springframework.webflow.expression.el.ScopeSearchingELResolver; @@ -52,6 +53,7 @@ public class JsfManagedBeanAwareELExpressionParser extends ELExpressionParser { RequestContext context = (RequestContext) target; List customResolvers = new ArrayList(); customResolvers.add(new RequestContextELResolver(context)); + customResolvers.add(new FlowResourceELResolver(context)); customResolvers.add(new ImplicitFlowVariableELResolver(context)); customResolvers.add(new ScopeSearchingELResolver(context)); customResolvers.add(new SpringBeanWebFlowELResolver(context)); diff --git a/spring-webflow/src/main/java/org/springframework/webflow/expression/el/FlowResourceELResolver.java b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/FlowResourceELResolver.java new file mode 100644 index 00000000..a4ea132d --- /dev/null +++ b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/FlowResourceELResolver.java @@ -0,0 +1,104 @@ +package org.springframework.webflow.expression.el; + +import java.util.Iterator; +import java.util.Locale; + +import javax.el.ELContext; +import javax.el.ELResolver; +import javax.el.PropertyNotWritableException; + +import org.springframework.context.MessageSource; +import org.springframework.webflow.execution.RequestContext; +import org.springframework.webflow.execution.RequestContextHolder; + +/** + * Custom EL resolver that resolves the messages from the active flow's {@link MessageSource}. The message source is + * indexed under the key resourceBundle. To access a message, specify its key e.g. + * resourceBundle.myMessage. + * + * @author Jeremy Grelle + */ +public class FlowResourceELResolver extends ELResolver { + + private String RESOURCE_BUNDLE_KEY = "resourceBundle"; + + private RequestContext requestContext; + + public FlowResourceELResolver() { + } + + public FlowResourceELResolver(RequestContext requestContext) { + this.requestContext = requestContext; + } + + public Class getCommonPropertyType(ELContext context, Object base) { + if (base == null) { + return MessageSource.class; + } else if (base instanceof MessageSource) { + return String.class; + } else { + return null; + } + } + + public Iterator getFeatureDescriptors(ELContext context, Object base) { + return null; + } + + public Class getType(ELContext context, Object base, Object property) { + if (base == null && RESOURCE_BUNDLE_KEY.equals(property)) { + context.setPropertyResolved(true); + return MessageSource.class; + } else if (base instanceof MessageSource) { + MessageSource messageSource = (MessageSource) base; + String message = messageSource.getMessage(property.toString(), null, null, getLocale()); + if (message != null) { + context.setPropertyResolved(true); + return String.class; + } + } + return null; + } + + public Object getValue(ELContext context, Object base, Object property) { + if (base == null && RESOURCE_BUNDLE_KEY.equals(property)) { + context.setPropertyResolved(true); + return getMessageSource(); + } else if (base instanceof MessageSource) { + MessageSource messageSource = (MessageSource) base; + String message = messageSource.getMessage(property.toString(), null, null, getLocale()); + if (message != null) { + context.setPropertyResolved(true); + return message; + } + } + return null; + } + + public boolean isReadOnly(ELContext context, Object base, Object property) { + if (base == null && RESOURCE_BUNDLE_KEY.equals(property)) { + context.setPropertyResolved(true); + return true; + } + return false; + } + + public void setValue(ELContext context, Object base, Object property, Object value) { + if (base == null && RESOURCE_BUNDLE_KEY.equals(property)) { + throw new PropertyNotWritableException("The flow's MessageSource is not writable."); + } + } + + protected Locale getLocale() { + return getRequestContext().getExternalContext().getLocale(); + } + + protected MessageSource getMessageSource() { + return getRequestContext().getActiveFlow().getApplicationContext(); + } + + protected RequestContext getRequestContext() { + return requestContext != null ? requestContext : RequestContextHolder.getRequestContext(); + } + +} diff --git a/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java index 327a1120..f8f2c856 100644 --- a/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java +++ b/spring-webflow/src/main/java/org/springframework/webflow/expression/el/WebFlowELExpressionParser.java @@ -54,6 +54,7 @@ public class WebFlowELExpressionParser extends ELExpressionParser { RequestContext context = (RequestContext) target; List customResolvers = new ArrayList(); customResolvers.add(new RequestContextELResolver(context)); + customResolvers.add(new FlowResourceELResolver(context)); customResolvers.add(new ImplicitFlowVariableELResolver(context)); customResolvers.add(new ScopeSearchingELResolver(context)); customResolvers.add(new SpringBeanWebFlowELResolver(context));