From 86abbc2b5929eb40d65d76fc30c940f8b3673a74 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Wed, 17 Jun 2009 03:12:44 +0000 Subject: [PATCH] message argument accessor - thanks andy git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1392 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../WebBindAndValidateLifecycle.java | 19 +++++---- .../ui/message/DefaultMessageResolver.java | 41 +++++++++++-------- .../ui/message/MessageBuilderTests.java | 2 - .../support/DefaultMessageContextTests.java | 2 - 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/ui/lifecycle/WebBindAndValidateLifecycle.java b/org.springframework.context/src/main/java/org/springframework/ui/lifecycle/WebBindAndValidateLifecycle.java index 594fc861564..22a386a0fc0 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/lifecycle/WebBindAndValidateLifecycle.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/lifecycle/WebBindAndValidateLifecycle.java @@ -56,15 +56,20 @@ public class WebBindAndValidateLifecycle { // TODO get validation results validator.validate(binder.getModel(), bindingResults.successes().properties()); } + // TODO make message translation pluggable MessageBuilder builder = new MessageBuilder(); for (BindingResult result : bindingResults.failures()) { - MessageResolver message = builder.code(modelPropertyError(result)).code(propertyError(result)).code( - typeError(result)).code(error(result)).resolvableArg("label", getModelProperty(result)).arg( - "value", result.getUserValue()). - // TODO add binding el resolver allowing binding.format to be called - arg("binding", binder.getBinding(result.getProperty())). - // TODO allow binding result to contribute additional arguments - build(); + MessageResolver message = builder. + code(modelPropertyError(result)). + code(propertyError(result)). + code(typeError(result)). + code(error(result)). + resolvableArg("label", getModelProperty(result)). + arg("value", result.getUserValue()). + // TODO add binding el resolver allowing binding.format to be called + arg("binding", binder.getBinding(result.getProperty())). + // TODO allow binding result to contribute additional arguments + build(); // TODO should model name be part of element id? messageContext.add(message, result.getProperty()); } diff --git a/org.springframework.context/src/main/java/org/springframework/ui/message/DefaultMessageResolver.java b/org.springframework.context/src/main/java/org/springframework/ui/message/DefaultMessageResolver.java index 3a91d052198..bc9a0e2fce1 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/message/DefaultMessageResolver.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/message/DefaultMessageResolver.java @@ -20,7 +20,6 @@ import java.util.Map; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; -import org.springframework.context.expression.MapAccessor; import org.springframework.core.style.ToStringCreator; import org.springframework.expression.AccessException; import org.springframework.expression.EvaluationContext; @@ -40,13 +39,13 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso private String[] codes; private Map args; - + private String defaultText; private ExpressionParser expressionParser; - public DefaultMessageResolver(Severity severity, String[] codes, Map args, - String defaultText, ExpressionParser expressionParser) { + public DefaultMessageResolver(Severity severity, String[] codes, Map args, String defaultText, + ExpressionParser expressionParser) { this.severity = severity; this.codes = codes; this.args = args; @@ -67,8 +66,7 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso try { StandardEvaluationContext context = new StandardEvaluationContext(); context.setRootObject(args); - context.addPropertyAccessor(new MapAccessor()); - context.addPropertyAccessor(new MessageSourceResolvableAccessor(messageSource, locale)); + context.addPropertyAccessor(new MessageArgumentAccessor(messageSource, locale)); String text = (String) message.getValue(context); return new TextMessage(severity, text); } catch (EvaluationException e) { @@ -116,37 +114,44 @@ final class DefaultMessageResolver implements MessageResolver, MessageSourceReso } - private static class MessageSourceResolvableAccessor implements PropertyAccessor { + static class MessageArgumentAccessor implements PropertyAccessor { private MessageSource messageSource; private Locale locale; - - public MessageSourceResolvableAccessor(MessageSource messageSource, Locale locale) { + + public MessageArgumentAccessor(MessageSource messageSource, Locale locale) { this.messageSource = messageSource; this.locale = locale; } public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException { - return true; + return (((Map) target).containsKey(name)); } public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException { - // TODO this does not get called when resolving MessageSourceResolvable variables; only when accessing properties on MessageSourceResolvable targets. - return new TypedValue(messageSource.getMessage((MessageSourceResolvable)target, locale)); + Object o = ((Map) target).get(name); + if (o instanceof MessageSourceResolvable) { + String message = messageSource.getMessage((MessageSourceResolvable) o, locale); + return new TypedValue(message); + } else { + return new TypedValue(o); + } } - + public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException { return false; } - public void write(EvaluationContext context, Object target, String name, Object newValue) throws AccessException { + public void write(EvaluationContext context, Object target, String name, Object newValue) + throws AccessException { throw new UnsupportedOperationException("Should not be called"); } - - public Class[] getSpecificTargetClasses() { - return new Class[] { MessageSourceResolvable.class }; - } + public Class[] getSpecificTargetClasses() { + return new Class[] { Map.class }; + } + } + } \ No newline at end of file diff --git a/org.springframework.context/src/test/java/org/springframework/ui/message/MessageBuilderTests.java b/org.springframework.context/src/test/java/org/springframework/ui/message/MessageBuilderTests.java index c28558fda8c..7328e9e2ae1 100644 --- a/org.springframework.context/src/test/java/org/springframework/ui/message/MessageBuilderTests.java +++ b/org.springframework.context/src/test/java/org/springframework/ui/message/MessageBuilderTests.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertEquals; import java.util.Locale; -import org.junit.Ignore; import org.junit.Test; public class MessageBuilderTests { @@ -12,7 +11,6 @@ public class MessageBuilderTests { private MessageBuilder builder = new MessageBuilder(); @Test - @Ignore public void buildMessage() { MessageResolver resolver = builder.severity(Severity.ERROR).code("invalidFormat").resolvableArg("label", "mathForm.decimalField") .arg("format", "#,###.##").defaultText("Field must be in format #,###.##").build(); diff --git a/org.springframework.context/src/test/java/org/springframework/ui/message/support/DefaultMessageContextTests.java b/org.springframework.context/src/test/java/org/springframework/ui/message/support/DefaultMessageContextTests.java index 7da88917a83..0c203309e26 100644 --- a/org.springframework.context/src/test/java/org/springframework/ui/message/support/DefaultMessageContextTests.java +++ b/org.springframework.context/src/test/java/org/springframework/ui/message/support/DefaultMessageContextTests.java @@ -8,7 +8,6 @@ import java.util.Map; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.ui.message.Message; @@ -36,7 +35,6 @@ public class DefaultMessageContextTests { } @Test - @Ignore public void addMessage() { MessageBuilder builder = new MessageBuilder(); MessageResolver message = builder.severity(Severity.ERROR).code("invalidFormat").resolvableArg("label",