package com.aggrepoint.winlet.jsp.site.taglib;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import com.aggrepoint.winlet.ContextUtils;
import com.aggrepoint.winlet.ReqInfo;
import com.aggrepoint.winlet.site.SiteContext;
import com.aggrepoint.winlet.site.domain.Area;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* 栏位
*
* @author Jiangming Yang (yangjm@gmail.com)
*/
public class AreaContentTag extends TagSupport {
static final long serialVersionUID = 0;
String m_strName;
String[] attrs;
public AreaContentTag() {
}
public void setName(String name) {
m_strName = name;
}
/**
* @param attrs
* 如果不为空,则表示content的内容是Freemarker Template,attrs中是以空格分隔的request
* attribute名称,这些attribute会被从request中取出作为Freemarker
* Template的运行环境参数执行Freemarker Template
*/
public void setAttrs(String attrs) {
if (attrs != null)
this.attrs = attrs.split(", ");
}
public int doStartTag() throws JspException {
try {
JspWriter out = pageContext.getOut();
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
SiteContext sc = (SiteContext) request
.getAttribute(SiteContext.SITE_CONTEXT_KEY);
ReqInfo ri = ContextUtils.getReqInfo();
StringBuffer sbContent = new StringBuffer();
boolean inPreloadWinletTag = TagSupport.findAncestorWithClass(this,
PreloadWinletTag.class) != null;
List<Area> areas = sc.getPage().getAreas(m_strName);
if (areas != null)
for (Area area : areas) {
String content = area.getContent();
if (attrs != null && attrs.length > 0) {
// 作为Freemarker Template执行
Template tmpl = new Template("", new StringReader(
content), new Configuration());
Map<String, Object> root = new HashMap<String, Object>();
for (String attr : attrs)
root.put(attr, request.getAttribute(attr));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
tmpl.process(root, new OutputStreamWriter(baos));
content = baos.toString();
}
try {
if (inPreloadWinletTag) // 包含在PreloadWinletTag中,由PreloadWinletTag来处理预加载的情况
sbContent.append(content);
else
sbContent.append(PreloadWinletTag.preloadWinlet(ri,
content, false));
} catch (Exception e) {
e.printStackTrace();
}
}
out.print(sbContent.toString());
} catch (Exception e) {
e.printStackTrace();
throw new JspException(e.getMessage());
}
return SKIP_BODY;
}
}