001 package hirondelle.web4jtools.logview.simpleview; 002 003 import hirondelle.web4j.action.ActionTemplateSearch; 004 import hirondelle.web4j.action.ResponsePage; 005 import hirondelle.web4j.model.AppException; 006 import hirondelle.web4j.model.ModelCtorException; 007 import hirondelle.web4j.model.ModelFromRequest; 008 import hirondelle.web4j.request.RequestParameter; 009 import hirondelle.web4j.request.RequestParser; 010 import hirondelle.web4j.util.Util; 011 012 import java.io.File; 013 import java.util.Date; 014 import java.util.logging.Logger; 015 016 /** 017 * View application or server logs as plain text, without parsing. 018 */ 019 public final class SimpleViewAction extends ActionTemplateSearch { 020 021 public SimpleViewAction(RequestParser aRequestParser){ 022 super(FORWARD, aRequestParser); 023 } 024 025 public static final RequestParameter LOG_FOR = RequestParameter.withLengthCheck("LogFor"); 026 public static final RequestParameter NUM_LINES = RequestParameter.withLengthCheck("NumLines"); 027 public static final RequestParameter SECTION = RequestParameter.withRegexCheck("Section", "(First|Last)"); 028 public static final RequestParameter REFRESH_RATE = RequestParameter.withLengthCheck("RefreshRate"); 029 030 /** Check user input can form a {@link SimpleCriteria}. */ 031 @Override protected void validateUserInput() throws AppException { 032 try { 033 ModelFromRequest builder = new ModelFromRequest(getRequestParser()); 034 fCriteria = builder.build(SimpleCriteria.class, LOG_FOR, SECTION, NUM_LINES, REFRESH_RATE); 035 fLogger.fine(fCriteria.toString()); 036 } 037 catch (ModelCtorException ex){ 038 addError(ex); 039 } 040 } 041 042 /** List the log file text according to input criteria. */ 043 @Override protected void listSearchResults() throws AppException { 044 LogFileDAO dao = new LogFileDAO(getRequestParser().getRequest()); 045 046 File mostRecentLog = dao.getMostRecentLogFile(fCriteria.getLogFor()); 047 if( mostRecentLog != null ) { 048 addToRequest("mostRecentLog", mostRecentLog); 049 addToRequest("mostRecentLogDate", new Date(mostRecentLog.lastModified())); 050 addToRequest("mostRecentLogSize", mostRecentLog.length()); 051 addToRequest(ITEMS_FOR_LISTING, dao.getLogFileContents(mostRecentLog, fCriteria)); 052 053 if ( fCriteria.getRefreshRate() != null ) { 054 fLogger.fine("Auto-refreshing screen every " + fCriteria.getRefreshRate() + " seconds"); 055 refreshPage(); 056 } 057 } 058 else { 059 addError("No files detected in logging directory."); 060 } 061 } 062 063 // PRIVATE // 064 private SimpleCriteria fCriteria; 065 private static final ResponsePage FORWARD = new ResponsePage("Raw Logs", "view.jsp", SimpleViewAction.class); 066 private static final Logger fLogger = Util.getLogger(SimpleViewAction.class); 067 068 private void refreshPage() { 069 getRequestParser().getResponse().setHeader("Refresh", fCriteria.getRefreshRate() + "; " + getURI()); 070 } 071 072 private String getURI(){ 073 String result = "SimpleViewAction.do?LogFor=" + fCriteria.getLogFor() + "&RefreshRate=" + fCriteria.getRefreshRate() + "&Operation=Search"; 074 if( fCriteria.getSection() != null ) { 075 result = result + "&Section=" + fCriteria.getSection(); 076 result = result + "&NumLines=" + fCriteria.getNumLines(); 077 } 078 fLogger.fine("Refresh URI: " + result); 079 return "url=" + result; 080 } 081 }