package com.nfwork.dbfound.web.ui;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.beanutils.MethodUtils;
import com.nfwork.dbfound.core.Context;
import com.nfwork.dbfound.core.Transaction;
import com.nfwork.dbfound.dto.QueryResponseObject;
import com.nfwork.dbfound.exception.DBFoundRuntimeException;
import com.nfwork.dbfound.util.JsonUtil;
import com.nfwork.dbfound.web.WebExceptionHandle;
import com.nfwork.dbfound.web.base.StoreDataProvide;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class DataStore extends TagSupport {
private static final long serialVersionUID = 5802822892288859474L;
private String templateName = "dataStore.ftl";
private String id;
private String url;
private String dataProvideClass;
private String dataProvideMethod = "execute";
private String fields = "";
private boolean autoLoad;
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
return executeFreemarker(out);
}
public int executeFreemarker(Writer out) {
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
HttpServletResponse response = (HttpServletResponse) pageContext
.getResponse();
Context context = Context.getCurrentContext(request, response);
try {
Configuration cfg = FreemarkFactory.getConfig(pageContext
.getServletContext());
// 定义Template对象
Template template = cfg.getTemplate(templateName);
// 定义数据
Map<String, Object> root = new HashMap<String, Object>();
fields = "'" + fields.replaceAll(",", "','") + "'";
root.put("ds", this);
String data = getData(context);
if (data != null) {
root.put("data", data);
}
template.process(root, out);
} catch (Exception e) {
Transaction transaction = context.getTransaction();
if (transaction.isOpen()) {
transaction.rollback();
transaction.end();
}
WebExceptionHandle.handle(e, (HttpServletRequest) pageContext
.getRequest(), (HttpServletResponse) pageContext
.getResponse());
return SKIP_PAGE;
}
return EVAL_PAGE;
}
private String getData(Context context) throws Exception {
if (dataProvideClass == null) {
return null;
}
Object object = Class.forName(dataProvideClass).newInstance();
if (object instanceof StoreDataProvide) {
Object ro = MethodUtils.invokeMethod(object, dataProvideMethod,
new Object[] { context });
if (ro instanceof QueryResponseObject) {
QueryResponseObject qro = (QueryResponseObject) ro;
return JsonUtil.beanToJson(qro);
}
} else {
throw new DBFoundRuntimeException("Provide必须实现StoreDataProvide接口");
}
return null;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDataProvideClass() {
return dataProvideClass;
}
public void setDataProvideClass(String dataProvideClass) {
this.dataProvideClass = dataProvideClass;
}
public String getDataProvideMethod() {
return dataProvideMethod;
}
public void setDataProvideMethod(String dataProvideMethod) {
this.dataProvideMethod = dataProvideMethod;
}
public String getFields() {
return fields;
}
public void setFields(String fields) {
this.fields = fields;
}
public boolean isAutoLoad() {
return autoLoad;
}
public void setAutoLoad(boolean autoLoad) {
this.autoLoad = autoLoad;
}
}