package org.nutz.mvc.view;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.ActionInfo;
import org.nutz.mvc.Mvcs;
import org.nutz.mvc.NutConfig;
import org.nutz.mvc.View;
import org.nutz.mvc.ViewMaker;
import org.nutz.mvc.ViewMaker2;
import org.nutz.mvc.impl.processor.ViewProcessor;
public class ViewZone implements View {
private static final Log log = Logs.get();
protected ActionInfo ai;
protected View dft;
protected NutConfig config;
protected int index = -1;
public ViewZone(NutConfig config, ActionInfo ai, View dft) {
super();
this.config = config;
this.ai = ai;
this.dft = dft;
Method m = ai.getMethod();
if (log.isInfoEnabled() && m.getReturnType().equals(Void.class)) {
log.info("using resp View but return void!");
}
}
public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Throwable {
if (obj == null)
dft.render(req, resp, obj);
else {
View v = makeView(config, ai, obj.toString(), false);
if (index > -1) {
Object re = Mvcs.getActionContext().getMethodArgs()[index];
ViewProcessor.putRequestAttribute(req, re);
v.render(req, resp, re);
} else {
v.render(req, resp, null);
}
}
}
public static View makeView(NutConfig config, ActionInfo ai, String viewType, boolean allowProxy) {
if (Strings.isBlank(viewType))
return new VoidView();
String str = viewType;
int pos = str.indexOf(':');
String type, value;
if (pos > 0) {
type = Strings.trim(str.substring(0, pos).toLowerCase());
value = Strings.trim(pos >= (str.length() - 1) ? null : str.substring(pos + 1));
} else {
type = str;
value = null;
}
if (allowProxy && "re".equals(type)) {
View dft = null;
if (value != null)
dft = makeView(config, ai, value, false);
return new ViewZone(config, ai, dft);
}
for (ViewMaker maker : ai.getViewMakers()) {
if (maker instanceof ViewMaker2) {
View view = ((ViewMaker2)maker).make(config, ai, type, value);
if (view != null)
return view;
}
View view = maker.make(config.getIoc(), type, value);
if (null != view)
return view;
}
throw Lang.makeThrow("Can not eval %s(\"%s\") View for %s", viewType, str, ai.getMethod());
}
public void setIndex(int index) {
this.index = index;
}
}