From 97e7dfb398bd0249bef263a473fe90bf338532f5 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Sat, 13 Jun 2009 12:45:25 +0000 Subject: [PATCH] intermediate commit - wip bind and validate lifecycle --- .../ui/WebBindAndValidateLifecycle.java | 62 ++++++++++++++----- .../springframework/ui/binding/Binding.java | 5 ++ .../ui/binding/support/GenericBinder.java | 6 +- .../ui/binding/support/WebBinder.java | 2 +- ...ateResults.java => ValidationResults.java} | 2 +- .../ui/validation/Validator.java | 2 +- 6 files changed, 59 insertions(+), 20 deletions(-) rename org.springframework.context/src/main/java/org/springframework/ui/validation/{ValidateResults.java => ValidationResults.java} (95%) diff --git a/org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java b/org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java index 6d8f2cf9bd8..90f529aa454 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java @@ -17,47 +17,81 @@ package org.springframework.ui; import java.util.Map; +import org.springframework.ui.binding.BindingResult; import org.springframework.ui.binding.BindingResults; import org.springframework.ui.binding.UserValues; import org.springframework.ui.binding.support.WebBinder; +import org.springframework.ui.message.MessageBuilder; import org.springframework.ui.message.MessageContext; -import org.springframework.ui.validation.ValidateResults; +import org.springframework.ui.validation.ValidationResults; import org.springframework.ui.validation.Validator; -/** - * TODO Document WebBindAndValidateLifecycle. - * - * @author Keith Donald - * @since 3.0 - */ public class WebBindAndValidateLifecycle { private final WebBinder binder; + @SuppressWarnings("unused") private final MessageContext messageContext; private ValidationDecider validationDecider = ValidationDecider.ALWAYS_VALIDATE; - private Validator validator = null; + private Validator validator; public WebBindAndValidateLifecycle(Object model, MessageContext messageContext) { this.binder = new WebBinder(model); this.messageContext = messageContext; } - /** - * TODO Document execute(). - * - * @param userMap - */ public void execute(Map userMap) { UserValues values = binder.createUserValues(userMap); BindingResults bindingResults = binder.bind(values); if (validationDecider.shouldValidateAfter(bindingResults)) { - ValidateResults validationResults = validator.validate(binder.getModel(), bindingResults.successes() + ValidationResults validationResults = validator.validate(binder.getModel(), bindingResults.successes() .properties()); } // TODO translate binding and validation results into messages + MessageBuilder builder = new MessageBuilder(); + for (BindingResult result : bindingResults.failures()) { + builder. + code(modelPropertyError(result)). + code(propertyError(result)). + code(typeError(result)). + code(error(result)). + //argContextFactory(createContextFactory(bindingResult)). + // TODO arg names + // TODO el support including ability to setup evaluation context + //resolvableArg("label", getModelProperty(result)). + //arg("value", result.getUserValue()). + //arg("binding", binder.getBinding(result.getProperty())). + //args(result.getErrorArguments()). + build(); + } + // TODO expose property Binding in EL context for property error message resolution? + } + + private String modelPropertyError(BindingResult result) { + return getModelProperty(result) + "." + result.getErrorCode(); + } + + private String propertyError(BindingResult result) { + return result.getProperty() + "." + result.getErrorCode(); + } + + private String typeError(BindingResult result) { + return binder.getBinding(result.getProperty()).getType().getName() + "." + result.getErrorCode(); + } + + private String error(BindingResult result) { + return result.getErrorCode(); + } + + private String getModelProperty(BindingResult result) { + return getModel() + "." + result.getProperty(); + } + + private String getModel() { + // TODO would be nice if model name was module.ClassName by default where module is subpackage of app base package + return binder.getModel().getClass().getName(); } interface ValidationDecider { diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java index 1c9dbcd5c4e..abf899d5ef6 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java @@ -52,5 +52,10 @@ public interface Binding { */ String[] getCollectionValues(); + /** + * The type of the underlying property associated with this binding. + */ + ClassgetType(); + } \ No newline at end of file diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java index 5e3783ba741..398309d2f89 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java @@ -259,7 +259,7 @@ public class GenericBinder implements Binder { } public boolean isCollection() { - Class type = getValueType(); + Class type = getType(); TypeDescriptor typeDesc = TypeDescriptor.valueOf(type); return typeDesc.isCollection() || typeDesc.isArray(); } @@ -291,8 +291,8 @@ public class GenericBinder implements Binder { // public impl only - public Class getValueType() { - Class type; + public Class getType() { + Class type; try { type = property.getValueType(createEvaluationContext()); } catch (EvaluationException e) { diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java index 8b3ed693540..9e21432212c 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java @@ -84,7 +84,7 @@ public class WebBinder extends GenericBinder { } protected Object getEmptyValue(BindingImpl binding) { - Class type = binding.getValueType(); + Class type = binding.getType(); if (boolean.class.equals(type) || Boolean.class.equals(type)) { return Boolean.FALSE; } else { diff --git a/org.springframework.context/src/main/java/org/springframework/ui/validation/ValidateResults.java b/org.springframework.context/src/main/java/org/springframework/ui/validation/ValidationResults.java similarity index 95% rename from org.springframework.context/src/main/java/org/springframework/ui/validation/ValidateResults.java rename to org.springframework.context/src/main/java/org/springframework/ui/validation/ValidationResults.java index 9dd8e7ea7fd..f5f3e6b0a9b 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/validation/ValidateResults.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/validation/ValidationResults.java @@ -22,6 +22,6 @@ package org.springframework.ui.validation; * @author Keith Donald * @since 3.0 */ -public interface ValidateResults { +public interface ValidationResults { } diff --git a/org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java b/org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java index 97ddf7785fd..ddea81bbc8d 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java @@ -33,6 +33,6 @@ public interface Validator { * @param properties * @return */ - ValidateResults validate(Object model, List properties); + ValidationResults validate(Object model, List properties); }