package com.sun.j2ee.blueprints.waf.view.taglibs.smart;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.http.HttpServletRequest;
public class CacheTag extends BodyTagSupport {
private String scope;
private String name;
private long duration;
private Entry entry;
public void setScope(String s) { scope = s; }
public void setName(String n) { name = n; }
public void setDuration(long d) { duration = d; }
public int doStartTag() throws JspTagException {
entry = getEntry();
if ((entry != null) && entry.isExpired()) {
entry = null;
removeEntry();
}
return (entry == null) ? EVAL_BODY_BUFFERED : SKIP_BODY;
}
private String getKey() {
HttpServletRequest req =
((HttpServletRequest) pageContext.getRequest());
return (req.getRequestURL().toString()
+ '#' + name
+ '?' + req.getQueryString());
}
private Entry getEntry() {
String key = getKey();
if ("context".equals(scope)) {
return (Entry)pageContext.getServletContext().getAttribute(key);
} else if ("session".equals(scope)) {
return (Entry)pageContext.getSession().getAttribute(key);
} else if ("request".equals(scope)) {
return (Entry)pageContext.getRequest().getAttribute(key);
} else if ("page".equals(scope)) {
return (Entry)pageContext.getAttribute(key);
}
return null;
}
private void removeEntry() {
String key = getKey();
if ("context".equals(scope)) {
pageContext.getServletContext().removeAttribute(key);
}else if ("session".equals(scope)) {
pageContext.getSession().removeAttribute(key);
} else if ("request".equals(scope)) {
pageContext.getRequest().removeAttribute(key);
} else if ("page".equals(scope)) {
pageContext.removeAttribute(key);
}
}
public int doEndTag() throws JspTagException {
if (entry == null) {
BodyContent bc = getBodyContent();
if (bc != null) {
String content = bc.getString();
entry = new Entry(content, duration);
if ("context".equals(scope)) {
pageContext.getServletContext().setAttribute(getKey(), entry);
}else if ("session".equals(scope)) {
pageContext.getSession().setAttribute(getKey(), entry);
} else if ("request".equals(scope)) {
pageContext.getRequest().setAttribute(getKey(), entry);
} else if ("page".equals(scope)) {
pageContext.setAttribute(getKey(), entry);
}
try {
JspWriter out = bc.getEnclosingWriter();
out.print(content);
}
catch (IOException ioe) {
System.err.println("ChacheTag: Problems with writing...");
}
}
} else {
try {
JspWriter out = pageContext.getOut();
out.print(entry.getContent());
} catch (IOException ioe) {
System.err.println("CacheTag: Problems with writing...");
}
}
scope = null;
name = null;
duration = 0;
entry = null;
return EVAL_PAGE;
}
class Entry {
String content;
long timestamp;
long duration;
public Entry(String content, long duration) {
this.content = content;
timestamp = System.currentTimeMillis();
this.duration = duration;
}
public String getContent() { return content; }
public boolean isExpired() {
long currentTime = System.currentTimeMillis();
return ((currentTime - timestamp) > duration);
}
}
}