Coverage Report - org.apache.maven.plugins.surefire.report.SurefireReportGenerator
 
Classes in this File Line Coverage Branch Coverage Complexity
SurefireReportGenerator
99% 
97% 
2.938
 
 1  
 package org.apache.maven.plugins.surefire.report;
 2  
 
 3  
 /*
 4  
  * Copyright 2001-2005 The Apache Software Foundation.
 5  
  *
 6  
  * Licensed under the Apache License, Version 2.0 (the "License");
 7  
  * you may not use this file except in compliance with the License.
 8  
  * You may obtain a copy of the License at
 9  
  *
 10  
  *      http://www.apache.org/licenses/LICENSE-2.0
 11  
  *
 12  
  * Unless required by applicable law or agreed to in writing, software
 13  
  * distributed under the License is distributed on an "AS IS" BASIS,
 14  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 15  
  * See the License for the specific language governing permissions and
 16  
  * limitations under the License.
 17  
  */
 18  
 
 19  
 import org.apache.maven.reporting.MavenReportException;
 20  
 import org.codehaus.doxia.sink.Sink;
 21  
 
 22  
 import java.io.File;
 23  
 import java.text.NumberFormat;
 24  
 import java.util.Iterator;
 25  
 import java.util.List;
 26  
 import java.util.ListIterator;
 27  
 import java.util.Locale;
 28  
 import java.util.Map;
 29  
 import java.util.ResourceBundle;
 30  
 import java.util.StringTokenizer;
 31  
 
 32  
 public class SurefireReportGenerator
 33  
 {
 34  
     private SurefireReportParser report;
 35  
 
 36  
     private List testSuites;
 37  
 
 38  
     private boolean showSuccess;
 39  
 
 40  
     private String xrefLocation;
 41  
 
 42  
     public SurefireReportGenerator( File reportsDirectory, Locale locale, boolean showSuccess, String xrefLocation )
 43  8
     {
 44  8
         report = new SurefireReportParser( reportsDirectory, locale );
 45  
 
 46  8
         this.xrefLocation = xrefLocation;
 47  
 
 48  8
         this.showSuccess = showSuccess;
 49  8
     }
 50  
 
 51  
     public void doGenerateReport( ResourceBundle bundle, Sink sink )
 52  
         throws MavenReportException
 53  
     {
 54  8
         testSuites = report.parseXMLReportFiles();
 55  
 
 56  8
         sink.head();
 57  
 
 58  8
         sink.text( bundle.getString( "report.surefire.description" ) );
 59  
 
 60  8
         StringBuffer str = new StringBuffer();
 61  8
         str.append( "<script type=\"text/javascript\">\n" );
 62  8
         str.append( "function toggleDisplay(elementId) {\n" );
 63  8
         str.append( " var elm = document.getElementById(elementId + 'error');\n" );
 64  8
         str.append( " if (elm && typeof elm.style != \"undefined\") {\n" );
 65  8
         str.append( " if (elm.style.display == \"none\") {\n" );
 66  8
         str.append( " elm.style.display = \"\";\n" );
 67  8
         str.append( " document.getElementById(elementId + 'off').style.display = \"none\";\n" );
 68  8
         str.append( " document.getElementById(elementId + 'on').style.display = \"inline\";\n" );
 69  8
         str.append( " }" );
 70  8
         str.append( " else if (elm.style.display == \"\") {" );
 71  8
         str.append( " elm.style.display = \"none\";\n" );
 72  8
         str.append( " document.getElementById(elementId + 'off').style.display = \"inline\";\n" );
 73  8
         str.append( " document.getElementById(elementId + 'on').style.display = \"none\";\n" );
 74  8
         str.append( " } \n" );
 75  8
         str.append( " } \n" );
 76  8
         str.append( " }\n" );
 77  8
         str.append( "</script>" );
 78  8
         sink.rawText( str.toString() );
 79  
 
 80  8
         sink.head_();
 81  
 
 82  8
         sink.body();
 83  
 
 84  8
         constructSummarySection( bundle, sink );
 85  
 
 86  8
         Map suitePackages = report.getSuitesGroupByPackage( testSuites );
 87  8
         if ( !suitePackages.isEmpty() )
 88  
         {
 89  8
             constructPackagesSection( bundle, sink, suitePackages );
 90  
         }
 91  
 
 92  8
         if ( !testSuites.isEmpty() )
 93  
         {
 94  8
             constructTestCasesSection( bundle, sink );
 95  
         }
 96  
 
 97  8
         List failureList = report.getFailureDetails( testSuites );
 98  8
         if ( !failureList.isEmpty() )
 99  
         {
 100  8
             constructFailureDetails( sink, bundle, failureList );
 101  
         }
 102  
 
 103  8
         sinkLineBreak( sink );
 104  
 
 105  8
         sink.body_();
 106  
 
 107  8
         sink.flush();
 108  
 
 109  8
         sink.close();
 110  8
     }
 111  
 
 112  
     private void constructSummarySection( ResourceBundle bundle, Sink sink )
 113  
     {
 114  8
         Map summary = report.getSummary( testSuites );
 115  
 
 116  8
         sink.sectionTitle1();
 117  
 
 118  8
         sinkAnchor( sink, "Summary" );
 119  
 
 120  8
         sink.text( bundle.getString( "report.surefire.label.summary" ) );
 121  
 
 122  8
         sink.sectionTitle1_();
 123  
 
 124  8
         constructHotLinks( sink, bundle );
 125  
 
 126  8
         sinkLineBreak( sink );
 127  
 
 128  8
         sink.table();
 129  
 
 130  8
         sink.tableRow();
 131  
 
 132  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
 133  
 
 134  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
 135  
 
 136  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
 137  
         
 138  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
 139  
 
 140  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
 141  
 
 142  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
 143  
 
 144  8
         sink.tableRow_();
 145  
 
 146  8
         sink.tableRow();
 147  
 
 148  8
         sinkCell( sink, (String) summary.get( "totalTests" ) );
 149  
 
 150  8
         sinkCell( sink, (String) summary.get( "totalErrors" ) );
 151  
 
 152  8
         sinkCell( sink, (String) summary.get( "totalFailures" ) );
 153  
 
 154  8
         sinkCell( sink, (String) summary.get( "totalSkipped" ) );
 155  
 
 156  8
         sinkCell( sink, summary.get( "totalPercentage" ) + "%" );
 157  
 
 158  8
         sinkCell( sink, (String) summary.get( "totalElapsedTime" ) );
 159  
 
 160  8
         sink.tableRow_();
 161  
 
 162  8
         sink.table_();
 163  
 
 164  8
         sink.lineBreak();
 165  
 
 166  8
         sink.rawText( bundle.getString( "report.surefire.text.note1" ) );
 167  
 
 168  8
         sinkLineBreak( sink );
 169  8
     }
 170  
 
 171  
     private void constructPackagesSection( ResourceBundle bundle, Sink sink, Map suitePackages )
 172  
     {
 173  8
         NumberFormat numberFormat = report.getNumberFormat();
 174  
 
 175  8
         sink.sectionTitle1();
 176  
 
 177  8
         sinkAnchor( sink, "Package_List" );
 178  
 
 179  8
         sink.text( bundle.getString( "report.surefire.label.packagelist" ) );
 180  
 
 181  8
         sink.sectionTitle1_();
 182  
 
 183  8
         constructHotLinks( sink, bundle );
 184  
 
 185  8
         sinkLineBreak( sink );
 186  
 
 187  8
         sink.table();
 188  
 
 189  8
         sink.tableRow();
 190  
 
 191  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.package" ) );
 192  
 
 193  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
 194  
 
 195  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
 196  
 
 197  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
 198  
 
 199  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
 200  
 
 201  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
 202  
 
 203  8
         sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
 204  
 
 205  8
         sink.tableRow_();
 206  
 
 207  8
         Iterator packIter = suitePackages.keySet().iterator();
 208  
 
 209  16
         while ( packIter.hasNext() )
 210  
         {
 211  8
             sink.tableRow();
 212  
 
 213  8
             String packageName = (String) packIter.next();
 214  
 
 215  8
             List testSuiteList = (List) suitePackages.get( packageName );
 216  
 
 217  8
             Map packageSummary = report.getSummary( testSuiteList );
 218  
 
 219  8
             sinkCellLink( sink, packageName, "#" + packageName );
 220  
 
 221  8
             sinkCell( sink, (String) packageSummary.get( "totalTests" ) );
 222  
 
 223  8
             sinkCell( sink, (String) packageSummary.get( "totalErrors" ) );
 224  
 
 225  8
             sinkCell( sink, (String) packageSummary.get( "totalFailures" ) );
 226  
 
 227  8
             sinkCell( sink, (String) packageSummary.get( "totalSkipped" ) );
 228  
 
 229  8
             sinkCell( sink, packageSummary.get( "totalPercentage" ) + "%" );
 230  
 
 231  8
             sinkCell( sink, (String) packageSummary.get( "totalElapsedTime" ) );
 232  
 
 233  8
             sink.tableRow_();
 234  8
         }
 235  
 
 236  8
         sink.table_();
 237  
 
 238  8
         sink.lineBreak();
 239  
 
 240  8
         sink.rawText( bundle.getString( "report.surefire.text.note2" ) );
 241  
 
 242  8
         packIter = suitePackages.keySet().iterator();
 243  
 
 244  16
         while ( packIter.hasNext() )
 245  
         {
 246  8
             String packageName = (String) packIter.next();
 247  
 
 248  8
             List testSuiteList = (List) suitePackages.get( packageName );
 249  
 
 250  8
             Iterator suiteIterator = testSuiteList.iterator();
 251  
 
 252  8
             sink.sectionTitle2();
 253  
 
 254  8
             sinkAnchor( sink, packageName );
 255  
 
 256  8
             sink.text( packageName );
 257  
 
 258  8
             sink.sectionTitle2_();
 259  
 
 260  8
             sink.table();
 261  
 
 262  8
             sink.tableRow();
 263  
 
 264  8
             sinkHeader( sink, "" );
 265  
 
 266  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.class" ) );
 267  
 
 268  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.tests" ) );
 269  
 
 270  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.errors" ) );
 271  
 
 272  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.failures" ) );
 273  
 
 274  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.skipped" ) );
 275  
 
 276  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.successrate" ) );
 277  
 
 278  8
             sinkHeader( sink, bundle.getString( "report.surefire.label.time" ) );
 279  
 
 280  8
             sink.tableRow_();
 281  
 
 282  16
             while ( suiteIterator.hasNext() )
 283  
             {
 284  8
                 ReportTestSuite suite = (ReportTestSuite) suiteIterator.next();
 285  
 
 286  8
                 if ( showSuccess || suite.getNumberOfErrors() != 0 || suite.getNumberOfFailures() != 0 )
 287  
                 {
 288  
 
 289  8
                     sink.tableRow();
 290  
 
 291  8
                     sink.tableCell();
 292  
 
 293  8
                     sink.link( "#" + suite.getPackageName() + suite.getName() );
 294  
 
 295  8
                     if ( suite.getNumberOfErrors() > 0 )
 296  
                     {
 297  8
                         sinkIcon( "error", sink );
 298  8
                     }
 299  0
                     else if ( suite.getNumberOfFailures() > 0 )
 300  
                     {
 301  0
                         sinkIcon( "junit.framework", sink );
 302  0
                     }
 303  
                     else
 304  
                     {
 305  0
                         sinkIcon( "success", sink );
 306  
                     }
 307  
 
 308  8
                     sink.link_();
 309  
 
 310  8
                     sink.tableCell_();
 311  
 
 312  8
                     sinkCellLink( sink, suite.getName(), "#" + suite.getPackageName() + suite.getName() );
 313  
 
 314  8
                     sinkCell( sink, Integer.toString( suite.getNumberOfTests() ) );
 315  
 
 316  8
                     sinkCell( sink, Integer.toString( suite.getNumberOfErrors() ) );
 317  
 
 318  8
                     sinkCell( sink, Integer.toString( suite.getNumberOfFailures() ) );
 319  
 
 320  8
                     sinkCell( sink, Integer.toString( suite.getNumberOfSkipped() ) );
 321  
 
 322  8
                     String percentage = report.computePercentage( suite.getNumberOfTests(), suite.getNumberOfErrors(),
 323  
                                                                   suite.getNumberOfFailures(), suite
 324  
                                                                       .getNumberOfSkipped() );
 325  8
                     sinkCell( sink, percentage + "%" );
 326  
 
 327  8
                     sinkCell( sink, numberFormat.format( suite.getTimeElapsed() ) );
 328  
 
 329  8
                     sink.tableRow_();
 330  
                 }
 331  8
             }
 332  
 
 333  8
             sink.table_();
 334  8
         }
 335  
 
 336  8
         sinkLineBreak( sink );
 337  8
     }
 338  
 
 339  
     private void constructTestCasesSection( ResourceBundle bundle, Sink sink )
 340  
     {
 341  8
         NumberFormat numberFormat = report.getNumberFormat();
 342  
 
 343  8
         sink.sectionTitle1();
 344  
 
 345  8
         sinkAnchor( sink, "Test_Cases" );
 346  
 
 347  8
         sink.text( bundle.getString( "report.surefire.label.testcases" ) );
 348  
 
 349  8
         sink.sectionTitle1_();
 350  
 
 351  8
         constructHotLinks( sink, bundle );
 352  
 
 353  8
         ListIterator suiteIterator = testSuites.listIterator();
 354  
 
 355  16
         while ( suiteIterator.hasNext() )
 356  
         {
 357  8
             ReportTestSuite suite = (ReportTestSuite) suiteIterator.next();
 358  
 
 359  8
             List testCases = suite.getTestCases();
 360  
 
 361  8
             if ( testCases != null )
 362  
             {
 363  8
                 ListIterator caseIterator = testCases.listIterator();
 364  
 
 365  8
                 sink.sectionTitle2();
 366  
 
 367  8
                 sinkAnchor( sink, suite.getPackageName() + suite.getName() );
 368  
 
 369  8
                 sink.text( suite.getName() );
 370  
 
 371  8
                 sink.sectionTitle2_();
 372  
 
 373  8
                 sink.table();
 374  
 
 375  72
                 while ( caseIterator.hasNext() )
 376  
                 {
 377  64
                     ReportTestCase testCase = (ReportTestCase) caseIterator.next();
 378  
 
 379  64
                     if ( testCase.getFailure() != null || showSuccess )
 380  
                     {
 381  52
                         sink.tableRow();
 382  
 
 383  52
                         sink.tableCell();
 384  
 
 385  52
                         Map failure = testCase.getFailure();
 386  
 
 387  52
                         if ( failure != null )
 388  
                         {
 389  16
                             sink.link( "#" + testCase.getFullName() );
 390  
 
 391  16
                             sinkIcon( (String) failure.get( "type" ), sink );
 392  
 
 393  16
                             sink.link_();
 394  16
                         }
 395  
                         else
 396  
                         {
 397  36
                             sinkIcon( "success", sink );
 398  
                         }
 399  
 
 400  52
                         sink.tableCell_();
 401  
 
 402  52
                         if ( failure != null )
 403  
                         {
 404  16
                             sink.tableCell();
 405  
 
 406  16
                             sinkLink( sink, testCase.getName(), "#" + testCase.getFullName() );
 407  
 
 408  16
                             sink.rawText( "  <div class=\"detailToggle\" style=\"display:inline\">" );
 409  
 
 410  16
                             sink.link( "javascript:toggleDisplay('" + testCase.getName() + "');" );
 411  
 
 412  16
                             sink.rawText( "<span style=\"display: inline;\" " + "id=\"" + testCase.getName() +
 413  
                                 "off\">+</span><span id=\"" + testCase.getName() + "on\" " +
 414  
                                 "style=\"display: none;\">-</span> " );
 415  16
                             sink.text( "[ Detail ]" );
 416  16
                             sink.link_();
 417  
 
 418  16
                             sink.rawText( "</div>" );
 419  
 
 420  16
                             sink.tableCell_();
 421  16
                         }
 422  
                         else
 423  
                         {
 424  36
                             sinkCell( sink, testCase.getName() );
 425  
                         }
 426  
 
 427  52
                         sinkCell( sink, numberFormat.format( testCase.getTime() ) );
 428  
 
 429  52
                         sink.tableRow_();
 430  
 
 431  52
                         if ( failure != null )
 432  
                         {
 433  16
                             sink.tableRow();
 434  
 
 435  16
                             sinkCell( sink, "" );
 436  16
                             sinkCell( sink, (String) failure.get( "message" ) );
 437  16
                             sinkCell( sink, "" );
 438  16
                             sink.tableRow_();
 439  
 
 440  16
                             List detail = (List) failure.get( "detail" );
 441  16
                             if ( detail != null )
 442  
                             {
 443  
 
 444  16
                                 sink.tableRow();
 445  16
                                 sinkCell( sink, "" );
 446  
 
 447  16
                                 sink.tableCell();
 448  16
                                 sink.rawText(
 449  
                                     "  <div id=\"" + testCase.getName() + "error\" style=\"display:none;\">" );
 450  
 
 451  16
                                 Iterator it = detail.iterator();
 452  
 
 453  16
                                 sink.verbatim( true );
 454  88
                                 while ( it.hasNext() )
 455  
                                 {
 456  72
                                     sink.text( it.next().toString() );
 457  72
                                     sink.lineBreak();
 458  72
                                 }
 459  16
                                 sink.verbatim_();
 460  
 
 461  16
                                 sink.rawText( "</div>" );
 462  16
                                 sink.tableCell_();
 463  
 
 464  16
                                 sinkCell( sink, "" );
 465  
 
 466  16
                                 sink.tableRow_();
 467  
                             }
 468  
                         }
 469  
                     }
 470  64
                 }
 471  
 
 472  8
                 sink.table_();
 473  
             }
 474  8
         }
 475  
 
 476  8
         sinkLineBreak( sink );
 477  8
     }
 478  
 
 479  
     private void constructFailureDetails( Sink sink, ResourceBundle bundle, List failureList )
 480  
     {
 481  8
         Iterator failIter = failureList.iterator();
 482  
 
 483  8
         if ( failIter != null )
 484  
         {
 485  8
             sink.sectionTitle1();
 486  
 
 487  8
             sinkAnchor( sink, "Failure_Details" );
 488  
 
 489  8
             sink.text( bundle.getString( "report.surefire.label.failuredetails" ) );
 490  
 
 491  8
             sink.sectionTitle1_();
 492  
 
 493  8
             constructHotLinks( sink, bundle );
 494  
 
 495  8
             sinkLineBreak( sink );
 496  
 
 497  8
             sink.table();
 498  
 
 499  24
             while ( failIter.hasNext() )
 500  
             {
 501  16
                 ReportTestCase tCase = (ReportTestCase) failIter.next();
 502  
 
 503  16
                 Map failure = tCase.getFailure();
 504  
 
 505  16
                 sink.tableRow();
 506  
 
 507  16
                 sink.tableCell();
 508  
 
 509  16
                 String type = (String) failure.get( "type" );
 510  16
                 sinkIcon( type, sink );
 511  
 
 512  16
                 sink.tableCell_();
 513  
 
 514  16
                 sinkCellAnchor( sink, tCase.getName(), tCase.getFullName() );
 515  
 
 516  16
                 sink.tableRow_();
 517  
 
 518  16
                 String message = (String) failure.get( "message" );
 519  
 
 520  16
                 sink.tableRow();
 521  
 
 522  16
                 sinkCell( sink, "" );
 523  
 
 524  16
                 StringBuffer sb = new StringBuffer();
 525  16
                 sb.append( type );
 526  
 
 527  16
                 if ( message != null )
 528  
                 {
 529  16
                     sb.append( ": " );
 530  16
                     sb.append( message );
 531  
                 }
 532  
 
 533  16
                 sinkCell( sink, sb.toString() );
 534  
 
 535  16
                 sink.tableRow_();
 536  
 
 537  16
                 List detail = (List) failure.get( "detail" );
 538  16
                 if ( detail != null )
 539  
                 {
 540  16
                     Iterator it = detail.iterator();
 541  
 
 542  16
                     boolean firstLine = true;
 543  
 
 544  16
                     String techMessage = "";
 545  88
                     while ( it.hasNext() )
 546  
                     {
 547  72
                         techMessage = it.next().toString();
 548  72
                         if ( firstLine )
 549  
                         {
 550  16
                             firstLine = false;
 551  16
                         }
 552  
                         else
 553  
                         {
 554  56
                             sink.text( "    " );
 555  
                         }
 556  56
                     }
 557  
 
 558  16
                     sink.tableRow();
 559  
 
 560  16
                     sinkCell( sink, "" );
 561  
 
 562  16
                     sink.tableCell();
 563  16
                     sink.rawText( "  <div id=\"" + tCase.getName() + "error\" >" );
 564  
 
 565  16
                     if ( xrefLocation != null )
 566  
                     {
 567  8
                         String path = tCase.getFullClassName().replace( '.', '/' );
 568  
 
 569  8
                         sink.link( xrefLocation + "/" + path + ".html#" +
 570  
                             getErrorLineNumber( tCase.getFullName(), techMessage ) );
 571  
                     }
 572  16
                     sink.text(
 573  
                         tCase.getFullClassName() + ":" + getErrorLineNumber( tCase.getFullName(), techMessage ) );
 574  
 
 575  16
                     if ( xrefLocation != null )
 576  
                     {
 577  8
                         sink.link_();
 578  
                     }
 579  16
                     sink.rawText( "</div>" );
 580  
 
 581  16
                     sink.tableCell_();
 582  
 
 583  16
                     sink.tableRow_();
 584  
                 }
 585  16
             }
 586  
 
 587  8
             sink.table_();
 588  
         }
 589  
 
 590  8
         sinkLineBreak( sink );
 591  8
     }
 592  
 
 593  
     private String getErrorLineNumber( String className, String source )
 594  
     {
 595  24
         StringTokenizer tokenizer = new StringTokenizer( source );
 596  
 
 597  24
         String lineNo = "";
 598  
 
 599  48
         while ( tokenizer.hasMoreTokens() )
 600  
         {
 601  48
             String token = tokenizer.nextToken();
 602  48
             if ( token.startsWith( className ) )
 603  
             {
 604  24
                 int idx = token.indexOf( ":" );
 605  24
                 lineNo = token.substring( idx + 1, token.indexOf( ")" ) );
 606  24
                 break;
 607  
             }
 608  24
         }
 609  24
         return lineNo;
 610  
     }
 611  
 
 612  
     private void constructHotLinks( Sink sink, ResourceBundle bundle )
 613  
     {
 614  32
         if ( !testSuites.isEmpty() )
 615  
         {
 616  32
             sink.section2();
 617  
 
 618  32
             sink.rawText( "[" );
 619  32
             sinkLink( sink, bundle.getString( "report.surefire.label.summary" ), "#Summary" );
 620  32
             sink.rawText( "]" );
 621  
 
 622  32
             sink.rawText( "[" );
 623  32
             sinkLink( sink, bundle.getString( "report.surefire.label.packagelist" ), "#Package_List" );
 624  32
             sink.rawText( "]" );
 625  
 
 626  32
             sink.rawText( "[" );
 627  32
             sinkLink( sink, bundle.getString( "report.surefire.label.testcases" ), "#Test_Cases" );
 628  32
             sink.rawText( "]" );
 629  32
             sink.section2_();
 630  
         }
 631  32
     }
 632  
 
 633  
     private void sinkLineBreak( Sink sink )
 634  
     {
 635  64
         sink.table();
 636  64
         sink.tableRow();
 637  64
         sink.tableRow_();
 638  64
         sink.tableRow();
 639  64
         sink.tableRow_();
 640  64
         sink.table_();
 641  64
     }
 642  
 
 643  
     private void sinkIcon( String type, Sink sink )
 644  
     {
 645  76
         sink.figure();
 646  
 
 647  76
         if ( type.startsWith( "junit.framework" ) )
 648  
         {
 649  16
             sink.figureGraphics( "images/icon_warning_sml.gif" );
 650  16
         }
 651  60
         else if ( type.startsWith( "success" ) )
 652  
         {
 653  36
             sink.figureGraphics( "images/icon_success_sml.gif" );
 654  36
         }
 655  
         else
 656  
         {
 657  24
             sink.figureGraphics( "images/icon_error_sml.gif" );
 658  
         }
 659  
 
 660  76
         sink.figure_();
 661  76
     }
 662  
 
 663  
     private void sinkHeader( Sink sink, String header )
 664  
     {
 665  168
         sink.tableHeaderCell();
 666  168
         sink.text( header );
 667  168
         sink.tableHeaderCell_();
 668  168
     }
 669  
 
 670  
     private void sinkCell( Sink sink, String text )
 671  
     {
 672  360
         sink.tableCell();
 673  360
         sink.text( text );
 674  360
         sink.tableCell_();
 675  360
     }
 676  
 
 677  
     private void sinkLink( Sink sink, String text, String link )
 678  
     {
 679  128
         sink.link( link );
 680  128
         sink.text( text );
 681  128
         sink.link_();
 682  128
     }
 683  
 
 684  
     private void sinkCellLink( Sink sink, String text, String link )
 685  
     {
 686  16
         sink.tableCell();
 687  16
         sinkLink( sink, text, link );
 688  16
         sink.tableCell_();
 689  16
     }
 690  
 
 691  
     private void sinkCellAnchor( Sink sink, String text, String anchor )
 692  
     {
 693  16
         sink.tableCell();
 694  16
         sinkAnchor( sink, anchor );
 695  16
         sink.text( text );
 696  16
         sink.tableCell_();
 697  16
     }
 698  
 
 699  
     private void sinkAnchor( Sink sink, String anchor )
 700  
     {
 701  64
         sink.anchor( anchor );
 702  64
         sink.anchor_();
 703  64
     }
 704  
 }