package org.robobinding.viewattribute.property;
import org.robobinding.BindingContext;
import org.robobinding.attribute.ValueModelAttribute;
import org.robobinding.viewattribute.AttributeBindingException;
import org.robobinding.viewattribute.ViewAttributeBinder;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Robert Taylor
* @author Cheng Wei
*/
public class MultiTypePropertyViewAttributeBinder implements ViewAttributeBinder {
private final PropertyViewAttributeBinderProvider viewAttributeBinderProvider;
private final ValueModelAttribute attribute;
private PropertyViewAttributeBinder viewAttributeBinder;
public MultiTypePropertyViewAttributeBinder(PropertyViewAttributeBinderProvider viewAttributeBinderProvider,
ValueModelAttribute attribute) {
this.viewAttributeBinderProvider = viewAttributeBinderProvider;
this.attribute = attribute;
}
@Override
public void bindTo(BindingContext bindingContext) {
try {
initializeViewAttributeBinder(bindingContext);
performBind(bindingContext);
} catch (RuntimeException e) {
throw new AttributeBindingException(attribute.getName(), e);
}
}
private void initializeViewAttributeBinder(BindingContext presentationModelAdapter) {
Class<?> propertyType = presentationModelAdapter.getPropertyType(attribute.getPropertyName());
viewAttributeBinder = viewAttributeBinderProvider.create(propertyType);
if (viewAttributeBinder == null)
throw new RuntimeException("Could not find a suitable attribute in " + getClass().getName() + " for property type: " + propertyType);
}
private void performBind(BindingContext bindingContext) {
viewAttributeBinder.bindTo(bindingContext);
}
@Override
public void preInitializeView(BindingContext bindingContext) {
viewAttributeBinder.preInitializeView(bindingContext);
}
}