From 9be56a39b41077fb517b86539e556d0a4f83cf36 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Tue, 14 Jul 2009 13:58:39 +0000 Subject: [PATCH] moved binding configuration to publis binder api --- .../springframework/ui/binding/Binder.java | 21 +++++++++++++++++++ .../{support => }/BindingConfiguration.java | 5 +++-- .../support/DefaultBindingConfiguration.java | 1 + .../ui/binding/support/GenericBinder.java | 5 +++-- 4 files changed, 28 insertions(+), 4 deletions(-) rename org.springframework.context/src/main/java/org/springframework/ui/binding/{support => }/BindingConfiguration.java (91%) diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java index 2696ee9294e..973ed78137d 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/Binder.java @@ -21,6 +21,7 @@ import java.util.Map; * Binds user-entered values to properties of a model object. * @author Keith Donald * @since 3.0 + * @see #addBinding(String) * @see #getBinding(String) * @see #bind(Map) */ @@ -31,6 +32,26 @@ public interface Binder { */ Object getModel(); + /** + * Add a binding to a model property. + * The property may be a path to a member property like "name", or a nested property like "address.city" or "addresses.city". + * If the property path is nested and traverses a collection or Map, do not use indexes. + * The property path should express the model-class property structure like addresses.city, not an object structure like addresses[0].city. + * Examples: + *
+	 * name - bind to property 'name'
+	 * addresses - bind to property 'addresses', presumably a List<Address> e.g. allowing property expressions like addresses={ 12345 Macy Lane, 1977 Bel Aire Estates } and addresses[0]=12345 Macy Lane
+	 * addresses.city - bind to property 'addresses.city', for all indexed addresses in the collection e.g. allowing property expressions like addresses[0].city=Melbourne
+	 * address.city - bind to property 'address.city'
+	 * favoriteFoodByFoodGroup - bind to property 'favoriteFoodByFoodGroup', presumably a Map; e.g. allowing favoriteFoodByFoodGroup={ DAIRY=Milk, MEAT=Steak } and favoriteFoodByFoodGroup['DAIRY']=Milk
+	 * favoriteFoodByFoodGroup.name - bind to property 'favoriteFoodByFoodGroup.name', for all keyed Foods in the map; e.g. allowing favoriteFoodByFoodGroup['DAIRY'].name=Milk
+	 * 
+ * @param propertyPath the model property path + * @return a BindingConfiguration object, allowing additional configuration of the newly added binding + * @throws IllegalArgumentException if no such property path exists on the model + */ + public BindingConfiguration addBinding(String propertyPath); + /** * Get a binding to a model property.. * @param property the property path diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java similarity index 91% rename from org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java rename to org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java index c74f091ea74..81420e6890b 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/BindingConfiguration.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/BindingConfiguration.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ui.binding.support; +package org.springframework.ui.binding; +import org.springframework.ui.binding.support.GenericBinder; import org.springframework.ui.format.Formatter; /** - * A fluent interface for configuring a newly added binding to a property path. + * A fluent interface for configuring a newly added binding. * @author Keith Donald * @see GenericBinder#addBinding(String) */ diff --git a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java index dadcfe735a7..308af77d892 100644 --- a/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java +++ b/org.springframework.context/src/main/java/org/springframework/ui/binding/support/DefaultBindingConfiguration.java @@ -15,6 +15,7 @@ */ package org.springframework.ui.binding.support; +import org.springframework.ui.binding.BindingConfiguration; import org.springframework.ui.format.Formatter; final class DefaultBindingConfiguration implements BindingConfiguration { 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 ee7845c7211..f898d2204c4 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 @@ -55,6 +55,7 @@ import org.springframework.ui.alert.Alert; import org.springframework.ui.alert.Severity; import org.springframework.ui.binding.Binder; import org.springframework.ui.binding.Binding; +import org.springframework.ui.binding.BindingConfiguration; import org.springframework.ui.binding.BindingResult; import org.springframework.ui.binding.BindingResults; import org.springframework.ui.binding.MissingSourceValuesException; @@ -84,7 +85,7 @@ public class GenericBinder implements Binder { private Object model; - private Set bindingFactories; + public Set bindingFactories; private FormatterRegistry formatterRegistry = new GenericFormatterRegistry(); @@ -269,7 +270,7 @@ public class GenericBinder implements Binder { return context; } - class BindingFactory { + public class BindingFactory { private DefaultBindingConfiguration configuration;