Subversion Repositories javautils

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
  3.  * Copyright 2009 Jason Mehrens. All Rights Reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *   - Redistributions of source code must retain the above copyright
  10.  *     notice, this list of conditions and the following disclaimer.
  11.  *
  12.  *   - Redistributions in binary form must reproduce the above copyright
  13.  *     notice, this list of conditions and the following disclaimer in the
  14.  *     documentation and/or other materials provided with the distribution.
  15.  *
  16.  *   - Neither the name of Sun Microsystems nor the names of its
  17.  *     contributors may be used to endorse or promote products derived
  18.  *     from this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21.  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22.  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23.  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  */
  32.  
  33.  
  34. import java.util.logging.*;
  35. import java.text.DateFormat;
  36. import java.util.Date;
  37.  
  38. /**
  39.  * A compact formatter used to summarize an error report.
  40.  * @author Jason Mehrens
  41.  */
  42. public class SummaryFormatter extends Formatter {
  43.  
  44.     private long oldest;
  45.     private long newest;
  46.     private long count;
  47.  
  48.     public SummaryFormatter() {
  49.         reset();
  50.     }
  51.  
  52.     public String format(LogRecord record) {
  53.         final String data;
  54.         if (record.getThrown() != null) {
  55.             data = record.getLevel() + " with detail." + newLine();
  56.         } else {
  57.             data = record.getLevel() + " with no detail." + newLine();
  58.         }
  59.         track(record.getMillis());
  60.         return data;
  61.     }
  62.  
  63.     public synchronized String getTail(Handler h) {
  64.         try {
  65.             if (count > 0L) {
  66.                 return formatNow();
  67.             }
  68.             return "";
  69.         } finally {
  70.             reset();
  71.         }
  72.     }
  73.  
  74.     public synchronized String toString() {
  75.         return formatNow();
  76.     }
  77.  
  78.     private String formatNow() {
  79.         assert Thread.holdsLock(this);
  80.         DateFormat f = DateFormat.getDateTimeInstance();
  81.         return newLine() + "These " + count + " messages occured between " +
  82.                 f.format(new Date(oldest)) + " and " +
  83.                 f.format(new Date(newest));
  84.  
  85.     }
  86.  
  87.     private synchronized void track(long time) {
  88.         count++;
  89.         this.oldest = Math.min(this.oldest, time);
  90.         this.newest = Math.max(this.newest, time);
  91.     }
  92.  
  93.     private synchronized void reset() {
  94.         this.count = 0L;
  95.         this.oldest = Long.MAX_VALUE;
  96.         this.newest = Long.MIN_VALUE;
  97.     }
  98.  
  99.     private static String newLine() {
  100.         return "\n";
  101.     }
  102. }
  103.