001    package hirondelle.web4jtools.logview.parsedview;
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.web4jtools.logview.simpleview.LogFileDAO;
011    
012    import java.io.File;
013    import java.util.Date;
014    
015    /**
016    * List parsed logger records, according to given criteria. 
017    */
018    public final class ParsedViewAction extends ActionTemplateSearch {
019      
020      public ParsedViewAction(RequestParser aRequestParser) {
021        super(FORWARD, aRequestParser);
022      }
023      
024      public static final RequestParameter LOG_FOR = RequestParameter.withRegexCheck("Log For", "(Application|Server)");
025      public static final RequestParameter LEVEL = RequestParameter.withRegexCheck("Level", "(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)");
026      public static final RequestParameter MIN_DATE = RequestParameter.withLengthCheck("Min Date");
027      public static final RequestParameter MAX_DATE = RequestParameter.withLengthCheck("Max Date");
028      public static final RequestParameter LOGGER_STARTS_WITH = RequestParameter.withLengthCheck("Logger Starts With");
029      public static final RequestParameter METHOD_NAME = RequestParameter.withLengthCheck("Method Name");
030      public static final RequestParameter MESSAGE_CONTAINS = RequestParameter.withLengthCheck("Message Contains");
031      public static final RequestParameter REVERSE_ORDER = RequestParameter.withRegexCheck("Reverse Order", "(true)");
032      
033      /** Check that user input can create a {@link ParsedCriteria} object.  */
034      @Override  protected void validateUserInput() throws AppException {
035        ModelFromRequest builder = new ModelFromRequest(getRequestParser());
036        try {
037          fCriteria = builder.build(
038            ParsedCriteria.class, LOG_FOR,  LEVEL, MIN_DATE, MAX_DATE, 
039            LOGGER_STARTS_WITH, METHOD_NAME, MESSAGE_CONTAINS, REVERSE_ORDER
040          );
041        }
042        catch (ModelCtorException ex){
043          addError(ex);
044        }
045      }
046      
047      /** List the log records matching the given criteria.  */
048      @Override protected void listSearchResults() throws AppException {
049        LogFileDAO dao = new LogFileDAO(getRequestParser().getRequest());
050        File mostRecentLog = dao.getMostRecentLogFile(fCriteria.getLogFor());
051        if ( mostRecentLog != null ) {
052          addToRequest("mostRecentLog", mostRecentLog);
053          addToRequest("mostRecentLogDate", new Date(mostRecentLog.lastModified()));
054          addToRequest("mostRecentLogSize", mostRecentLog.length());
055          addToRequest(ITEMS_FOR_LISTING, dao.getParsedLogFile(mostRecentLog, fCriteria));
056        }
057        else {
058          addError("No files detected in logging directory");
059        }
060      }
061    
062      // PRIVATE //
063      private ParsedCriteria fCriteria;
064      private static final ResponsePage FORWARD = new ResponsePage("Parsed Logs", "view.jsp", ParsedViewAction.class);
065    }