package org.codehaus.mojo.jlint;
import java.util.*;
import java.io.*;
import org.codehaus.mojo.jlint.Constants;
public class StreamGobbler
extends Thread
{
public final static int INITIALIZED = 1;
public final static int STARTED = 2;
public final static int COMPLETED = 3;
InputStream is;
String type;
OutputStream os;
OutputStream os_txt;
int noOfLines;
int processing_state;
JlintViolationHandler violationHandler;
ArrayList<String> errorMsgList;
StreamGobbler( InputStream is, String type )
{
this( is, null, type );
}
StreamGobbler( InputStream is, OutputStream redirect )
{
this( is, redirect, null );
}
StreamGobbler( InputStream is, OutputStream redirect, String type )
{
this.is = is;
this.type = type;
this.os = redirect;
this.os_txt = null;
noOfLines = 0;
violationHandler = null;
processing_state = INITIALIZED;
errorMsgList = new ArrayList<String>();
}
StreamGobbler( InputStream is, OutputStream xmlOutput, OutputStream txtOutput, String type )
{
this( is, xmlOutput, type );
this.os_txt = txtOutput;
}
public void run()
{
processing_state = STARTED;
try
{
PrintWriter pw = null;
PrintWriter pw_txt = null;
if ( os != null )
pw = new PrintWriter( os );
if ( os_txt != null )
pw_txt = new PrintWriter( os_txt );
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
/* if the type is INPUT print the Header */
if ( pw != null && "INPUT".equals( type ) )
{
// System.out.println("Printing Header");
pw.println( Constants.XML_HEADER );
pw.println( " " );
pw.println( Constants.ROOT_START_TAG );
}
while ( ( line = br.readLine() ) != null )
{
if ( pw_txt != null )
{
pw_txt.println( line );
}
if ( pw != null )
{
if ( violationHandler != null && "INPUT".equals( type ) )
{
// System.out.println("Printing Violations in XML");
pw.println( violationHandler.violationToXML( line ) );
}
else
{
pw.println( line );
}
}
/*
* When processing the error stream ignore errors of XX isn't correct Java class file log these error to
* the error file, but do not show on screen. other errors show on screen
*/
if ( pw != null && "ERROR".equals( type ) )
{
if ( line.indexOf( "isn't correct Java class file" ) < 0 )
{
errorMsgList.add( line );
}
}
noOfLines++;
}
/*
* If any violation has been written, close the last <file> tag
*/
if ( pw != null && "INPUT".equals( type ) )
{
if ( noOfLines > 0 )
{
pw.println( Constants.FILE_END_TAG );
pw.println( "" );
}
// end the INPUT file with a closing XML tag
pw.println( Constants.ROOT_END_TAG );
pw.println( "" );
pw.flush();
}
if ( pw != null )
pw.close();
if ( pw_txt != null )
pw_txt.close();
}
catch ( IOException ioe )
{
ioe.printStackTrace();
}
processing_state = COMPLETED;
}
public int getNofLines()
{
return noOfLines;
}
public ArrayList<String> getErrorMsgList()
{
return errorMsgList;
}
public void setViolationHandler( JlintViolationHandler violationHandler )
{
this.violationHandler = violationHandler;
}
}