optimized debug logging in case of non-convertible collection (SPR-8499)

This commit is contained in:
Juergen Hoeller 2011-07-04 09:43:08 +00:00
parent df8e9b3393
commit 57998293c8
1 changed files with 44 additions and 16 deletions

View File

@ -20,6 +20,7 @@ import java.beans.PropertyEditor;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
@ -461,10 +462,20 @@ class TypeConverterDelegate {
protected Collection convertToTypedCollection( protected Collection convertToTypedCollection(
Collection original, String propertyName, Class requiredType, TypeDescriptor typeDescriptor) { Collection original, String propertyName, Class requiredType, TypeDescriptor typeDescriptor) {
boolean originalAllowed = requiredType.isInstance(original); if (!Collection.class.isAssignableFrom(requiredType)) {
if (!originalAllowed && !Collection.class.isAssignableFrom(requiredType)) {
return original; return original;
} }
boolean approximable = CollectionFactory.isApproximableCollectionType(requiredType);
if (!approximable && !canCreateCopy(requiredType)) {
if (logger.isDebugEnabled()) {
logger.debug("Custom Collection type [" + original.getClass().getName() +
"] does not allow for creating a copy - injecting original Collection as-is");
}
return original;
}
boolean originalAllowed = requiredType.isInstance(original);
typeDescriptor = typeDescriptor.narrow(original); typeDescriptor = typeDescriptor.narrow(original);
TypeDescriptor elementType = typeDescriptor.getElementTypeDescriptor(); TypeDescriptor elementType = typeDescriptor.getElementTypeDescriptor();
if (elementType == null && originalAllowed && if (elementType == null && originalAllowed &&
@ -486,14 +497,14 @@ class TypeConverterDelegate {
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Cannot access Collection of type [" + original.getClass().getName() + logger.debug("Cannot access Collection of type [" + original.getClass().getName() +
"] - injecting original Collection as-is", ex); "] - injecting original Collection as-is: " + ex);
} }
return original; return original;
} }
Collection convertedCopy; Collection convertedCopy;
try { try {
if (CollectionFactory.isApproximableCollectionType(requiredType)) { if (approximable) {
convertedCopy = CollectionFactory.createApproximateCollection(original, original.size()); convertedCopy = CollectionFactory.createApproximateCollection(original, original.size());
} }
else { else {
@ -503,7 +514,7 @@ class TypeConverterDelegate {
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Cannot create copy of Collection type [" + original.getClass().getName() + logger.debug("Cannot create copy of Collection type [" + original.getClass().getName() +
"] - injecting original Collection as-is", ex); "] - injecting original Collection as-is: " + ex);
} }
return original; return original;
} }
@ -512,15 +523,15 @@ class TypeConverterDelegate {
for (; it.hasNext(); i++) { for (; it.hasNext(); i++) {
Object element = it.next(); Object element = it.next();
String indexedPropertyName = buildIndexedPropertyName(propertyName, i); String indexedPropertyName = buildIndexedPropertyName(propertyName, i);
Object convertedElement = convertIfNecessary( Object convertedElement = convertIfNecessary(indexedPropertyName, null, element,
indexedPropertyName, null, element, elementType != null ? elementType.getType() : null , typeDescriptor.getElementTypeDescriptor()); (elementType != null ? elementType.getType() : null) , typeDescriptor.getElementTypeDescriptor());
try { try {
convertedCopy.add(convertedElement); convertedCopy.add(convertedElement);
} }
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Collection type [" + original.getClass().getName() + logger.debug("Collection type [" + original.getClass().getName() +
"] seems to be read-only - injecting original Collection as-is", ex); "] seems to be read-only - injecting original Collection as-is: " + ex);
} }
return original; return original;
} }
@ -533,10 +544,20 @@ class TypeConverterDelegate {
protected Map convertToTypedMap( protected Map convertToTypedMap(
Map original, String propertyName, Class requiredType, TypeDescriptor typeDescriptor) { Map original, String propertyName, Class requiredType, TypeDescriptor typeDescriptor) {
boolean originalAllowed = requiredType.isInstance(original); if (!Map.class.isAssignableFrom(requiredType)) {
if (!originalAllowed && !Map.class.isAssignableFrom(requiredType)) {
return original; return original;
} }
boolean approximable = CollectionFactory.isApproximableMapType(requiredType);
if (!approximable && !canCreateCopy(requiredType)) {
if (logger.isDebugEnabled()) {
logger.debug("Custom Map type [" + original.getClass().getName() +
"] does not allow for creating a copy - injecting original Map as-is");
}
return original;
}
boolean originalAllowed = requiredType.isInstance(original);
typeDescriptor = typeDescriptor.narrow(original); typeDescriptor = typeDescriptor.narrow(original);
TypeDescriptor keyType = typeDescriptor.getMapKeyTypeDescriptor(); TypeDescriptor keyType = typeDescriptor.getMapKeyTypeDescriptor();
TypeDescriptor valueType = typeDescriptor.getMapValueTypeDescriptor(); TypeDescriptor valueType = typeDescriptor.getMapValueTypeDescriptor();
@ -559,14 +580,14 @@ class TypeConverterDelegate {
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Cannot access Map of type [" + original.getClass().getName() + logger.debug("Cannot access Map of type [" + original.getClass().getName() +
"] - injecting original Map as-is", ex); "] - injecting original Map as-is: " + ex);
} }
return original; return original;
} }
Map convertedCopy; Map convertedCopy;
try { try {
if (CollectionFactory.isApproximableMapType(requiredType)) { if (approximable) {
convertedCopy = CollectionFactory.createApproximateMap(original, original.size()); convertedCopy = CollectionFactory.createApproximateMap(original, original.size());
} }
else { else {
@ -576,7 +597,7 @@ class TypeConverterDelegate {
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Cannot create copy of Map type [" + original.getClass().getName() + logger.debug("Cannot create copy of Map type [" + original.getClass().getName() +
"] - injecting original Map as-is", ex); "] - injecting original Map as-is: " + ex);
} }
return original; return original;
} }
@ -586,15 +607,17 @@ class TypeConverterDelegate {
Object key = entry.getKey(); Object key = entry.getKey();
Object value = entry.getValue(); Object value = entry.getValue();
String keyedPropertyName = buildKeyedPropertyName(propertyName, key); String keyedPropertyName = buildKeyedPropertyName(propertyName, key);
Object convertedKey = convertIfNecessary(keyedPropertyName, null, key, keyType != null ? keyType.getType() : null, typeDescriptor.getMapKeyTypeDescriptor()); Object convertedKey = convertIfNecessary(keyedPropertyName, null, key,
Object convertedValue = convertIfNecessary(keyedPropertyName, null, value, valueType!= null ? valueType.getType() : null, typeDescriptor.getMapValueTypeDescriptor()); (keyType != null ? keyType.getType() : null), typeDescriptor.getMapKeyTypeDescriptor());
Object convertedValue = convertIfNecessary(keyedPropertyName, null, value,
(valueType!= null ? valueType.getType() : null), typeDescriptor.getMapValueTypeDescriptor());
try { try {
convertedCopy.put(convertedKey, convertedValue); convertedCopy.put(convertedKey, convertedValue);
} }
catch (Throwable ex) { catch (Throwable ex) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Map type [" + original.getClass().getName() + logger.debug("Map type [" + original.getClass().getName() +
"] seems to be read-only - injecting original Map as-is", ex); "] seems to be read-only - injecting original Map as-is: " + ex);
} }
return original; return original;
} }
@ -615,4 +638,9 @@ class TypeConverterDelegate {
null); null);
} }
private boolean canCreateCopy(Class requiredType) {
return (!requiredType.isInterface() && !Modifier.isAbstract(requiredType.getModifiers()) &&
Modifier.isPublic(requiredType.getModifiers()) && ClassUtils.hasConstructor(requiredType));
}
} }