11 changed files with 553 additions and 169 deletions
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
/* |
||||
* 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.Arrays; |
||||
import java.util.Collections; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
import org.springframework.util.ObjectUtils; |
||||
|
||||
/** |
||||
* Converts from an array to a String. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class ArrayToStringConverter implements ConditionalGenericConverter { |
||||
|
||||
private final CollectionToStringConverter helperConverter; |
||||
|
||||
public ArrayToStringConverter(GenericConversionService conversionService) { |
||||
this.helperConverter = new CollectionToStringConverter(conversionService); |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(Object[].class, String.class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.helperConverter.matches(sourceType, targetType); |
||||
} |
||||
|
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.helperConverter.convert(Arrays.asList(ObjectUtils.toObjectArray(source)), sourceType, targetType); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,97 @@
@@ -0,0 +1,97 @@
|
||||
/* |
||||
* 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 java.util.Collections; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.convert.ConverterNotFoundException; |
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
import org.springframework.core.convert.converter.GenericConverter; |
||||
|
||||
/** |
||||
* Converts from a Collection to a String. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class CollectionToStringConverter implements ConditionalGenericConverter { |
||||
|
||||
private static final String DELIMITER = ","; |
||||
|
||||
private final GenericConversionService conversionService; |
||||
|
||||
public CollectionToStringConverter(GenericConversionService conversionService) { |
||||
this.conversionService = conversionService; |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(Collection.class, String.class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.conversionService.canConvert(sourceType.getElementTypeDescriptor(), targetType); |
||||
} |
||||
|
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
if (source == null) { |
||||
return this.conversionService.convertNullSource(sourceType, 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,109 @@
@@ -0,0 +1,109 @@
|
||||
/* |
||||
* 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.getMapEntryTypes; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
import java.util.Collections; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
|
||||
/** |
||||
* Converts from a Map to a String. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class MapToStringConverter implements ConditionalGenericConverter { |
||||
|
||||
private final GenericConversionService conversionService; |
||||
|
||||
public MapToStringConverter(GenericConversionService conversionService) { |
||||
this.conversionService = conversionService; |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(Map.class, String.class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.conversionService.canConvert(sourceType.getMapKeyTypeDescriptor(), targetType) |
||||
&& this.conversionService.canConvert(sourceType.getMapValueTypeDescriptor(), targetType); |
||||
} |
||||
|
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
if (source == null) { |
||||
return this.conversionService.convertNullSource(sourceType, targetType); |
||||
} |
||||
Map<?, ?> sourceMap = (Map<?, ?>) source; |
||||
if (sourceMap.size() == 0) { |
||||
return ""; |
||||
} else { |
||||
TypeDescriptor sourceKeyType = sourceType.getMapKeyTypeDescriptor(); |
||||
TypeDescriptor sourceValueType = sourceType.getMapValueTypeDescriptor(); |
||||
if (sourceKeyType == TypeDescriptor.NULL || sourceValueType == TypeDescriptor.NULL) { |
||||
TypeDescriptor[] sourceEntryTypes = getMapEntryTypes(sourceMap); |
||||
sourceKeyType = sourceEntryTypes[0]; |
||||
sourceValueType = sourceEntryTypes[1]; |
||||
} |
||||
boolean keysCompatible = false; |
||||
if (sourceKeyType != TypeDescriptor.NULL && sourceKeyType.isAssignableTo(targetType)) { |
||||
keysCompatible = true; |
||||
} |
||||
boolean valuesCompatible = false; |
||||
if (sourceValueType != TypeDescriptor.NULL && sourceValueType.isAssignableTo(targetType)) { |
||||
valuesCompatible = true; |
||||
} |
||||
Properties props = new Properties(); |
||||
if (keysCompatible && valuesCompatible) { |
||||
for (Object entry : sourceMap.entrySet()) { |
||||
Map.Entry<?, ?> mapEntry = (Map.Entry<?, ?>) entry; |
||||
props.setProperty((String) mapEntry.getKey(), (String) mapEntry.getValue()); |
||||
} |
||||
return store(props); |
||||
} else { |
||||
MapEntryConverter converter = new MapEntryConverter(sourceKeyType, sourceValueType, targetType, |
||||
targetType, keysCompatible, valuesCompatible, this.conversionService); |
||||
for (Object entry : sourceMap.entrySet()) { |
||||
Map.Entry<?, ?> mapEntry = (Map.Entry<?, ?>) entry; |
||||
Object key = converter.convertKey(mapEntry.getKey()); |
||||
Object value = converter.convertValue(mapEntry.getValue()); |
||||
props.setProperty((String) key, (String) value); |
||||
} |
||||
return store(props); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private String store(Properties props) { |
||||
try { |
||||
ByteArrayOutputStream os = new ByteArrayOutputStream(); |
||||
props.store(os, null); |
||||
return os.toString("ISO-8859-1"); |
||||
} catch (IOException e) { |
||||
// Should never happen.
|
||||
throw new IllegalArgumentException("Failed to store [" + props + "] into String", e); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
/* |
||||
* 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 java.util.Collections; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.convert.ConverterNotFoundException; |
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
import org.springframework.core.convert.converter.GenericConverter; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* Converts from a delimited String to an array. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class StringToArrayConverter implements ConditionalGenericConverter { |
||||
|
||||
private final GenericConversionService conversionService; |
||||
|
||||
public StringToArrayConverter(GenericConversionService conversionService) { |
||||
this.conversionService = conversionService; |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(String.class, Object[].class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.conversionService.canConvert(sourceType, targetType.getElementTypeDescriptor()); |
||||
} |
||||
|
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
if (source == null) { |
||||
return this.conversionService.convertNullSource(sourceType, 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; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
/* |
||||
* 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 java.util.Collections; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.CollectionFactory; |
||||
import org.springframework.core.convert.ConverterNotFoundException; |
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
import org.springframework.core.convert.converter.GenericConverter; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* Converts from a String to a Collection. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class StringToCollectionConverter implements ConditionalGenericConverter { |
||||
|
||||
private final GenericConversionService conversionService; |
||||
|
||||
public StringToCollectionConverter(GenericConversionService conversionService) { |
||||
this.conversionService = conversionService; |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(String.class, Collection.class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.conversionService.canConvert(sourceType, targetType.getElementTypeDescriptor()); |
||||
} |
||||
|
||||
@SuppressWarnings("unchecked") |
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
if (source == null) { |
||||
return this.conversionService.convertNullSource(sourceType, targetType); |
||||
} |
||||
String string = (String) source; |
||||
String[] fields = StringUtils.commaDelimitedListToStringArray(string); |
||||
Collection target = CollectionFactory.createCollection(targetType.getType(), fields.length); |
||||
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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
/* |
||||
* 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.io.ByteArrayInputStream; |
||||
import java.util.Collections; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.core.convert.TypeDescriptor; |
||||
import org.springframework.core.convert.converter.ConditionalGenericConverter; |
||||
|
||||
/** |
||||
* Converts from a String to a Map. |
||||
* |
||||
* @author Keith Donald |
||||
* @since 3.0 |
||||
*/ |
||||
final class StringToMapConverter implements ConditionalGenericConverter { |
||||
|
||||
private final GenericConversionService conversionService; |
||||
|
||||
public StringToMapConverter(GenericConversionService conversionService) { |
||||
this.conversionService = conversionService; |
||||
} |
||||
|
||||
public Set<ConvertiblePair> getConvertibleTypes() { |
||||
return Collections.singleton(new ConvertiblePair(String.class, Map.class)); |
||||
} |
||||
|
||||
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
return this.conversionService.canConvert(sourceType, targetType.getMapKeyTypeDescriptor()) && |
||||
this.conversionService.canConvert(sourceType, targetType.getMapValueTypeDescriptor()); |
||||
} |
||||
|
||||
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { |
||||
if (source == null) { |
||||
return this.conversionService.convertNullSource(sourceType, targetType); |
||||
} |
||||
String string = (String) source; |
||||
return this.conversionService.convert(loadProperties(string), TypeDescriptor.valueOf(Properties.class), targetType); |
||||
} |
||||
|
||||
private Properties loadProperties(String string) { |
||||
try { |
||||
Properties props = new Properties(); |
||||
// Must use the ISO-8859-1 encoding because Properties.load(stream) expects it.
|
||||
props.load(new ByteArrayInputStream(string.getBytes("ISO-8859-1"))); |
||||
return props; |
||||
} catch (Exception e) { |
||||
// Should never happen.
|
||||
throw new IllegalArgumentException("Failed to parse [" + string + "] into Properties", e); |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue