
leap.lang.convert.Converts Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2012 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 leap.lang.convert;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.sql.Blob;
import java.sql.Clob;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import leap.lang.Args;
import leap.lang.Classes;
import leap.lang.Enums;
import leap.lang.Out;
import leap.lang.Primitives;
import leap.lang.Strings;
import leap.lang.Valued;
import leap.lang.convert.CollectionConverters.ListConverter;
import leap.lang.meta.MSimpleType;
import leap.lang.reflect.Reflection;
import leap.lang.value.Null;
@SuppressWarnings({"unchecked","rawtypes"})
public class Converts {
private static final Map, Converter>> converters = new ConcurrentHashMap, Converter>>();
private static final Map, Converter> assignableFromConverters = new ConcurrentHashMap, Converter>();
private static final Object NOT_CONVERTED = new Object();
private static BeanConverter beanConverter = new BeanConverter();
private static Converter arrayConverter = new ArrayConverter();
private static Converter enumConverter = new EnumConverter();
private static ListConverter listConverter = new ListConverter();
static {
//String , Character , Boolean
register(String.class, new StringConverter());
register(Character.class, new CharacterConverter());
register(Boolean.class, new BooleanConverter());
//Number : Byte, Short, Integer, Long, Float, Double, BigInteger, BigDecimal
register(Byte.class, new NumberConverters.ByteConverter());
register(Short.class, new NumberConverters.ShortConverter());
register(Integer.class, new NumberConverters.IntegerConverter());
register(Long.class, new NumberConverters.LongConverter());
register(Float.class, new NumberConverters.FloatConverter());
register(Double.class, new NumberConverters.DoubleConverter());
register(BigInteger.class, new NumberConverters.BigIntegerConverter());
register(BigDecimal.class, new NumberConverters.BigDecimalConverter());
register(Number.class, new NumberConverters.NumberConverter());
//Legacy Date & Time: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, Calendar
//Java8 Date & Time : LocalDate, LocalTime, LocalDateTime, Instant
register(java.util.Date.class, new DateTimeConverters.DateTimeConverter());
register(java.sql.Date.class, new DateTimeConverters.SqlDateConverter());
register(java.sql.Timestamp.class, new DateTimeConverters.SqlTimestampConverter());
register(java.sql.Time.class, new DateTimeConverters.SqlTimeConverter());
register(Calendar.class, new DateTimeConverters.CalendarConverter());
register(LocalDate.class, new DateTimeConverters.LocalDateConverter());
register(LocalTime.class, new DateTimeConverters.LocalTimeConverter());
register(LocalDateTime.class, new DateTimeConverters.LocalDateTimeConverter());
//Pattern
register(Pattern.class, new PatternConverter());
//Collection :
register(Iterable.class,new CollectionConverters.ListConverter());
register(Collection.class,new CollectionConverters.ListConverter());
register(List.class,listConverter);
register(Set.class,new CollectionConverters.SetConverter());
//Map
register(Map.class,new MapConverter());
//Class, Method
register(Class.class, new ClassConverter());
register(Method.class, new MethodConverter());
//Charset , Locale
register(Locale.class, new LocaleConverter());
register(Charset.class, new CharsetConverter());
//Clob, Blob, InputStream
registerAssignableFrom(Clob.class, new ClobConverter());
registerAssignableFrom(Map.class, new MapConverter.ConcreteMapConverter());
registerAssignableFrom(Blob.class, new BlobConverter());
registerAssignableFrom(InputStream.class, new InputStreamConverter());
//Meta
register(MSimpleType.class, new MSimpleType.MSimpleTypeConverter());
}
protected Converts(){
}
public static void register(Class> clazz,Converter> converter){
converters.put(clazz,converter);
}
public static void registerAssignableFrom(Class> superType,Converter> converter){
assignableFromConverters.put(superType, converter);
}
public static T convert(Object value,Class targetType) throws ConvertUnsupportedException {
return convert(value,targetType,null,null);
}
public static T convert(Object value,Class targetType, Type genericType) throws ConvertUnsupportedException {
return convert(value,targetType,genericType,null);
}
public static T convert(Object value,Class targetType, ConvertContext context) throws ConvertUnsupportedException {
return convert(value,targetType,null,context);
}
public static T convert(Object value,Class targetType, Type genericType, ConvertContext context) throws ConvertUnsupportedException {
Object v = doConvert(value, targetType, genericType, context);
if(NOT_CONVERTED == v) {
String s = Strings.format("Can't convert value '{0}' from {1} to {2}",value.toString(),value.getClass(),targetType);
throw new ConvertUnsupportedException(s);
}
return (T)v;
}
public static T tryConvert(Object value,Class targetType, Type genericType) {
Object v = doConvert(value, targetType, genericType, null);
if(NOT_CONVERTED == v) {
return null;
}
return (T)v;
}
protected static Object doConvert(Object value,Class targetType, Type genericType, ConvertContext context) {
Args.notNull(targetType,"targetType");
if(!CharSequence.class.isAssignableFrom(targetType) &&
!Object.class.equals(targetType) && !StringParsable.class.isAssignableFrom(targetType)){
value = trimToNull(value);
}
//primitive target type
if(targetType.isPrimitive()){
return toPrimitive(value,targetType);
}
//null value
if(null == value || Null.is(value)){
return (T)Classes.getDefaultValue(targetType);
}
Class> sourceType = value.getClass();
//target and source type is same
if(targetType.equals(sourceType)){
return (T)value;
}
//string target type
if(targetType.equals(String.class)){
return (T)toString(value);
}
//enum value
if(sourceType.isEnum()){
value = Enums.getValue((Enum>)value);
sourceType = value.getClass();
}
if(targetType.isEnum()){
return (T)Enums.valueOrNameOf((Class extends Enum>)targetType,value);
}
try {
//value is Convertible
Out
© 2015 - 2025 Weber Informatics LLC | Privacy Policy