package example; import java.io.*; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import java.util.concurrent.Executor; import javax.servlet.*; import javax.servlet.http.*; import javax.inject.Inject; /** * A Servlet that provides a user interface for managing a PeriodicTask. */ public class PeriodicTaskServlet extends HttpServlet { static protected final Logger log = Logger.getLogger(PeriodicTaskServlet.class.getName()); int _refreshRate = 5; @Inject private Executor _executor; @Inject private PeriodicTask _periodicTask; private NumberFormat _numberFormat ; private DateFormat _dateFormat ; public PeriodicTaskServlet() { } /** * The refresh rate in seconds to send to the browser to cause automatic * refresh, default 5, <= 0 disables. */ public void setRefreshRate(int refreshRate) { _refreshRate = 5; } public void init() throws ServletException { _numberFormat = NumberFormat.getInstance(); _dateFormat = DateFormat.getInstance(); String p; p = getInitParameter("refresh-rate"); if (p != null) setRefreshRate(Integer.parseInt(p)); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final PeriodicTask task = _periodicTask; String msg = null; if (request.getParameter("RUN") != null) { if (task.isActive()) msg = "Already active."; else { // It's tricky to start another Thread from a Servlet. Here // the Resin ThreadPool class is used. ThreadPool will interrupt a // thread and stop it if it runs for too long. Runnable threadTask = new Runnable() { public void run() { task.run(); } }; _executor.execute(threadTask); Thread.yield(); response.sendRedirect(request.getRequestURI()); } } response.setContentType("text/html"); PrintWriter out = response.getWriter(); // stop browser from caching the page response.setHeader("Cache-Control","no-cache,post-check=0,pre-check=0"); response.setHeader("Pragma","no-cache"); response.setHeader("Expires","Thu,01Dec199416:00:00GMT"); if (_refreshRate > 0) { response.addHeader( "refresh", String.valueOf(_refreshRate) + "; URL=" + request.getRequestURI()); } out.println("<html>"); out.println("<head><title>PeriodicTask</title></head>"); out.println("<body>"); out.println("<h1>PeriodicTask</h1>"); if (msg != null) { out.print("<p><b>"); printSafeHtml(out,msg); out.println("</b></p>"); } out.println("<table border='0'>"); printHeading(out,"configuration"); printPeriod(out,"estimated-average-time:", task.getEstimatedAverageTime()); printHeading(out,"statistics"); printField(out,"active", task.isActive()); printPeriod(out,"estimated-time-remaining",task.getEstimatedTimeRemaining()); printDate(out,"last-active-time", task.getLastActiveTime()); printField(out,"total-active-count", task.getTotalActiveCount()); printPeriod(out,"total-active-time", task.getTotalActiveTime()); printPeriod(out,"average-active-time", task.getAverageActiveTime()); printHeading(out,"actions"); printActions(out,new String[][] { {"RUN", "Run"} }); out.println("</table border='0'>"); out.println("</body>"); out.println("</html>"); } protected void printHeading(PrintWriter out, String heading) { out.print("<tr><td colspan='2'><h2>"); printSafeHtml(out,heading); out.println("</h2></td></tr>"); } protected void printField(PrintWriter out, String name, String value) { out.print("<tr><td>"); printSafeHtml(out,name); out.print("</td><td>"); printSafeHtml(out,value); out.print("</td></tr>"); } protected void printField(PrintWriter out, String name, boolean value) { printField(out,name, value == true ? "true" : "false"); } protected void printField(PrintWriter out, String name, long value) { printField(out,name, _numberFormat.format(value)); } protected void printDate(PrintWriter out, String name, long date) { printField(out,name, _dateFormat.format(new Date(date))); } protected void printPeriod(PrintWriter out, String name, long millis) { double sec = millis / 1000; printField(out,name, _numberFormat.format(millis) + "sec"); } protected void printActions(PrintWriter out, String[][] actions) { out.println("<tr><td colspan='2'><form>"); for (int i = 0; i < actions.length; i++) { out.print("<input type='submit' name='"); printSafeHtml(out,actions[i][0]); out.print("' value='"); printSafeHtml(out,actions[i][1]); out.println("'/>"); } out.println("</form></td></tr>"); } protected void printSafeHtml(PrintWriter out, String text) { int len = text.length(); for (int i = 0; i < len; i++) { char ch = text.charAt(i); switch (ch) { case '<': out.print("<"); break; case '>': out.print(">"); break; case '&': out.print("&"); break; default: out.print(ch); } } } }