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    }