more generic converters
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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,75 @@
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,18 @@
|
||||
/*
|
||||
* 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.Collection;
|
||||
@@ -6,16 +21,16 @@ import org.springframework.core.convert.ConversionFailedException;
|
||||
import org.springframework.core.convert.TypeDescriptor;
|
||||
|
||||
final class ConversionUtils {
|
||||
|
||||
public static Object invokeConverter(GenericConverter converter, Object source, TypeDescriptor sourceType,
|
||||
TypeDescriptor targetType) {
|
||||
try {
|
||||
return converter.convert(source, sourceType, targetType);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
} catch (Exception ex) {
|
||||
throw new ConversionFailedException(sourceType, targetType, source, ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static TypeDescriptor getElementType(Collection collection) {
|
||||
for (Object element : collection) {
|
||||
if (element != null) {
|
||||
|
||||
@@ -184,14 +184,17 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
protected void initGenericConverters() {
|
||||
addGenericConverter(Object[].class, Object[].class, new ArrayToArrayGenericConverter(this));
|
||||
addGenericConverter(Object[].class, Collection.class, new ArrayToCollectionGenericConverter(this));
|
||||
addGenericConverter(Object[].class, String.class, new ArrayToStringGenericConverter(this));
|
||||
addGenericConverter(Object[].class, Object.class, new ArrayToObjectGenericConverter(this));
|
||||
addGenericConverter(Collection.class, Collection.class, new CollectionToCollectionGenericConverter(this));
|
||||
addGenericConverter(Collection.class, Object[].class, new CollectionToArrayGenericConverter(this));
|
||||
addGenericConverter(Collection.class, String.class, new CollectionToStringGenericConverter(this));
|
||||
addGenericConverter(Collection.class, Object.class, new CollectionToObjectGenericConverter(this));
|
||||
addGenericConverter(Map.class, Map.class, new MapToMapGenericConverter(this));
|
||||
addGenericConverter(String.class, Object[].class, new StringToArrayGenericConverter(this));
|
||||
addGenericConverter(String.class, Collection.class, new StringToCollectionGenericConverter(this));
|
||||
addGenericConverter(Object.class, Object[].class, new ObjectToArrayGenericConverter(this));
|
||||
addGenericConverter(Object.class, Collection.class, new ObjectToCollectionGenericConverter(this));
|
||||
addGenericConverter(String.class, Object[].class, new StringToArrayGenericConverter(this));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user