From 12486677c03600848a4d5822a87844eeaf995e43 Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Tue, 15 Apr 2008 22:04:39 +0000 Subject: [PATCH] SWF-611- Provide easy access to a flow's local MessageSource through EL in JSF templates. --- .../webflow/FlowMessageSourceResolver.java | 72 +++++++++++++++++++ .../faces/webflow/FlowPropertyResolver.java | 1 + .../faces/webflow/FlowVariableResolver.java | 1 + .../main/resources/META-INF/faces-config.xml | 2 +- 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 spring-faces/src/main/java/org/springframework/faces/webflow/FlowMessageSourceResolver.java 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