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));