// Create a deep copy, resolving any references for values.
List deepCopy = new ArrayList(original.size());
boolean resolveNecessary = false;
for (Iterator it = original.iterator(); it.hasNext();) {
PropertyValue pv = (PropertyValue) it.next();
if (pv.isConverted()) {
deepCopy.add(pv);
}
else {
String propertyName = pv.getName();
Object originalValue = pv.getValue();
Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
// Possibly store converted value in merged bean definition,
// in order to avoid re-conversion for every created bean instance.
if (resolvedValue == originalValue) {
if (!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName)) {
pv.setConvertedValue(convertForProperty(resolvedValue, propertyName, bw, converter));
}
deepCopy.add(pv);
}
else if (originalValue instanceof TypedStringValue &&
!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName)) {
pv.setConvertedValue(convertForProperty(resolvedValue, propertyName, bw, converter));
deepCopy.add(pv);
}
else {
resolveNecessary = true;
deepCopy.add(new PropertyValue(pv, resolvedValue));
}
}
}
if (mpvs != null && !resolveNecessary) {
mpvs.setConverted();