package org.springframework.webflow.engine.builder;
import java.util.LinkedHashSet;
import java.util.Set;
import org.springframework.core.style.ToStringCreator;
import org.springframework.util.Assert;
/**
* Contains the information needed to bind model to a view. This information consists of one or more {@link Binding
* bindings} that connect properties of the model to UI elements of the view.
*
* @see ViewFactoryCreator
*
* @author Keith Donald
*/
public class BinderConfiguration {
private Set<Binding> bindings = new LinkedHashSet<Binding>();
/**
* Adds a new binding to this binding configuration.
* @param binding the binding
*/
public void addBinding(Binding binding) {
bindings.add(binding);
}
/**
* Returns the set of bindings associated with this binding configuration.
*/
public Set<Binding> getBindings() {
return bindings;
}
/**
* Gets the binding with the specified name, or returns null if no such binding is found.
* @param name the name of the binding.
* @return the binding
*/
public Binding getBinding(String name) {
for (Binding binding : bindings) {
if (name.equals(binding.getProperty())) {
return binding;
}
}
return null;
}
/**
* Gets the converterId for the binding with the specified name. Returns null if either a binding or a converterId
* for the given name is not found.
*
* @param name the name of the binding.
* @return the binding
*/
public String getConverterId(String name) {
Binding binding = getBinding(name);
if (binding != null) {
return binding.getConverter();
} else {
return null;
}
}
/**
* A binding that provides the information needed to connect an element of the view to a property of the model.
*
* @author Keith Donald
*/
public static final class Binding {
private String property;
private String converter;
private boolean required;
/**
* Creates a new view binding
* @param property the model property to bind to
* @param converter the id of a custom converter to apply type conversion during binding
* @param required whether this binding is required
*/
public Binding(String property, String converter, boolean required) {
Assert.hasText(property, "The property is required");
this.property = property;
this.converter = converter;
this.required = required;
}
public boolean equals(Object object) {
if (!(object instanceof Binding)) {
return false;
}
Binding binding = (Binding) object;
return property.equals(binding.property);
}
public int hashCode() {
return property.hashCode();
}
/**
* The name of the bound property.
* @return the property
*/
public String getProperty() {
return property;
}
/**
* The id of the custom converter to use to convert bound property values.
* @return the converter id, or null
*/
public String getConverter() {
return converter;
}
/**
* Whether a non-empty value is required for each binding attempt.
* @return the required status
*/
public boolean getRequired() {
return required;
}
public String toString() {
return new ToStringCreator(this).append("property", property).append("converter", converter)
.append("required", required).toString();
}
}
}