package com.jarvis.cache.admin.servlet;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.jarvis.cache.AbstractCacheManager;
import com.jarvis.cache.aop.CacheAopProxyChain;
import com.jarvis.cache.to.AutoLoadTO;
import com.jarvis.cache.to.CacheKeyTO;
import com.jarvis.lib.util.BeanUtil;
/**
* 缓存管理页面
* @author jiayu.qiu
*/
public class AdminServlet extends HttpServlet {
private static final long serialVersionUID=252742830396906514L;
private String user="admin";
private String password="admin";
private String _cacheManagerConfig;
private CacheManagerConfig cacheManagerConfig;
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
String _user=servletConfig.getInitParameter("user");
if(null != _user && _user.length() > 0) {
user=_user;
}
String _password=servletConfig.getInitParameter("password");
if(null != _password && _password.length() > 0) {
password=_password;
}
_cacheManagerConfig=servletConfig.getInitParameter("cacheManagerConfig");
if(null != _cacheManagerConfig && _cacheManagerConfig.length() > 0) {
try {
cacheManagerConfig=(CacheManagerConfig)Class.forName(_cacheManagerConfig).newInstance();
} catch(Exception e) {
throw new ServletException(e);
}
} else {
throw new ServletException("请设置com.jarvis.cache.admin.servlet.AdminServlet 中的 cacheManagerConfig 参数!");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
try {
if(null == cacheManagerConfig) {
String errMsg="the \"cacheManagerConfig\" is null!";
resp.getWriter().println(errMsg);
return;
}
String cacheManagerName=req.getParameter("cacheManagerName");
String cacheManagerNames[]=cacheManagerConfig.getCacheManagerNames(req);
if(null == cacheManagerNames || cacheManagerNames.length == 0) {
String errMsg="get \"cacheManagerNames\" is empty!";
resp.getWriter().println(errMsg);
return;
}
if(null == cacheManagerName || cacheManagerName.trim().length() == 0) {
cacheManagerName=cacheManagerNames[0];
}
AbstractCacheManager cacheManager=cacheManagerConfig.getCacheManagerByName(req, cacheManagerName);
if(null == cacheManager) {
String errMsg="get cacheManager by '" + cacheManagerName + "' is null!";
resp.getWriter().println(errMsg);
return;
}
printHtmlHead(resp, cacheManagerName);
HttpSession session=req.getSession();
String logined=(String)session.getAttribute("LOGINED");
String act=req.getParameter("act");
if(null == logined) {
String message=null;
boolean printLoginForm=true;
if("login".equals(act)) {
String _user=req.getParameter("user");
String _password=req.getParameter("password");
if(user.equals(_user) && password.equals(_password)) {
session.setAttribute("LOGINED", "LOGINED");
printLoginForm=false;
act=null;
} else {
message="用户名或密码错误!";
}
}
if(printLoginForm) {
printLoginForm(resp, message);
}
}
logined=(String)session.getAttribute("LOGINED");
if(null != logined) {
if(null != act) {
doServices(req, resp, cacheManager);
} else {
printForm(resp, cacheManagerName, cacheManagerNames);
printList(req, resp, cacheManager, cacheManagerName);
}
}
} catch(Exception e) {
e.printStackTrace();
resp.getWriter().println(e.getMessage());
}
printCloseHtml(resp);
}
private void doServices(HttpServletRequest req, HttpServletResponse resp, AbstractCacheManager cacheManager) throws Exception {
String act=req.getParameter("act");
String cacheKey=req.getParameter("cacheKey");
String hfield=req.getParameter("hfield");
CacheKeyTO to=new CacheKeyTO(cacheManager.getNamespace(), cacheKey, hfield);
if("removeCache".equals(act)) {
cacheManager.delete(to);
resp.getWriter().println("处理成功!");
} else if("removeAutoloadTO".equals(act)) {
cacheManager.getAutoLoadHandler().removeAutoLoadTO(to);
resp.getWriter().println("处理成功!");
} else if("resetLastLoadTime".equals(act)) {
cacheManager.getAutoLoadHandler().resetAutoLoadLastLoadTime(to);
resp.getWriter().println("处理成功!");
} else if("showArgs".equals(act)) {
AutoLoadTO tmpTO=cacheManager.getAutoLoadHandler().getAutoLoadTO(to);
if(null != tmpTO && null != tmpTO.getArgs() && tmpTO.getArgs().length > 0) {
Object[] args=tmpTO.getArgs();
int len=args.length;
StringBuilder html=new StringBuilder();
for(int i=0; i < len; i++) {
html.append("#args[" + i + "] = ").append(BeanUtil.toString(args[i])).append("<hr/>");
}
resp.getWriter().println(html.toString());
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
private void printHtmlHead(HttpServletResponse resp, String cacheManagerName) throws IOException {
StringBuilder html=new StringBuilder();
html.append("<html>").append("<head>").append("<title>Cache Admin</title>");
html.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
html.append("<style type=\"text/css\">");
html.append("th {text-align: center; line-height: 24px; border-top: 1px solid #555555; border-bottom: 1px solid #555555; border-right: 1px solid #555555; word-wrap: break-word; }");
html.append("table { border-left: 1px solid #555555; }");
html.append("td { border-right: 1px solid #555555; border-bottom: 1px solid #555555; text-align: center; line-height: 24px; word-wrap: break-word; }");
html.append("</style>");
html.append("<script type=\"text/javascript\">");
html.append("var cacheManagerName=\"" + cacheManagerName + "\";");
html.append("function removeCache(cacheKey, hfield){if(!cacheKey){return;}");
html.append(" if(confirm(\"确定要删除缓存?\")){");
html.append(" document.getElementById(\"act\").value=\"removeCache\";");
html.append(" document.getElementById(\"cacheKey\").value=cacheKey;");
html.append(" document.getElementById(\"hfield\").value=hfield;");
html.append(" document.getElementById(\"cacheManagerName\").value=cacheManagerName;");
html.append(" document.getElementById(\"updateCacheForm\").submit();");
html.append("}}");
html.append("function removeAutoloadTO(cacheKey, hfield){");
html.append(" if(confirm(\"确定要删除?\")){");
html.append(" document.getElementById(\"act\").value=\"removeAutoloadTO\";");
html.append(" document.getElementById(\"cacheKey\").value=cacheKey;");
html.append(" document.getElementById(\"hfield\").value=hfield;");
html.append(" document.getElementById(\"cacheManagerName\").value=cacheManagerName;");
html.append(" document.getElementById(\"updateCacheForm\").submit();");
html.append("}}");
html.append("function resetLastLoadTime(cacheKey, hfield){");
html.append(" if(confirm(\"确定要重置?\")){");
html.append(" document.getElementById(\"act\").value=\"resetLastLoadTime\";");
html.append(" document.getElementById(\"cacheKey\").value=cacheKey;");
html.append(" document.getElementById(\"hfield\").value=hfield;");
html.append(" document.getElementById(\"cacheManagerName\").value=cacheManagerName;");
html.append(" document.getElementById(\"updateCacheForm\").submit();");
html.append("}}");
html.append("</script></head><body>");
resp.getWriter().println(html.toString());
}
private void printLoginForm(HttpServletResponse resp, String message) throws IOException {
StringBuilder html=new StringBuilder();
if(null != message) {
html.append("ERROR:" + message);
}
html.append("<form action=\"\" method=\"post\">");
html.append("user:<input type=\"text\" name=\"user\" />");
html.append("password:<input type=\"password\" name=\"password\" />");
html.append("<input type=\"hidden\" id=\"act\" name=\"act\" value=\"login\" />");
html.append("<input type=\"submit\" value=\"登录\"></input>");
html.append("</form>");
resp.getWriter().println(html.toString());
}
private void printForm(HttpServletResponse resp, String cacheManagerName, String cacheManagerNames[]) throws IOException {
StringBuilder html=new StringBuilder();
html.append("<form action=\"\" method=\"get\">");
html.append("cache manager bean name:");
html.append("<select name=\"cacheManagerName\">");
for(String tmpName: cacheManagerNames) {
html.append(" <option value=\"" + tmpName + "\" " + (tmpName.equals(cacheManagerName) ? "selected" : "") + " >" + tmpName + "</option>");
}
html.append("</select>");
html.append("<input type=\"submit\" value=\"更改缓存\"></input>");
html.append("</form>");
html.append("cache key:<input type=\"text\" id=\"deleteCacheKey\"/> <input type=\"button\" onclick=\"removeCache(document.getElementById('deleteCacheKey').value)\" value=\"删除缓存\"/>");
html.append("<form id=\"updateCacheForm\" action=\"\" method=\"get\" target=\"_blank\">");
html.append("<input type=\"hidden\" id=\"act\" name=\"act\" value=\"\" />");
html.append("<input type=\"hidden\" id=\"cacheKey\" name=\"cacheKey\" value=\"\" />");
html.append("<input type=\"hidden\" id=\"hfield\" name=\"hfield\" value=\"\" />");
html.append("<input type=\"hidden\" id=\"cacheManagerName\" name=\"cacheManagerName\" value=\"\" />");
html.append("</form>");
resp.getWriter().println(html.toString());
}
private void printList(HttpServletRequest req, HttpServletResponse resp, AbstractCacheManager cacheManager, String cacheManagerName) throws IOException {
AutoLoadTO queue[]=cacheManager.getAutoLoadHandler().getAutoLoadQueue();
if(null == queue || queue.length == 0) {
resp.getWriter().println("自动加载队列中无数据!");
return;
}
StringBuilder html=new StringBuilder();
html.append("<table cellpadding=\"0\" cellspacing=\"0\">");
html.append(" <tr>");
html.append(" <th>namespace </th>");
html.append(" <th>key </th>");
html.append(" <th>hash field </th>");
html.append(" <th>className.method </th>");
html.append(" <th>last request time </th>");
html.append(" <th>first request time </th>");
html.append(" <th>request times </th>");
html.append(" <th>expire-time(expire) </th>");
html.append(" <th>request timeout </th>");
html.append(" <th>last load time </th>");
html.append(" <th>load count </th>");
html.append(" <th>average use time </th>");
html.append(" <th>remove cache </th>");
html.append(" <th>remove AutoloadTO </th>");
html.append(" <th>reset last load time </th>");
html.append(" <th>show arguments </th>");
html.append(" </tr>");
for(AutoLoadTO tmpTO: queue) {
CacheAopProxyChain pjp=tmpTO.getJoinPoint();
String className=pjp.getTargetClass().getName();
String methodName=pjp.getMethod().getName();
CacheKeyTO cacheKeyTO=tmpTO.getCacheKey();
String _key=cacheKeyTO.getKey();
String _hfield=cacheKeyTO.getHfield();
if(null == _hfield) {
_hfield="";
}
html.append(" <tr>");
html.append(" <td>" + cacheKeyTO.getNamespace() + "</td>");
html.append(" <td>" + _key + "</td>");
html.append(" <td>" + _hfield + "</td>");
html.append(" <td>" + className + "." + methodName + "</td>");
html.append(" <td>" + getDateFormat(tmpTO.getLastRequestTime()) + "</td>");
html.append(" <td>" + getDateFormat(tmpTO.getFirstRequestTime()) + "</td>");
html.append(" <td>" + tmpTO.getRequestTimes() + "次</td>");
html.append(" <td>" + getDateFormat(tmpTO.getLastLoadTime() + tmpTO.getCache().expire() * 1000) + "(" + tmpTO.getCache().expire() + "秒)</td>");
html.append(" <td>" + getDateFormat(tmpTO.getLastRequestTime() + tmpTO.getCache().requestTimeout() * 1000) + "(" + tmpTO.getCache().requestTimeout() + "秒)</td>");
html.append(" <td>" + getDateFormat(tmpTO.getLastLoadTime()) + "</td>");
html.append(" <td>" + tmpTO.getLoadCnt() + "次</td>");
html.append(" <td>" + tmpTO.getAverageUseTime() + "毫秒</td>");
html.append(" <td><a href=\"javascript:void()\" onclick=\"removeCache('" + _key + "','" + _hfield + "')\">删除缓存</a></td>");
html.append(" <td><a href=\"javascript:void()\" onclick=\"removeAutoloadTO('" + _key + "','" + _hfield + "')\">移除 AutoloadTO</a></td>");
html.append(" <td><a href=\"javascript:void()\" onclick=\"resetLastLoadTime('" + _key + "','" + _hfield + "')\">重置最后加载时间</a></td>");
html.append("<td>");
if(null != tmpTO.getArgs() && tmpTO.getArgs().length > 0) {
html.append("<a href=\"" + req.getContextPath() + req.getServletPath() + "?act=showArgs&cacheManagerName=" + cacheManagerName + "&cacheKey=" + _key + "&hfield=" + _hfield
+ "\" target=\"_blank\">show args values</a>");
}
html.append("</td>");
html.append(" </tr>");
}
html.append("</table>");
resp.getWriter().println(html.toString());
}
private void printCloseHtml(HttpServletResponse resp) throws IOException {
resp.getWriter().println("</body></html>");
}
private String getDateFormat(long time) {
if(time < 100000) {
return "";
}
Date date=new Date(time);
SimpleDateFormat df=new SimpleDateFormat("MM/dd/HH:mm:ss");
return df.format(date);
}
}