diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowMessageSourceResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowMessageSourceResolver.java
new file mode 100644
index 00000000..c2b7f2be
--- /dev/null
+++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowMessageSourceResolver.java
@@ -0,0 +1,72 @@
+package org.springframework.faces.webflow;
+
+import java.util.Iterator;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import javax.el.PropertyNotWritableException;
+import javax.faces.context.FacesContext;
+
+import org.springframework.context.MessageSource;
+import org.springframework.util.StringUtils;
+import org.springframework.webflow.execution.RequestContextHolder;
+
+public class FlowMessageSourceResolver 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, FacesContext.getCurrentInstance()
+ .getViewRoot().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, FacesContext.getCurrentInstance()
+ .getViewRoot().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/FlowPropertyResolver.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowPropertyResolver.java
index 0847d133..910b2e76 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
@@ -31,6 +31,7 @@ public class FlowPropertyResolver extends ELDelegatingPropertyResolver {
private static final CompositeELResolver composite = new CompositeELResolver();
static {
+ composite.add(new FlowMessageSourceResolver());
composite.add(new MapAdaptableELResolver());
}
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 12068a9e..96226737 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
@@ -35,6 +35,7 @@ public class FlowVariableResolver extends ELDelegatingVariableResolver {
static {
composite.add(new RequestContextELResolver());
composite.add(new ImplicitFlowVariableELResolver());
+ composite.add(new FlowMessageSourceResolver());
composite.add(new ScopeSearchingELResolver());
}
diff --git a/spring-faces/src/main/resources/META-INF/faces-config.xml b/spring-faces/src/main/resources/META-INF/faces-config.xml
index 18ceb947..498a8e41 100644
--- a/spring-faces/src/main/resources/META-INF/faces-config.xml
+++ b/spring-faces/src/main/resources/META-INF/faces-config.xml
@@ -9,8 +9,8 @@
org.springframework.faces.webflow.FlowActionListener
org.springframework.faces.model.SelectionTrackingActionListener
org.springframework.faces.webflow.FlowVariableResolver
+ org.springframework.faces.webflow.FlowPropertyResolver
org.springframework.faces.webflow.SpringBeanWebFlowVariableResolver
- org.springframework.faces.webflow.FlowPropertyResolver
org.springframework.faces.webflow.FlowViewHandler