package com.aggrepoint.winlet.jsp.taglib;
import java.util.Hashtable;
import java.util.Vector;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.aggrepoint.winlet.ContextUtils;
import com.aggrepoint.winlet.ReqInfo;
import com.aggrepoint.winlet.WinletManager;
import com.aggrepoint.winlet.spring.WinletClassLoader;
import com.aggrepoint.winlet.spring.def.WinletDef;
import com.aggrepoint.winlet.utils.TypeCast;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author Jiangming Yang (yangjm@gmail.com)
*/
public class IncludeTag extends BodyTagSupport {
private static final long serialVersionUID = 1L;
static final Log logger = LogFactory.getLog(IncludeTag.class);
String var;
String vars;
String m_strWindow;
WinletDef winletDef;
boolean winletNotFound = false;
boolean root;
Hashtable<String, String> m_params;
public void setVar(String var) {
this.var = var;
}
public void setVars(String var) {
this.vars = var;
}
public void setWindow(String window) {
m_strWindow = window;
}
public void setWinlet(String winlet) {
Class<?> clz = WinletClassLoader.getWinletClassByPath(winlet);
if (clz == null) {
logger.error("Unable to find winlet from path " + winlet);
winletNotFound = true;
} else
this.winletDef = WinletDef.getDef(clz);
}
public void setRoot(String isRoot) {
root = "yes".equalsIgnoreCase(isRoot);
}
@Override
public int doStartTag() {
m_params = new Hashtable<String, String>();
return EVAL_BODY_BUFFERED;
}
@Override
public int doAfterBody() {
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspTagException {
if (winletNotFound)
return EVAL_PAGE;
try {
Vector<String> v = null;
if (vars != null) {
v = TypeCast.cast(pageContext.getAttribute(vars));
if (v == null) {
v = new Vector<String>();
pageContext.setAttribute(vars, v);
}
}
StringBuffer all = new StringBuffer();
for (String win : m_strWindow.split(", ")) {
ReqInfo ri = ContextUtils.getReqInfo();
String windowUrl = ri.getWindowUrl(winletDef, win);
long wid = WinletManager.getSeqId();
String response = ri.getWindowContent(wid, windowUrl, m_params,
null, null);
StringBuffer sb = new StringBuffer();
sb.append(
"<div data-winlet-id=\""
+ wid
+ "\" class=\"winlet_child\" data-winlet-url=\"")
.append(ri.getRequest().getContextPath())
.append(windowUrl).append("\"");
if (m_params.size() > 0)
sb.append(" data-winlet-params=\"")
.append(new ObjectMapper().writeValueAsString(
m_params).replaceAll("\"", """))
.append("\"");
if (root)
sb.append(" data-winlet-settings=\"{"root":"yes"}\"");
sb.append(">");
sb.append(response);
sb.append("</div>");
if (v != null)
v.add(sb.toString());
else
all.append(sb);
}
if (v == null)
if (var != null)
pageContext.setAttribute(var, all.toString());
else
pageContext.getOut().write(all.toString());
} catch (Exception e) {
e.printStackTrace();
throw new JspTagException(e.getMessage());
}
return EVAL_PAGE;
}
}