package org.nutz.mvc.adaptor.injector;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
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;
import org.nutz.lang.Mirror;
import org.nutz.lang.Strings;
import org.nutz.lang.Times;
import org.nutz.mvc.adaptor.ParamInjector;
public class NameInjector implements ParamInjector {
protected String name;
protected DateFormat dfmt;
protected Class<?> type;
protected Type[] paramTypes;
public NameInjector(String name,
String datefmt,
Class<?> type,
Type[] paramTypes) {
if (null == name)
throw Lang.makeThrow("Can not accept null as name, type '%s'",
type.getName());
this.name = name;
if (Strings.isBlank(datefmt) || !Mirror.me(type).isDateTimeLike()) {
dfmt = null;
} else {
dfmt = new SimpleDateFormat(datefmt);
}
this.type = type;
this.paramTypes = paramTypes;
}
/**
* @param req
* 请求对象
* @param resp
* 响应对象
* @param refer
* 这个参考字段,如果有值,表示是路径参数的值,那么它比 request 里的参数优先
* @return 注入值
*/
@SuppressWarnings("unchecked")
public Object get(ServletContext sc,
HttpServletRequest req,
HttpServletResponse resp,
Object refer) {
/*
* 有 refer 就不能从 http params 里取了
*/
if (null != refer)
// Map 对象,详细分析一下
if (refer instanceof Map<?, ?>) {
Object value = ((Map<?, ?>) refer).get(name);
if (value == null) { // TODO 临时解决JsonAdaptor丢URL参数的问题
return fromReqParam(req);
}
// 如果 value 是集合,并且有范型参数,需要预先将集合内的对象都转换一遍
// Issue #32
if ((value instanceof Collection<?>)
&& null != paramTypes
&& paramTypes.length > 0) {
try {
Collection<?> col = ((Collection<?>) value);
Collection<Object> nw = col.getClass().newInstance();
Class<?> eleType = Lang.getTypeClass(paramTypes[0]);
for (Object ele : col) {
Object obj = Castors.me().castTo(ele, eleType);
nw.add(obj);
}
value = nw;
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
return Castors.me().castTo(value, type);
}
// 普通对象,直接转
else {
return Castors.me().castTo(refer, type);
}
/*
* 直接从 http params 里取
*/
return fromReqParam(req);
}
public Object fromReqParam(HttpServletRequest req) {
String[] params = req.getParameterValues(name);
// 不为 null,那么必然要转换成日期
if (null != dfmt && params != null && params.length > 0) {
Object o = Times.parseq(dfmt, params[0]);
return Castors.me().castTo(o, type);
}
// 默认用转换器转换
return Castors.me().castTo(params, type);
}
}