提交 f0ca94d5 编写于 作者: K Keith Donald

new presentation model methods; ability to surpress commit of dirty value in PMB

上级 0f434883
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
*/ */
package org.springframework.model.ui; package org.springframework.model.ui;
/** /**
* Represents the state and behavior of a presentation independently of the GUI controls used in the interface. * Represents the state and behavior of a presentation independently of the GUI controls used in the interface.
* Pulls the state and behavior of a view out into a model class that is part of the presentation. * Pulls the state and behavior of a view out into a model class that is part of the presentation.
...@@ -32,4 +31,22 @@ public interface PresentationModel { ...@@ -32,4 +31,22 @@ public interface PresentationModel {
*/ */
FieldModel getFieldModel(String fieldName); FieldModel getFieldModel(String fieldName);
/**
* If errors are present on this PresentationModel.
* Returns true if at least one FieldModel has {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values} or is {@link ValidationStatus#INVALID invalid}.
*/
boolean hasErrors();
/**
* Commit any {@link BindingStatus#DIRTY dirty} fields.
* @throws IllegalStateException if there are field models that have {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values} or are {@link ValidationStatus#INVALID invalid}.
*/
void commit();
/**
* Validate all fields.
* Skips any fields with {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values}.
*/
void validate();
} }
\ No newline at end of file
...@@ -143,6 +143,20 @@ public class DefaultPresentationModel implements PresentationModel { ...@@ -143,6 +143,20 @@ public class DefaultPresentationModel implements PresentationModel {
return field; return field;
} }
public boolean hasErrors() {
return false;
}
public void commit() {
}
public void validate() {
}
// internal helpers
private PropertyFieldModelRule getRule(String fieldName) { private PropertyFieldModelRule getRule(String fieldName) {
PropertyFieldModelRule rule = fieldModelRules.get(fieldName); PropertyFieldModelRule rule = fieldModelRules.get(fieldName);
if (rule == null) { if (rule == null) {
......
...@@ -35,28 +35,36 @@ import org.springframework.model.ui.PresentationModel; ...@@ -35,28 +35,36 @@ import org.springframework.model.ui.PresentationModel;
* @since 3.0 * @since 3.0
* @see #setMessageSource(MessageSource) * @see #setMessageSource(MessageSource)
* @see #setRequiredFields(String[]) * @see #setRequiredFields(String[])
* @see #setCommitDirtyValue(boolean)
* @see #bind(Map, PresentationModel) * @see #bind(Map, PresentationModel)
*/ */
public class PresentationModelBinder extends AbstractBinder<PresentationModel> { public class PresentationModelBinder extends AbstractBinder<PresentationModel> {
// subclassing hooks private boolean commitDirtyValue;
/**
* Configures if this PresentationModelBinder should eagerly commit the dirty value after a successful field binding.
* Default is false.
*/
public void setCommitDirtyValue(boolean commitDirtyValue) {
this.commitDirtyValue = commitDirtyValue;
}
// subclass hooks
@Override @Override
protected FieldBinder createFieldBinder(PresentationModel model) { protected FieldBinder createFieldBinder(PresentationModel model) {
return new FieldModelBinder(model, getMessageSource()); return new FieldModelBinder(model);
} }
// internal helpers // internal helpers
private static class FieldModelBinder implements FieldBinder { private class FieldModelBinder implements FieldBinder {
private PresentationModel presentationModel; private PresentationModel presentationModel;
private MessageSource messageSource; public FieldModelBinder(PresentationModel presentationModel) {
public FieldModelBinder(PresentationModel presentationModel, MessageSource messageSource) {
this.presentationModel = presentationModel; this.presentationModel = presentationModel;
this.messageSource = messageSource;
} }
public BindingResult bind(String fieldName, Object value) { public BindingResult bind(String fieldName, Object value) {
...@@ -64,13 +72,13 @@ public class PresentationModelBinder extends AbstractBinder<PresentationModel> { ...@@ -64,13 +72,13 @@ public class PresentationModelBinder extends AbstractBinder<PresentationModel> {
try { try {
field = presentationModel.getFieldModel(fieldName); field = presentationModel.getFieldModel(fieldName);
} catch (FieldNotFoundException e) { } catch (FieldNotFoundException e) {
return new FieldNotFoundResult(fieldName, value, messageSource); return new FieldNotFoundResult(fieldName, value, getMessageSource());
} }
if (!field.isEditable()) { if (!field.isEditable()) {
return new FieldNotEditableResult(fieldName, value, messageSource); return new FieldNotEditableResult(fieldName, value, getMessageSource());
} else { } else {
field.applySubmittedValue(value); field.applySubmittedValue(value);
if (field.getBindingStatus() == BindingStatus.DIRTY) { if (field.getBindingStatus() == BindingStatus.DIRTY && commitDirtyValue) {
field.commit(); field.commit();
} }
return new AlertBindingResult(fieldName, value, field.getStatusAlert()); return new AlertBindingResult(fieldName, value, field.getStatusAlert());
......
...@@ -48,6 +48,7 @@ public class PresentationModelBinderTests { ...@@ -48,6 +48,7 @@ public class PresentationModelBinderTests {
bean = new TestBean(); bean = new TestBean();
presentationModel = new DefaultPresentationModel(bean); presentationModel = new DefaultPresentationModel(bean);
binder = new PresentationModelBinder(); binder = new PresentationModelBinder();
binder.setCommitDirtyValue(true);
LocaleContextHolder.setLocale(Locale.US); LocaleContextHolder.setLocale(Locale.US);
} }
......
...@@ -35,6 +35,7 @@ public class WebBinderTests { ...@@ -35,6 +35,7 @@ public class WebBinderTests {
LocaleContextHolder.setLocale(Locale.US); LocaleContextHolder.setLocale(Locale.US);
presentationModel = new DefaultPresentationModel(bean); presentationModel = new DefaultPresentationModel(bean);
binder = new WebBinder(); binder = new WebBinder();
binder.setCommitDirtyValue(true);
} }
@After @After
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册