Browse Source
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@1974 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/head
21 changed files with 592 additions and 498 deletions
@ -1,69 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2009 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package org.springframework.core.convert.support; |
|
||||||
|
|
||||||
import static org.springframework.core.convert.support.ConversionUtils.invokeConverter; |
|
||||||
|
|
||||||
import java.lang.reflect.Array; |
|
||||||
|
|
||||||
import org.springframework.core.convert.ConverterNotFoundException; |
|
||||||
import org.springframework.core.convert.TypeDescriptor; |
|
||||||
|
|
||||||
final class ArrayToStringGenericConverter implements GenericConverter { |
|
||||||
|
|
||||||
private static final String DELIMITER = ","; |
|
||||||
|
|
||||||
private final GenericConversionService conversionService; |
|
||||||
|
|
||||||
public ArrayToStringGenericConverter(GenericConversionService conversionService) { |
|
||||||
this.conversionService = conversionService; |
|
||||||
} |
|
||||||
|
|
||||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
|
||||||
int length = Array.getLength(source); |
|
||||||
if (length == 0) { |
|
||||||
return ""; |
|
||||||
} else { |
|
||||||
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); |
|
||||||
if (sourceElementType.isAssignableTo(targetType)) { |
|
||||||
StringBuilder string = new StringBuilder(); |
|
||||||
for (int i = 0; i < length; i++) { |
|
||||||
if (i > 0) { |
|
||||||
string.append(DELIMITER); |
|
||||||
} |
|
||||||
string.append(Array.get(source, i)); |
|
||||||
} |
|
||||||
return string.toString(); |
|
||||||
} else { |
|
||||||
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType); |
|
||||||
if (converter == null) { |
|
||||||
throw new ConverterNotFoundException(sourceElementType, targetType); |
|
||||||
} |
|
||||||
StringBuilder string = new StringBuilder(); |
|
||||||
for (int i = 0; i < length; i++) { |
|
||||||
if (i > 0) { |
|
||||||
string.append(DELIMITER); |
|
||||||
} |
|
||||||
Object sourceElement = Array.get(source, i); |
|
||||||
Object targetElement = invokeConverter(converter, sourceElement, sourceElementType, targetType); |
|
||||||
string.append(targetElement); |
|
||||||
} |
|
||||||
return string.toString(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
@ -0,0 +1,96 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.core.convert.support; |
||||||
|
|
||||||
|
import static org.springframework.core.convert.support.ConversionUtils.getElementType; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.core.CollectionFactory; |
||||||
|
import org.springframework.core.convert.TypeDescriptor; |
||||||
|
|
||||||
|
final class CollectionToMapGenericConverter implements GenericConverter { |
||||||
|
|
||||||
|
private final GenericConversionService conversionService; |
||||||
|
|
||||||
|
public CollectionToMapGenericConverter(GenericConversionService conversionService) { |
||||||
|
this.conversionService = conversionService; |
||||||
|
} |
||||||
|
|
||||||
|
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||||
|
Collection sourceCollection = (Collection) source; |
||||||
|
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); |
||||||
|
if (sourceElementType == TypeDescriptor.NULL) { |
||||||
|
sourceElementType = getElementType(sourceCollection); |
||||||
|
} |
||||||
|
TypeDescriptor targetKeyType = targetType.getMapKeyTypeDescriptor(); |
||||||
|
TypeDescriptor targetValueType = targetType.getMapValueTypeDescriptor(); |
||||||
|
boolean keysCompatible = false; |
||||||
|
if (sourceElementType == TypeDescriptor.NULL || targetKeyType == TypeDescriptor.NULL |
||||||
|
|| sourceElementType.isAssignableTo(targetKeyType)) { |
||||||
|
keysCompatible = true; |
||||||
|
} |
||||||
|
boolean valuesCompatible = false; |
||||||
|
if (sourceElementType == TypeDescriptor.NULL || targetValueType == TypeDescriptor.NULL |
||||||
|
|| sourceElementType.isAssignableTo(targetValueType)) { |
||||||
|
valuesCompatible = true; |
||||||
|
} |
||||||
|
if (keysCompatible && valuesCompatible) { |
||||||
|
Map target = CollectionFactory.createMap(targetType.getType(), sourceCollection.size()); |
||||||
|
if (sourceElementType.typeEquals(String.class)) { |
||||||
|
for (Object element : sourceCollection) { |
||||||
|
String[] property = parseProperty((String) element); |
||||||
|
target.put(property[0], property[1]); |
||||||
|
} |
||||||
|
} else { |
||||||
|
for (Object element : sourceCollection) { |
||||||
|
target.put(element, element); |
||||||
|
} |
||||||
|
} |
||||||
|
return target; |
||||||
|
} else { |
||||||
|
Map target = CollectionFactory.createMap(targetType.getType(), sourceCollection.size()); |
||||||
|
MapEntryConverter converter = new MapEntryConverter(sourceElementType, sourceElementType, targetKeyType, |
||||||
|
targetValueType, keysCompatible, valuesCompatible, conversionService); |
||||||
|
if (sourceElementType.typeEquals(String.class)) { |
||||||
|
for (Object element : sourceCollection) { |
||||||
|
String[] property = parseProperty((String) element); |
||||||
|
Object targetKey = converter.convertKey(property[0]); |
||||||
|
Object targetValue = converter.convertValue(property[1]); |
||||||
|
target.put(targetKey, targetValue); |
||||||
|
} |
||||||
|
} else { |
||||||
|
for (Object element : sourceCollection) { |
||||||
|
Object targetKey = converter.convertKey(element); |
||||||
|
Object targetValue = converter.convertValue(element); |
||||||
|
target.put(targetKey, targetValue); |
||||||
|
} |
||||||
|
} |
||||||
|
return target; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String[] parseProperty(String string) { |
||||||
|
String[] property = string.split("="); |
||||||
|
if (property.length < 2) { |
||||||
|
throw new IllegalArgumentException("Invalid String property '" + property |
||||||
|
+ "'; properties should be in the format name=value"); |
||||||
|
} |
||||||
|
return property; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -1,75 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2009 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package org.springframework.core.convert.support; |
|
||||||
|
|
||||||
import static org.springframework.core.convert.support.ConversionUtils.getElementType; |
|
||||||
import static org.springframework.core.convert.support.ConversionUtils.invokeConverter; |
|
||||||
|
|
||||||
import java.util.Collection; |
|
||||||
|
|
||||||
import org.springframework.core.convert.ConverterNotFoundException; |
|
||||||
import org.springframework.core.convert.TypeDescriptor; |
|
||||||
|
|
||||||
final class CollectionToStringGenericConverter implements GenericConverter { |
|
||||||
|
|
||||||
private static final String DELIMITER = ","; |
|
||||||
|
|
||||||
private final GenericConversionService conversionService; |
|
||||||
|
|
||||||
public CollectionToStringGenericConverter(GenericConversionService conversionService) { |
|
||||||
this.conversionService = conversionService; |
|
||||||
} |
|
||||||
|
|
||||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
|
||||||
Collection sourceCollection = (Collection) source; |
|
||||||
if (sourceCollection.size() == 0) { |
|
||||||
return ""; |
|
||||||
} else { |
|
||||||
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); |
|
||||||
if (sourceElementType == TypeDescriptor.NULL) { |
|
||||||
sourceElementType = getElementType(sourceCollection); |
|
||||||
} |
|
||||||
if (sourceElementType == TypeDescriptor.NULL || sourceElementType.isAssignableTo(targetType)) { |
|
||||||
StringBuilder string = new StringBuilder(); |
|
||||||
int i = 0; |
|
||||||
for (Object element : sourceCollection) { |
|
||||||
if (i > 0) { |
|
||||||
string.append(DELIMITER); |
|
||||||
} |
|
||||||
string.append(element); |
|
||||||
i++; |
|
||||||
} |
|
||||||
return string.toString(); |
|
||||||
} else { |
|
||||||
GenericConverter converter = this.conversionService.getConverter(sourceElementType, targetType); |
|
||||||
if (converter == null) { |
|
||||||
throw new ConverterNotFoundException(sourceElementType, targetType); |
|
||||||
} |
|
||||||
StringBuilder string = new StringBuilder(); |
|
||||||
int i = 0; |
|
||||||
for (Object sourceElement : sourceCollection) { |
|
||||||
if (i > 0) { |
|
||||||
string.append(DELIMITER); |
|
||||||
} |
|
||||||
Object targetElement = invokeConverter(converter, sourceElement, sourceElementType, targetType); |
|
||||||
string.append(targetElement); |
|
||||||
i++; |
|
||||||
} |
|
||||||
return string.toString(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -0,0 +1,39 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.core.convert.support; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.springframework.core.convert.TypeDescriptor; |
||||||
|
|
||||||
|
final class MapToArrayGenericConverter implements GenericConverter { |
||||||
|
|
||||||
|
private final GenericConverter mapToCollectionHelperConverter; |
||||||
|
|
||||||
|
private final GenericConverter collectionToArrayHelperConverter; |
||||||
|
|
||||||
|
public MapToArrayGenericConverter(GenericConversionService conversionService) { |
||||||
|
this.mapToCollectionHelperConverter = new MapToCollectionGenericConverter(conversionService); |
||||||
|
this.collectionToArrayHelperConverter = new CollectionToArrayGenericConverter(conversionService); |
||||||
|
} |
||||||
|
|
||||||
|
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||||
|
TypeDescriptor collectionType = TypeDescriptor.collection(List.class, targetType.getElementTypeDescriptor()); |
||||||
|
Object collection = this.mapToCollectionHelperConverter.convert(source, sourceType, collectionType); |
||||||
|
return this.collectionToArrayHelperConverter.convert(collection, collectionType, targetType); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,100 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.core.convert.support; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.core.convert.TypeDescriptor; |
||||||
|
|
||||||
|
final class MapToObjectGenericConverter implements GenericConverter { |
||||||
|
|
||||||
|
private static final String DELIMITER = " "; |
||||||
|
|
||||||
|
private final GenericConversionService conversionService; |
||||||
|
|
||||||
|
public MapToObjectGenericConverter(GenericConversionService conversionService) { |
||||||
|
this.conversionService = conversionService; |
||||||
|
} |
||||||
|
|
||||||
|
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||||
|
Map sourceMap = (Map) source; |
||||||
|
if (sourceMap.size() == 0) { |
||||||
|
if (targetType.typeEquals(String.class)) { |
||||||
|
return ""; |
||||||
|
} else { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (targetType.typeEquals(String.class)) { |
||||||
|
TypeDescriptor sourceKeyType = sourceType.getMapKeyTypeDescriptor(); |
||||||
|
TypeDescriptor sourceValueType = sourceType.getMapValueTypeDescriptor(); |
||||||
|
boolean keysCompatible = false; |
||||||
|
if (sourceKeyType == TypeDescriptor.NULL || sourceKeyType.isAssignableTo(targetType)) { |
||||||
|
keysCompatible = true; |
||||||
|
} |
||||||
|
boolean valuesCompatible = false; |
||||||
|
if (sourceValueType == TypeDescriptor.NULL || sourceValueType.isAssignableTo(targetType)) { |
||||||
|
valuesCompatible = true; |
||||||
|
} |
||||||
|
if (keysCompatible && valuesCompatible) { |
||||||
|
StringBuilder string = new StringBuilder(); |
||||||
|
int i = 0; |
||||||
|
for (Object entry : sourceMap.entrySet()) { |
||||||
|
Map.Entry mapEntry = (Map.Entry) entry; |
||||||
|
if (i > 0) { |
||||||
|
string.append(DELIMITER); |
||||||
|
} |
||||||
|
String property = mapEntry.getKey() + "=" + mapEntry.getValue(); |
||||||
|
string.append(property); |
||||||
|
i++; |
||||||
|
} |
||||||
|
return string.toString(); |
||||||
|
} else { |
||||||
|
MapEntryConverter converter = new MapEntryConverter(sourceKeyType, sourceValueType, targetType, targetType, |
||||||
|
keysCompatible, valuesCompatible, conversionService); |
||||||
|
StringBuilder string = new StringBuilder(); |
||||||
|
int i = 0; |
||||||
|
for (Object entry : sourceMap.entrySet()) { |
||||||
|
Map.Entry mapEntry = (Map.Entry) entry; |
||||||
|
if (i > 0) { |
||||||
|
string.append(DELIMITER); |
||||||
|
} |
||||||
|
Object key = converter.convertKey(mapEntry.getKey()); |
||||||
|
Object value = converter.convertValue(mapEntry.getValue()); |
||||||
|
String property = key + "=" + value; |
||||||
|
string.append(property); |
||||||
|
i++; |
||||||
|
} |
||||||
|
return string.toString(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
TypeDescriptor sourceValueType = sourceType.getMapValueTypeDescriptor(); |
||||||
|
boolean valuesCompatible = false; |
||||||
|
if (sourceValueType == TypeDescriptor.NULL || sourceValueType.isAssignableTo(targetType)) { |
||||||
|
valuesCompatible = true; |
||||||
|
} |
||||||
|
if (valuesCompatible) { |
||||||
|
return sourceMap.values().iterator().next(); |
||||||
|
} else { |
||||||
|
MapEntryConverter converter = new MapEntryConverter(sourceValueType, sourceValueType, targetType, targetType, |
||||||
|
true, valuesCompatible, conversionService); |
||||||
|
Object value = sourceMap.values().iterator().next(); |
||||||
|
return converter.convertValue(value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,64 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2009 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.core.convert.support; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.core.CollectionFactory; |
||||||
|
import org.springframework.core.convert.TypeDescriptor; |
||||||
|
|
||||||
|
final class ObjectToMapGenericConverter implements GenericConverter { |
||||||
|
|
||||||
|
private final GenericConversionService conversionService; |
||||||
|
|
||||||
|
private final ArrayToMapGenericConverter helperConverter; |
||||||
|
|
||||||
|
public ObjectToMapGenericConverter(GenericConversionService conversionService) { |
||||||
|
this.conversionService = conversionService; |
||||||
|
this.helperConverter = new ArrayToMapGenericConverter(conversionService); |
||||||
|
} |
||||||
|
|
||||||
|
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||||
|
if (sourceType.typeEquals(String.class)) { |
||||||
|
String string = (String) source; |
||||||
|
String[] properties = string.split(" "); |
||||||
|
return this.helperConverter.convert(properties, TypeDescriptor.valueOf(String[].class), targetType); |
||||||
|
} else { |
||||||
|
Map target = CollectionFactory.createMap(targetType.getType(), 1); |
||||||
|
TypeDescriptor targetKeyType = targetType.getMapKeyTypeDescriptor(); |
||||||
|
TypeDescriptor targetValueType = targetType.getMapValueTypeDescriptor(); |
||||||
|
boolean keysCompatible = false; |
||||||
|
if (targetKeyType == TypeDescriptor.NULL || sourceType.isAssignableTo(targetKeyType)) { |
||||||
|
keysCompatible = true; |
||||||
|
} |
||||||
|
boolean valuesCompatible = false; |
||||||
|
if (targetValueType == TypeDescriptor.NULL || sourceType.isAssignableTo(targetValueType)) { |
||||||
|
valuesCompatible = true; |
||||||
|
} |
||||||
|
if (keysCompatible && valuesCompatible) { |
||||||
|
target.put(source, source); |
||||||
|
} else { |
||||||
|
MapEntryConverter converter = new MapEntryConverter(sourceType, sourceType, targetKeyType, |
||||||
|
targetValueType, keysCompatible, valuesCompatible, conversionService); |
||||||
|
Object key = converter.convertKey(source); |
||||||
|
Object value = converter.convertValue(source); |
||||||
|
target.put(key, value); |
||||||
|
} |
||||||
|
return target; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -1,84 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2009 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package org.springframework.core.convert.support; |
|
||||||
|
|
||||||
import java.lang.reflect.Array; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
import org.springframework.core.CollectionFactory; |
|
||||||
import org.springframework.core.convert.TypeDescriptor; |
|
||||||
|
|
||||||
final class StringArrayToMapGenericConverter implements GenericConverter { |
|
||||||
|
|
||||||
private final GenericConversionService conversionService; |
|
||||||
|
|
||||||
public StringArrayToMapGenericConverter(GenericConversionService conversionService) { |
|
||||||
this.conversionService = conversionService; |
|
||||||
} |
|
||||||
|
|
||||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
|
||||||
TypeDescriptor targetKeyType = targetType.getMapKeyTypeDescriptor(); |
|
||||||
TypeDescriptor targetValueType = targetType.getMapValueTypeDescriptor(); |
|
||||||
if (targetKeyType == TypeDescriptor.NULL && targetValueType == TypeDescriptor.NULL) { |
|
||||||
return mapWithoutConversion(source, targetType); |
|
||||||
} |
|
||||||
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor(); |
|
||||||
boolean keysCompatible = false; |
|
||||||
if (sourceElementType.isAssignableTo(targetKeyType)) { |
|
||||||
keysCompatible = true; |
|
||||||
} |
|
||||||
boolean valuesCompatible = false; |
|
||||||
if (sourceElementType.isAssignableTo(targetValueType)) { |
|
||||||
valuesCompatible = true; |
|
||||||
} |
|
||||||
if (keysCompatible && valuesCompatible) { |
|
||||||
return mapWithoutConversion(source, targetType); |
|
||||||
} |
|
||||||
int length = Array.getLength(source); |
|
||||||
Map target = CollectionFactory.createMap(targetType.getType(), length); |
|
||||||
MapEntryConverter converter = new MapEntryConverter(sourceElementType, sourceElementType, targetKeyType, targetValueType, keysCompatible, valuesCompatible, conversionService); |
|
||||||
for (int i = 0; i < length; i++) { |
|
||||||
String property = (String) Array.get(source, i); |
|
||||||
String[] fields = property.split("="); |
|
||||||
if (fields.length < 2) { |
|
||||||
throw new IllegalArgumentException("Invalid String property '" + property |
|
||||||
+ "'; properties should be in the format name=value"); |
|
||||||
} |
|
||||||
Object targetKey = converter.convertKey(fields[0]); |
|
||||||
Object targetValue = converter.convertValue(fields[1]); |
|
||||||
target.put(targetKey, targetValue); |
|
||||||
} |
|
||||||
return target; |
|
||||||
} |
|
||||||
|
|
||||||
private Map mapWithoutConversion(Object source, TypeDescriptor targetType) { |
|
||||||
int length = Array.getLength(source); |
|
||||||
Map target = CollectionFactory.createMap(targetType.getType(), length); |
|
||||||
for (int i = 0; i < length; i++) { |
|
||||||
String property = (String) Array.get(source, i); |
|
||||||
String[] fields = property.split("="); |
|
||||||
if (fields.length < 2) { |
|
||||||
throw new IllegalArgumentException("Invalid String property '" + property |
|
||||||
+ "'; properties should be in the format name=value"); |
|
||||||
} |
|
||||||
String key = fields[0]; |
|
||||||
String value = fields[1]; |
|
||||||
target.put(key, value); |
|
||||||
} |
|
||||||
return target; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
@ -1,53 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2009 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package org.springframework.core.convert.support; |
|
||||||
|
|
||||||
import static org.springframework.core.convert.support.ConversionUtils.invokeConverter; |
|
||||||
|
|
||||||
import java.lang.reflect.Array; |
|
||||||
|
|
||||||
import org.springframework.core.convert.ConverterNotFoundException; |
|
||||||
import org.springframework.core.convert.TypeDescriptor; |
|
||||||
import org.springframework.util.StringUtils; |
|
||||||
|
|
||||||
final class StringToArrayGenericConverter implements GenericConverter { |
|
||||||
|
|
||||||
private final GenericConversionService conversionService; |
|
||||||
|
|
||||||
public StringToArrayGenericConverter(GenericConversionService conversionService) { |
|
||||||
this.conversionService = conversionService; |
|
||||||
} |
|
||||||
|
|
||||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
|
||||||
String string = (String) source; |
|
||||||
String[] fields = StringUtils.commaDelimitedListToStringArray(string); |
|
||||||
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor(); |
|
||||||
if (sourceType.isAssignableTo(targetElementType)) { |
|
||||||
return fields; |
|
||||||
} else { |
|
||||||
Object target = Array.newInstance(targetElementType.getType(), fields.length); |
|
||||||
GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType); |
|
||||||
if (converter == null) { |
|
||||||
throw new ConverterNotFoundException(sourceType, targetElementType); |
|
||||||
} |
|
||||||
for (int i = 0; i < fields.length; i++) { |
|
||||||
Array.set(target, i, invokeConverter(converter, fields[i], sourceType, targetElementType)); |
|
||||||
} |
|
||||||
return target; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
@ -1,58 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright 2002-2009 the original author or authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package org.springframework.core.convert.support; |
|
||||||
|
|
||||||
import static org.springframework.core.convert.support.ConversionUtils.invokeConverter; |
|
||||||
|
|
||||||
import java.util.Collection; |
|
||||||
|
|
||||||
import org.springframework.core.CollectionFactory; |
|
||||||
import org.springframework.core.convert.ConverterNotFoundException; |
|
||||||
import org.springframework.core.convert.TypeDescriptor; |
|
||||||
import org.springframework.util.StringUtils; |
|
||||||
|
|
||||||
final class StringToCollectionGenericConverter implements GenericConverter { |
|
||||||
|
|
||||||
private final GenericConversionService conversionService; |
|
||||||
|
|
||||||
public StringToCollectionGenericConverter(GenericConversionService conversionService) { |
|
||||||
this.conversionService = conversionService; |
|
||||||
} |
|
||||||
|
|
||||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
|
||||||
String string = (String) source; |
|
||||||
String[] fields = StringUtils.commaDelimitedListToStringArray(string); |
|
||||||
Collection target = CollectionFactory.createCollection(targetType.getType(), 1); |
|
||||||
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor(); |
|
||||||
if (targetElementType == TypeDescriptor.NULL || sourceType.isAssignableTo(targetElementType)) { |
|
||||||
for (int i = 0; i < fields.length; i++) { |
|
||||||
target.add(fields[i]); |
|
||||||
} |
|
||||||
} else { |
|
||||||
GenericConverter converter = this.conversionService.getConverter(sourceType, targetElementType); |
|
||||||
if (converter == null) { |
|
||||||
throw new ConverterNotFoundException(sourceType, targetElementType); |
|
||||||
} |
|
||||||
for (int i = 0; i < fields.length; i++) { |
|
||||||
String sourceElement = fields[i]; |
|
||||||
Object targetElement = invokeConverter(converter, sourceElement, sourceType, targetElementType); |
|
||||||
target.add(targetElement); |
|
||||||
} |
|
||||||
} |
|
||||||
return target; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
Loading…
Reference in new issue