package org.nutz.mvc.adaptor.injector;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.nutz.castor.Castors;
import org.nutz.lang.Lang;
public class ArrayInjector extends NameInjector {
public ArrayInjector(String name, Class<?> type, Type[] paramTypes) {
super(name, null, type, paramTypes);
}
@SuppressWarnings("unchecked")
@Override
public Object get(ServletContext sc,
HttpServletRequest req,
HttpServletResponse resp,
Object refer) {
Object value = null;
if (null != refer) {
if (refer instanceof Map) {
value = ((Map<String, Object>) refer).get(name);
if (value != null && value.getClass().isArray())
return Lang.array2array(value, type.getComponentType());
}
if (value != null)
return convertMe(value);
}
String[] values = req.getParameterValues(name);
if (null == values || values.length == 0)
return null;
if (values.length == 1) {
// 如果只有一个值,那么试图直接转换
return convertMe(values[0]);
}
return Lang.array2array(values, type.getComponentType());
}
protected Object convertMe(Object value) {
try {
return Castors.me().castTo(value, type);
}
// zzh: 如果不成,按数组转换
catch (Exception e) {
Object re = Array.newInstance(type.getComponentType(), 1);
Object v = Castors.me().castTo(value, type.getComponentType());
Array.set(re, 0, v);
return re;
}
}
}