Author: ltheussl Date: Fri May 21 08:46:29 2010 New Revision: 946935 URL: http://svn.apache.org/viewvc?rev=946935&view=rev Log: [DOXIA-382] Sink cannot be reused after parsing with ConfluenceParser Submitted by: Sebastian Annies
Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceParser.java maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceParserTest.java Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceParser.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceParser.java?rev=946935&r1=946934&r2=946935&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceParser.java (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/main/java/org/apache/maven/doxia/module/confluence/ConfluenceParser.java Fri May 21 08:46:29 2010 @@ -109,39 +109,37 @@ public class ConfluenceParser public synchronized void parse( Reader source, Sink sink ) throws ParseException { - List blocks; - ByLineSource src = new ByLineReaderSource( source ); try { - blocks = parse( src ); + List blocks = parse( src ); + + sink.head(); + + sink.head_(); + + sink.body(); + + for ( Iterator i = blocks.iterator(); i.hasNext(); ) + { + Block block = (Block) i.next(); + + block.traverse( sink ); + } + + sink.body_(); } catch ( Exception e ) { // TODO handle column number throw new ParseException( e, src.getName(), src.getLineNumber(), -1 ); } - - sink.head(); - - sink.head_(); - - sink.body(); - - for ( Iterator i = blocks.iterator(); i.hasNext(); ) + finally { - Block block = (Block) i.next(); - - block.traverse( sink ); + setSecondParsing( false ); + init(); } - - sink.body_(); - sink.flush(); - sink.close(); - - setSecondParsing( false ); - init(); } /** {...@inheritdoc} */ Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceParserTest.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceParserTest.java?rev=946935&r1=946934&r2=946935&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceParserTest.java (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-confluence/src/test/java/org/apache/maven/doxia/module/confluence/ConfluenceParserTest.java Fri May 21 08:46:29 2010 @@ -19,6 +19,7 @@ package org.apache.maven.doxia.module.co * under the License. */ +import java.io.FilterWriter; import java.io.IOException; import java.io.Reader; import java.io.StringReader; @@ -444,6 +445,45 @@ public class ConfluenceParserTest assertTrue( "generated document should have a size > 0", output.toString().length() > 0 ); } + public void testDoxia382SinkCannotBeReused() + throws ParseException + { + String document1 = "Test A" + + "\n\n* list1" + + "\n\n* list2" + + "\n\n* list2{pre}123{/pre} " + + "\n123"; + + String document2 = "Test B" + + "\n\n* list1" + + "\n\n* list2" + + "\n\n* list2{pre}123{/pre}" + + "\n123"; + + output = new StringWriter(); + Sink sink = new TextSink( new FilterWriter( output ) + { + public void close() throws IOException + { + super.close(); + this.out = null; + } + + public void write( String str, int off, int len ) + throws IOException + { + if ( out == null ) + { + throw new IOException( "Writing to an already closed Writer" ); + } + } + }); + + createParser().parse( new StringReader( document1 ), sink ); + createParser().parse( new StringReader( document2 ), sink ); + } + + private void assertContainsLines( String message, String result, String lines ) { lines = StringUtils.replace( lines, "\n", EOL );