// Create a deep copy, resolving any references for values.
BeanWrapperImpl bwi = (bw instanceof BeanWrapperImpl ? (BeanWrapperImpl) bw : null);
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("bean property '" + propertyName + "'", originalValue);
// Possibly store converted value in merged bean definition,
// in order to avoid re-conversion for every created bean instance.
if (resolvedValue == originalValue) {
if (bwi != null && !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName)) {
pv.setConvertedValue(bwi.convertForProperty(resolvedValue, propertyName));
}
deepCopy.add(pv);
}
else if (originalValue instanceof TypedStringValue &&
bwi != null && !PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName)) {
pv.setConvertedValue(bwi.convertForProperty(resolvedValue, propertyName));
deepCopy.add(pv);
}
else {
resolveNecessary = true;
deepCopy.add(new PropertyValue(pv, resolvedValue));
}
}
}
if (mpvs != null && !resolveNecessary) {
mpvs.setConverted();