Browse Source

intermediate commit - wip bind and validate lifecycle

conversation
Keith Donald 16 years ago
parent
commit
97e7dfb398
  1. 62
      org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java
  2. 5
      org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java
  3. 6
      org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java
  4. 2
      org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java
  5. 2
      org.springframework.context/src/main/java/org/springframework/ui/validation/ValidationResults.java
  6. 2
      org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java

62
org.springframework.context/src/main/java/org/springframework/ui/WebBindAndValidateLifecycle.java

@ -17,47 +17,81 @@ package org.springframework.ui; @@ -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<String, ? extends Object> 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 {

5
org.springframework.context/src/main/java/org/springframework/ui/binding/Binding.java

@ -52,5 +52,10 @@ public interface Binding { @@ -52,5 +52,10 @@ public interface Binding {
*/
String[] getCollectionValues();
/**
* The type of the underlying property associated with this binding.
*/
Class<?>getType();
}

6
org.springframework.context/src/main/java/org/springframework/ui/binding/support/GenericBinder.java

@ -259,7 +259,7 @@ public class GenericBinder implements Binder { @@ -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 { @@ -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) {

2
org.springframework.context/src/main/java/org/springframework/ui/binding/support/WebBinder.java

@ -84,7 +84,7 @@ public class WebBinder extends GenericBinder { @@ -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 {

2
org.springframework.context/src/main/java/org/springframework/ui/validation/ValidateResults.java → org.springframework.context/src/main/java/org/springframework/ui/validation/ValidationResults.java

@ -22,6 +22,6 @@ package org.springframework.ui.validation; @@ -22,6 +22,6 @@ package org.springframework.ui.validation;
* @author Keith Donald
* @since 3.0
*/
public interface ValidateResults {
public interface ValidationResults {
}

2
org.springframework.context/src/main/java/org/springframework/ui/validation/Validator.java

@ -33,6 +33,6 @@ public interface Validator { @@ -33,6 +33,6 @@ public interface Validator {
* @param properties
* @return
*/
ValidateResults validate(Object model, List<String> properties);
ValidationResults validate(Object model, List<String> properties);
}

Loading…
Cancel
Save