Author: krosenvold
Date: Wed Nov  3 19:47:24 2010
New Revision: 1030636

URL: http://svn.apache.org/viewvc?rev=1030636&view=rev
Log:
[SUREFIRE-640] Threading issue when redirectToOutputFile=true

Modified:
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
 Wed Nov  3 19:47:24 2010
@@ -186,7 +186,7 @@ public class SurefireBooter
     /**
      * Setting this to true will cause a failure if there are no tests to run
      *
-     * @param redirectTestOutputToFile
+     * @param failIfNoTests true if we should fail with no tests
      */
     public void setFailIfNoTests( boolean failIfNoTests )
     {

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
 Wed Nov  3 19:47:24 2010
@@ -39,82 +39,36 @@ public class FileOutputConsumerProxy
     extends OutputConsumerProxy
 {
 
-    private static final String USER_DIR = System.getProperty( "user.dir" );
-
     private static final String LINE_SEPARATOR = System.getProperty( 
"line.separator" );
 
-    private File reportsDirectory;
+    private final File reportsDirectory;
 
-    private PrintWriter printWriter;
-    
-    private StringBuffer outputBuffer = new StringBuffer();
-    
-    /**
-     * Create a consumer that will write to a {...@link File} for each test.
-     * Files will be saved in working directory.
-     */
-    public FileOutputConsumerProxy( OutputConsumer outputConsumer )
-    {
-        this( outputConsumer, new File( USER_DIR ) );
-    }
+    private final StringBuffer outputBuffer = new StringBuffer();
+
+    private volatile PrintWriter printWriter;
 
     /**
      * Create a consumer that will write to a {...@link File} for each test
      *
+     * @param outputConsumer   the output consumer
      * @param reportsDirectory directory where files will be saved
      */
     public FileOutputConsumerProxy( OutputConsumer outputConsumer, File 
reportsDirectory )
     {
         super( outputConsumer );
-        this.setReportsDirectory( reportsDirectory );
-    }
-
-    /**
-     * Set the directory where reports will be saved
-     *
-     * @param reportsDirectory the directory
-     */
-    public void setReportsDirectory( File reportsDirectory )
-    {
         this.reportsDirectory = reportsDirectory;
     }
 
-    /**
-     * Get the directory where reports will be saved
-     */
-    public File getReportsDirectory()
-    {
-        return reportsDirectory;
-    }
-
-    /**
-     * Set the {...@link PrintWriter} used for the current test suite
-     *
-     * @param writer
-     */
-    public void setPrintWriter( PrintWriter writer )
-    {
-        this.printWriter = writer;
-    }
-
-    /**
-     * Get the {...@link PrintWriter} used for the current test suite
-     */
-    public PrintWriter getPrintWriter()
-    {
-        return printWriter;
-    }
-
     public void testSetStarting( ReportEntry reportEntry )
     {
-        if ( getPrintWriter() != null )
+        if ( printWriter != null )
         {
             throw new IllegalStateException( "testSetStarting called twice" );
         }
-        File file = new File( getReportsDirectory(), reportEntry.getName() + 
"-output.txt" );
+        File file = new File( reportsDirectory, reportEntry.getName() + 
"-output.txt" );
         try
         {
-            setPrintWriter( new PrintWriter( new BufferedWriter( new 
FileWriter( file ) ) ) );
+            this.printWriter = new PrintWriter( new BufferedWriter( new 
FileWriter( file ) ) );
         }
         catch ( IOException e )
         {
@@ -125,41 +79,43 @@ public class FileOutputConsumerProxy
 
     public void testSetCompleted()
     {
-        if ( getPrintWriter() == null )
+        if ( printWriter == null )
         {
             throw new IllegalStateException( "testSetCompleted called before 
testSetStarting" );
         }
         if ( outputBuffer.length() > 0 )
         {
-            getPrintWriter().write( outputBuffer.toString() );
-            getPrintWriter().write( LINE_SEPARATOR );
+            printWriter.write( outputBuffer.toString() );
+            printWriter.write( LINE_SEPARATOR );
             outputBuffer.setLength( 0 );
         }
-        getPrintWriter().close();
-        setPrintWriter( null );
+        printWriter.close();
+        this.printWriter = null;
         super.testSetCompleted();
     }
 
     /**
      * Write the output to the current test file
+     * <p/>
+     * This method may be called from multiple threads
      */
-    public void consumeOutputLine( String line )
+    public synchronized void consumeOutputLine( String line )
     {
-        if ( getPrintWriter() == null )
+        if ( printWriter == null )
         {
             outputBuffer.append( line );
             outputBuffer.append( LINE_SEPARATOR );
             return;
         }
-        
+
         if ( outputBuffer.length() > 0 )
         {
-            getPrintWriter().write( outputBuffer.toString() );
-            getPrintWriter().write( LINE_SEPARATOR );
+            printWriter.write( outputBuffer.toString() );
+            printWriter.write( LINE_SEPARATOR );
             outputBuffer.setLength( 0 );
         }
-        getPrintWriter().write( line );
-        getPrintWriter().write( LINE_SEPARATOR );
+        printWriter.write( line );
+        printWriter.write( LINE_SEPARATOR );
     }
 
 }

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
 Wed Nov  3 19:47:24 2010
@@ -39,7 +39,7 @@ public class ForkingStreamConsumer
 
     private final static int FOOTER_PREFIX_LENGTH = 
ForkingConsoleReporter.FORKING_PREFIX_FOOTER.length();
 
-    private OutputConsumer outputConsumer;
+    private final OutputConsumer outputConsumer;
 
     public ForkingStreamConsumer( OutputConsumer outputConsumer )
     {
@@ -77,6 +77,7 @@ public class ForkingStreamConsumer
 
     /**
      * Get the underlying output consumer.
+     * @return the output consumer
      */
     public OutputConsumer getOutputConsumer()
     {

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
 Wed Nov  3 19:47:24 2010
@@ -32,7 +32,7 @@ public class OutputConsumerProxy
     implements OutputConsumer
 {
 
-    private OutputConsumer outputConsumer;
+    private final OutputConsumer outputConsumer;
 
     /**
      * Create a output consumer that will delegate all calls to the proxied 
output consumer
@@ -41,16 +41,6 @@ public class OutputConsumerProxy
      */
     public OutputConsumerProxy( OutputConsumer outputConsumer )
     {
-        this.setOutputConsumer( outputConsumer );
-    }
-
-    /**
-     * {...@link OutputConsumer} that calls will be delegated to
-     *
-     * @param outputConsumer the proxied {...@link OutputConsumer}
-     */
-    public void setOutputConsumer( OutputConsumer outputConsumer )
-    {
         this.outputConsumer = outputConsumer;
     }
 

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
 Wed Nov  3 19:47:24 2010
@@ -35,14 +35,7 @@ public class PrintWriterOutputConsumer
     implements OutputConsumer
 {
 
-    private PrintWriter printWriter;
-
-    /**
-     * Create a consumer uninitialized, {...@link 
#setPrintWriter(PrintWriter)} must be called before using it
-     */
-    public PrintWriterOutputConsumer()
-    {
-    }
+    private final PrintWriter printWriter;
 
     /**
      * Create a consumer that will write to the specified {...@link Writer}
@@ -51,21 +44,23 @@ public class PrintWriterOutputConsumer
      */
     public PrintWriterOutputConsumer( Writer writer )
     {
-        this.setPrintWriter( new PrintWriter( writer ) );
+        this( new PrintWriter( writer ) );
     }
 
     /**
-     * Set the {...@link PrintWriter} used by this object
+     * Create a consumer that will write to the specified {...@link Writer}
      *
-     * @param writer
+     * @param writer where to write to
      */
-    public void setPrintWriter( PrintWriter writer )
+    public PrintWriterOutputConsumer( PrintWriter writer )
     {
         this.printWriter = writer;
     }
 
     /**
      * Get the {...@link PrintWriter} used by this object
+     *
+     * @return the printWriter
      */
     public PrintWriter getPrintWriter()
     {
@@ -111,7 +106,7 @@ public class PrintWriterOutputConsumer
     /**
      * Write a line and flush
      *
-     * @param line
+     * @param line the content to write
      */
     private void write( String line )
     {

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
 Wed Nov  3 19:47:24 2010
@@ -37,7 +37,7 @@ public class StandardOutputConsumer
      */
     public StandardOutputConsumer()
     {
-        setPrintWriter( new PrintWriter( System.out ) );
+        super( new PrintWriter( System.out ) );
     }
 
 }


Reply via email to