Author: mperham Date: Sun Jan 8 13:39:55 2006 New Revision: 367100 URL: http://svn.apache.org/viewcvs?rev=367100&view=rev Log: PR: MPMD-2 Add support for configurable rulesets
Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReportListener.java Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java?rev=367100&r1=367099&r2=367100&view=diff ============================================================================== --- maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java (original) +++ maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java Sun Jan 8 13:39:55 2006 @@ -16,6 +16,17 @@ * limitations under the License. */ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; + import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.PMDException; import net.sourceforge.pmd.Report; @@ -35,17 +46,6 @@ import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.StringUtils; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.ResourceBundle; - /** * Implement the PMD report. * @@ -81,6 +81,11 @@ private String targetJdk; /** + * @parameter + */ + private String[] rulesets = new String[] { "controversial" }; + + /** * @see org.apache.maven.reporting.MavenReport#getName(java.util.Locale) */ public String getName( Locale locale ) @@ -137,10 +142,6 @@ report.addListener( reportSink ); ruleContext.setReport( report ); - RuleSetFactory ruleSetFactory = new RuleSetFactory(); - InputStream rulesInput = pmd.getClass().getResourceAsStream( "/rulesets/controversial.xml" ); - RuleSet ruleSet = ruleSetFactory.createRuleSet( rulesInput ); - reportSink.beginDocument(); List files; @@ -153,18 +154,20 @@ throw new MavenReportException( "Can't parse " + sourceDirectory, e ); } + RuleSetFactory ruleSetFactory = new RuleSetFactory(); + RuleSet[] sets = new RuleSet[rulesets.length]; + for ( int idx = 0; idx < rulesets.length; idx++ ) + { + String set = rulesets[idx]; + String location = "/rulesets/" + set + ".xml"; + getLog().debug( "Preparing " + set + " ruleset found in classpath:" + location ); + InputStream rulesInput = pmd.getClass().getResourceAsStream( location ); + sets[idx] = ruleSetFactory.createRuleSet( rulesInput ); + } + for ( Iterator i = files.iterator(); i.hasNext(); ) { File file = (File) i.next(); - FileReader fileReader; - try - { - fileReader = new FileReader( file ); - } - catch ( FileNotFoundException e ) - { - throw new MavenReportException( "Error opening source file: " + file, e ); - } try { @@ -172,7 +175,11 @@ reportSink.beginFile( file ); ruleContext.setSourceCodeFilename( file.getAbsolutePath() ); - pmd.processFile( fileReader, ruleSet, ruleContext ); + for ( int idx = 0; idx < rulesets.length; idx++ ) + { + // PMD closes this Reader even though it did not open it. + pmd.processFile( new FileReader( file ), sets[idx], ruleContext ); + } reportSink.endFile( file ); } catch ( PMDException e ) @@ -184,16 +191,9 @@ } throw new MavenReportException( "Failure executing PMD for: " + file, ex ); } - finally + catch ( FileNotFoundException e ) { - try - { - fileReader.close(); - } - catch ( IOException e ) - { - throw new MavenReportException( "Error closing source file: " + file, e ); - } + throw new MavenReportException( "Error opening source file: " + file, e ); } } reportSink.endDocument(); Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReportListener.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReportListener.java?rev=367100&r1=367099&r2=367100&view=diff ============================================================================== --- maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReportListener.java (original) +++ maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReportListener.java Sun Jan 8 13:39:55 2006 @@ -16,15 +16,21 @@ * limitations under the License. */ +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.ResourceBundle; + import net.sourceforge.pmd.ReportListener; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.stat.Metric; + import org.codehaus.doxia.sink.Sink; import org.codehaus.plexus.util.StringUtils; -import java.io.File; -import java.util.ResourceBundle; - /** * Handle events from PMD, converting them into Doxia events. * @@ -44,6 +50,10 @@ private ResourceBundle bundle; + private List violations = new ArrayList(); + + private List metrics = new ArrayList(); + public PmdReportListener( Sink sink, String sourceDirectory, ResourceBundle bundle ) { this.sink = sink; @@ -58,7 +68,7 @@ public void ruleViolationAdded( RuleViolation ruleViolation ) { - if ( ! fileInitialized ) + if ( !fileInitialized ) { sink.section2(); sink.sectionTitle2(); @@ -77,20 +87,44 @@ fileInitialized = true; } - sink.tableRow(); - sink.tableCell(); - sink.text( ruleViolation.getDescription() ); - sink.tableCell_(); - sink.tableCell(); - // TODO: xref link the line number - sink.text( String.valueOf( ruleViolation.getLine() ) ); - sink.tableCell_(); - sink.tableRow_(); + violations.add( ruleViolation ); + } + + // When dealing with multiple rulesets, the violations will get out of order + // wrt their source line number. We re-sort them before writing them to the report. + private void processViolations() + { + Collections.sort( violations, new Comparator() + { + public int compare( Object o1, Object o2 ) + { + return ( (RuleViolation) o1 ).getLine() - ( (RuleViolation) o2 ).getLine(); + } + } ); + + for ( Iterator it = violations.iterator(); it.hasNext(); ) + { + RuleViolation ruleViolation = (RuleViolation) it.next(); + + sink.tableRow(); + sink.tableCell(); + sink.text( ruleViolation.getDescription() ); + sink.tableCell_(); + sink.tableCell(); + // TODO: xref link the line number + sink.text( String.valueOf( ruleViolation.getLine() ) ); + sink.tableCell_(); + sink.tableRow_(); + } + violations.clear(); } public void metricAdded( Metric metric ) { - // TODO: metrics + if (metric.getCount() != 0) { + // Skip metrics which have no data + metrics.add(metric); + } } public void beginDocument() @@ -118,6 +152,7 @@ // TODO overall summary sink.section1_(); + sink.section1(); sink.sectionTitle1(); sink.text( bundle.getString( "report.pmd.files" ) ); sink.sectionTitle1_(); @@ -136,14 +171,68 @@ { if ( fileInitialized ) { + processViolations(); sink.table_(); sink.section2_(); } } + private void processMetrics() + { + sink.section1(); + sink.sectionTitle1(); + sink.text( "Metrics" ); + sink.sectionTitle1_(); + + sink.table(); + sink.tableRow(); + sink.tableHeaderCell(); + sink.text( "Name" ); + sink.tableHeaderCell_(); + sink.tableHeaderCell(); + sink.text( "Count" ); + sink.tableHeaderCell_(); + sink.tableHeaderCell(); + sink.text( "High" ); + sink.tableHeaderCell_(); + sink.tableHeaderCell(); + sink.text( "Low" ); + sink.tableHeaderCell_(); + sink.tableHeaderCell(); + sink.text( "Average" ); + sink.tableHeaderCell_(); + sink.tableRow_(); + + for ( Iterator iter = metrics.iterator(); iter.hasNext(); ) + { + Metric met = (Metric) iter.next(); + sink.tableRow(); + sink.tableCell(); + sink.text( met.getMetricName() ); + sink.tableCell_(); + sink.tableCell(); + sink.text( "" + met.getCount() ); + sink.tableCell_(); + sink.tableCell(); + sink.text( "" + met.getHighValue() ); + sink.tableCell_(); + sink.tableCell(); + sink.text( "" + met.getLowValue() ); + sink.tableCell_(); + sink.tableCell(); + sink.text( "" + met.getAverage() ); + sink.tableCell_(); + sink.tableRow_(); + } + sink.table_(); + sink.section1_(); + } + public void endDocument() { sink.section1_(); + + processMetrics(); sink.body_();