001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.validation;
018:
019: import java.beans.PropertyEditor;
020:
021: import org.springframework.beans.ConfigurablePropertyAccessor;
022: import org.springframework.beans.PropertyAccessorUtils;
023: import org.springframework.beans.PropertyEditorRegistry;
024:
025: /**
026: * Abstract base class for BindingResult implementations that work with
027: * Spring's PropertyAccessor mechanism. Pre-implements field access
028: * through delegation to the corresponding PropertyAccessor methods.
029: *
030: * @author Juergen Hoeller
031: * @since 2.0
032: * @see #getPropertyAccessor()
033: * @see org.springframework.beans.PropertyAccessor
034: * @see org.springframework.beans.ConfigurablePropertyAccessor
035: */
036: public abstract class AbstractPropertyBindingResult extends
037: AbstractBindingResult {
038:
039: /**
040: * Create a new AbstractPropertyBindingResult instance.
041: * @param objectName the name of the target object
042: * @see DefaultMessageCodesResolver
043: */
044: protected AbstractPropertyBindingResult(String objectName) {
045: super (objectName);
046: }
047:
048: /**
049: * Returns the underlying PropertyAccessor.
050: * @see #getPropertyAccessor()
051: */
052: public PropertyEditorRegistry getPropertyEditorRegistry() {
053: return getPropertyAccessor();
054: }
055:
056: /**
057: * Returns the canonical property name.
058: * @see org.springframework.beans.PropertyAccessorUtils#canonicalPropertyName
059: */
060: protected String canonicalFieldName(String field) {
061: return PropertyAccessorUtils.canonicalPropertyName(field);
062: }
063:
064: /**
065: * Determines the field type from the property type.
066: * @see #getPropertyAccessor()
067: */
068: public Class getFieldType(String field) {
069: return getPropertyAccessor().getPropertyType(field);
070: }
071:
072: /**
073: * Fetches the field value from the PropertyAccessor.
074: * @see #getPropertyAccessor()
075: */
076: protected Object getActualFieldValue(String field) {
077: return getPropertyAccessor().getPropertyValue(field);
078: }
079:
080: /**
081: * Formats the field value based on registered PropertyEditors.
082: * @see #getCustomEditor
083: */
084: protected Object formatFieldValue(String field, Object value) {
085: PropertyEditor customEditor = getCustomEditor(field);
086: if (customEditor != null) {
087: customEditor.setValue(value);
088: String textValue = customEditor.getAsText();
089: // If the PropertyEditor returned null, there is no appropriate
090: // text representation for this value: only use it if non-null.
091: if (textValue != null) {
092: return textValue;
093: }
094: }
095: return value;
096: }
097:
098: /**
099: * Retrieve the custom PropertyEditor for the given field, if any.
100: * @param field the field name
101: * @return the custom PropertyEditor, or <code>null</code>
102: */
103: public PropertyEditor getCustomEditor(String field) {
104: String fixedField = fixedField(field);
105: Class type = getPropertyAccessor().getPropertyType(fixedField);
106: return getPropertyAccessor().findCustomEditor(type, fixedField);
107: }
108:
109: /**
110: * Provide the PropertyAccessor to work with, according to the
111: * concrete strategy of access.
112: * <p>Note that a PropertyAccessor used by a BindingResult should
113: * always have its "extractOldValueForEditor" flag set to "true"
114: * by default, since this is typically possible without side effects
115: * for model objects that serve as data binding target.
116: * @see ConfigurablePropertyAccessor#setExtractOldValueForEditor
117: */
118: public abstract ConfigurablePropertyAccessor getPropertyAccessor();
119:
120: }
|