}
private void initializeProperties(FacesContext facesContext, Iterator managedProperties, String targetScope, Object bean)
{
PropertyResolver propertyResolver =
facesContext.getApplication().getPropertyResolver();
while (managedProperties.hasNext())
{
ManagedProperty property = (ManagedProperty) managedProperties.next();
Object value = null;
switch (property.getType())
{
case ManagedProperty.TYPE_LIST:
// JSF 1.1, 5.3.1.3
// Call the property getter, if it exists.
// If the getter returns null or doesn't exist, create a java.util.ArrayList,
// otherwise use the returned Object ...
if(PropertyUtils.isReadable(bean, property.getPropertyName()))
value = propertyResolver.getValue(bean, property.getPropertyName());
value = value == null ? new ArrayList() : value;
if (value instanceof List) {
initializeList(facesContext, property.getListEntries(), (List) value);
} else if (value != null && value.getClass().isArray()) {
int length = Array.getLength(value);
ArrayList temp = new ArrayList(length);
for (int i = 0; i < length; i++) {
temp.add(Array.get(value, i));
}
initializeList(facesContext, property.getListEntries(), temp);
value = Array.newInstance(value.getClass().getComponentType(), temp.size());
length = temp.size();
for (int i = 0; i < length; i++) {
Array.set(value, i, temp.get(i));
}
} else {
value = new ArrayList();
initializeList(facesContext, property.getListEntries(), (List) value);
}
break;
case ManagedProperty.TYPE_MAP:
// JSF 1.1, 5.3.1.3
// Call the property getter, if it exists.
// If the getter returns null or doesn't exist, create a java.util.HashMap,
// otherwise use the returned java.util.Map .
if(PropertyUtils.isReadable(bean, property.getPropertyName()))
value = propertyResolver.getValue(bean, property.getPropertyName());
value = value == null ? new HashMap() : value;
if (! (value instanceof Map)) {
value = new HashMap();
}
initializeMap(facesContext, property.getMapEntries(), (Map) value);
break;
case ManagedProperty.TYPE_NULL:
value = null;
break;
case ManagedProperty.TYPE_VALUE:
// check for correct scope of a referenced bean
if (! isInValidScope(facesContext, property, targetScope)) {
throw new FacesException("Property " + property.getPropertyName() +
" references object in a scope with shorter lifetime than the target scope " + targetScope);
}
value = property.getRuntimeValue(facesContext);
break;
}
Class propertyClass = null;
if (property.getPropertyClass() == null)
{
propertyClass = propertyResolver
.getType(bean, property.getPropertyName());
}
else
{
propertyClass = ClassUtils
.simpleJavaTypeToClass(property.getPropertyClass());
}
if(null == propertyClass) {
throw new IllegalArgumentException("unable to find the type of property " + property.getPropertyName());
}
Object coercedValue = ClassUtils.convertToType(value, propertyClass);
propertyResolver.setValue(
bean, property.getPropertyName(), coercedValue);
}
}