ELResolver elResolver = facesContext.getApplication().getELResolver();
ELContext elContext = facesContext.getELContext();
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 = elResolver.getValue(elContext, 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 = elResolver.getValue(elContext, 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 = elResolver
.getType(elContext, 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 = coerceToType(facesContext, value, propertyClass);
elResolver.setValue(
elContext, bean, property.getPropertyName(), coercedValue);
}
}