1 /** 2 * Redistribution and use in source and binary forms, with or without 3 * modification, are permitted provided that the following conditions are 4 * met : 5 * 6 * . Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * 9 * . Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * . The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 package cpptools; 30 31 import java.io.BufferedReader; 32 import java.io.FileReader; 33 import java.io.IOException; 34 35 /** 36 * Captures behaviours common to loggers. 37 * 38 * @author Mathieu Champlon 39 */ 40 public abstract class AbstractLogger implements EventHandler 41 { 42 private static final double MS_PER_S = 1000.0; 43 private static final int ERROR_LINES_DISPLAYED = 3; 44 private long start; 45 46 /** 47 * {@inheritDoc} 48 */ 49 public final void started() 50 { 51 start = System.currentTimeMillis(); 52 } 53 54 /** 55 * {@inheritDoc} 56 */ 57 public final void finished( final int parsed, final int total ) 58 { 59 final long end = System.currentTimeMillis(); 60 final double time = (end - start) / MS_PER_S; 61 log( "Successfully parsed " + parsed + " / " + total + " files in " + time + " s" ); 62 } 63 64 /** 65 * Log a given message. 66 * 67 * @param message the message 68 */ 69 protected abstract void log( String message ); 70 71 /** 72 * {@inheritDoc} 73 */ 74 public final void display( final String filename, final int line, final int column ) 75 { 76 try 77 { 78 displayLocation( line, ERROR_LINES_DISPLAYED, filename ); 79 displayCursor( column ); 80 } 81 catch( IOException e ) 82 { 83 error( "internal", e, "while trying to display error location" ); 84 } 85 } 86 87 private void displayCursor( final int column ) 88 { 89 final StringBuffer line = new StringBuffer(); 90 for( int i = 0; i < column - 1; ++i ) 91 line.append( ' ' ); 92 log( line.append( '^' ).toString() ); 93 } 94 95 private void displayLocation( final int start, final int lines, final String filename ) throws IOException 96 { 97 final BufferedReader reader = new BufferedReader( new FileReader( filename ) ); 98 try 99 { 100 for( int i = 0; i < start - lines; i++ ) 101 reader.readLine(); 102 for( int i = 0; i < lines; ++i ) 103 log( reader.readLine() ); 104 } 105 finally 106 { 107 reader.close(); 108 } 109 } 110 }