DefaultElementConverter.java
package com.gh.mygreen.xlsmapper.cellconverter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import com.gh.mygreen.xlsmapper.util.ArgUtils;
import com.gh.mygreen.xlsmapper.util.Utils;
/**
* 標準の{@link ElementConverter}の実装クラス。
* <p>次の基本的な型のみ対応しています。</p>
* <ul>
* <li>String型</li>
* <li>プリミティブ型「boolean/char/byte/short/int/long/float/double」と、そのラッパークラス。</li>
* <li>{@link BigDecimal}/{@link BigInteger}</li>
* </ul>
*
*
* @since 1.1
* @author T.TSUCHIE
*
*/
public class DefaultElementConverter implements ElementConverter<Object> {
/** プリミティブ型のデフォルト値 */
private static final Map<Class<?>, Object> primitiveDefaults = new HashMap<>();
static {
primitiveDefaults.put(Boolean.TYPE, Boolean.FALSE);
primitiveDefaults.put(Byte.TYPE, (byte)0);
primitiveDefaults.put(Short.TYPE, (short)0);
primitiveDefaults.put(Character.TYPE, (char)0);
primitiveDefaults.put(Integer.TYPE, 0);
primitiveDefaults.put(Long.TYPE, 0L);
primitiveDefaults.put(Float.TYPE, 0.0f);
primitiveDefaults.put(Double.TYPE, 0.0);
primitiveDefaults.put(BigInteger.class, new BigInteger("0"));
primitiveDefaults.put(BigDecimal.class, new BigDecimal("0.0"));
}
@Override
public Object convertToObject(final String str, final Class<Object> targetClass) throws ConversionException {
ArgUtils.notNull(targetClass, "targetClass");
try {
if(targetClass.isAssignableFrom(String.class)) {
return (Object) (Utils.isEmpty(str) ? null : str.toString());
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(boolean.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Boolean.TYPE) : Boolean.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(char.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Character.TYPE) : str.charAt(0));
} else if(targetClass.isAssignableFrom(Character.class)) {
return (Object) (Utils.isEmpty(str) ? null : str.charAt(0));
} else if(targetClass.isAssignableFrom(Boolean.class)) {
return (Object) (Utils.isEmpty(str) ? null : Boolean.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(short.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Short.TYPE) : Short.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(byte.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Byte.TYPE) : Byte.valueOf(str));
} else if(targetClass.isAssignableFrom(Byte.class)) {
return (Object) (Utils.isEmpty(str) ? null : Byte.valueOf(str));
} else if(targetClass.isAssignableFrom(Short.class)) {
return (Object) (Utils.isEmpty(str) ? null : Short.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(int.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Integer.TYPE) : Integer.valueOf(str));
} else if(targetClass.isAssignableFrom(Integer.class)) {
return (Object) (Utils.isEmpty(str) ? null : Integer.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(long.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Long.TYPE) : Long.valueOf(str));
} else if(targetClass.isAssignableFrom(Long.class)) {
return (Object) (Utils.isEmpty(str) ? null : Long.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(float.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Float.TYPE) : Float.valueOf(str));
} else if(targetClass.isAssignableFrom(Float.class)) {
return (Object) (Utils.isEmpty(str) ? null : Float.valueOf(str));
} else if(targetClass.isPrimitive() && targetClass.isAssignableFrom(double.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(Double.TYPE) : Double.valueOf(str));
} else if(targetClass.isAssignableFrom(Double.class)) {
return (Object) (Utils.isEmpty(str) ? null : Double.valueOf(str));
} else if(targetClass.isAssignableFrom(BigInteger.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(BigInteger.class) : new BigInteger(str));
} else if(targetClass.isAssignableFrom(BigDecimal.class)) {
return (Object) (Utils.isEmpty(str) ? primitiveDefaults.get(BigDecimal.class) : new BigDecimal(str));
}
} catch(NumberFormatException e) {
throw new ConversionException(String.format("Cannot convert string to %s.", str), e, targetClass);
}
throw new ConversionException(String.format("Cannot convert string to Object [%s].", targetClass.getName()), targetClass);
}
@Override
public String convertToString(final Object value) {
if(value == null) {
return "";
}
return value.toString();
}
}