package org.t2framework.confeito.model; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Date; import org.t2framework.confeito.util.Assertion; import org.t2framework.confeito.util.AutoboxingUtil; import org.t2framework.confeito.util.ConverterUtil; public class Property { public String propertyName; public Method writeMethod; public Method readMethod; public Class<?> propertyType; public Object[] convertArgs(final Object value) { Object[] convertedArgs = null; if (value == null || Assertion.isAllNull(value)) { convertedArgs = convertNullToPrimitiveValueArgs(writeMethod); } else { final Class<?> clazz = value.getClass(); if (clazz.isArray()) { Class<?> type = clazz.getComponentType(); convertedArgs = new Object[] { convertArray(value, type .isPrimitive()) }; } else { convertedArgs = new Object[] { convert0(value) }; } } return convertedArgs; } protected Object convertArray(Object args, boolean primitive) { final boolean isNotPrimitive = primitive == false; final Object[] array = isNotPrimitive ? ((Object[]) args) : null; final int length = isNotPrimitive ? array.length : Array .getLength(args); Object ret = Array.newInstance(propertyType.getComponentType(), length); for (int i = 0; i < length; i++) { Object o = isNotPrimitive ? array[i] : Array.get(args, i); if (o == null) { continue; } Class<?> clazz = o.getClass(); if (clazz.isArray()) { Class<?> type = clazz.getComponentType(); Array.set(ret, i, convertArray(o, type.isPrimitive())); } else { Array.set(ret, i, convert0(o)); } } return ret; } @SuppressWarnings( { "unchecked", "rawtypes" }) protected Object convert0(Object o) { Class<?> c; if (propertyType.isArray() == false) { c = this.propertyType; } else { c = this.propertyType.getComponentType(); } if (c.isPrimitive()) { return ConverterUtil.convert(o, c); } else if (Number.class.isAssignableFrom(c)) { return ConverterUtil.convert(o, c); } else if (Date.class.isAssignableFrom(c)) { return ConverterUtil.convertAsDate(o); } else if (Boolean.class == c) { return ConverterUtil.convertAsBoolean(o); } else if (Calendar.class.isAssignableFrom(c)) { return ConverterUtil.convertAsCalendar(o); } else if (String.class.isAssignableFrom(c)) { return ConverterUtil.convertAsString(o); } else if (Enum.class.isAssignableFrom(c)) { Class<? extends Enum> clazz = (Class<Enum>) c; return ConverterUtil.convertAsEnum(o, clazz); } return o; } protected Object[] convertNullToPrimitiveValueArgs(final Method wmd) { final Class<?>[] paramTypes = wmd.getParameterTypes(); final int len = paramTypes.length; Object[] ret = new Object[len]; for (int i = 0; i < len; i++) { Class<?> c = paramTypes[i]; if (c.isPrimitive()) { ret[i] = AutoboxingUtil.getDefaultPrimitiveValue(c); } else { ret[i] = null; } } return ret; } }