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 }