You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ad...@apache.org on 2016/10/01 09:29:45 UTC

svn commit: r1762988 - in /maven/plugins/trunk/maven-pmd-plugin/src: main/java/org/apache/maven/plugin/pmd/ test/java/org/apache/maven/plugin/pmd/ test/resources/unit/default-configuration/

Author: adangel
Date: Sat Oct  1 09:29:45 2016
New Revision: 1762988

URL: http://svn.apache.org/viewvc?rev=1762988&view=rev
Log:
[MPMD-162] PMD/CPD report does not take into account pmd.excludeFromFailureFile
Basic implementation

Added:
    maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml
      - copied, changed from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml
    maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml
      - copied, changed from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml
    maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml
      - copied, changed from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml
Removed:
    maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml
Modified:
    maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdReport.java
    maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdViolationCheckMojo.java
    maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/CpdReport.java
    maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java
    maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdReportTest.java
    maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdViolationCheckMojoTest.java
    maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdReportTest.java
    maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdViolationCheckMojoTest.java

Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdReport.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdReport.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdReport.java Sat Oct  1 09:29:45 2016
@@ -200,6 +200,18 @@ public abstract class AbstractPmdReport
     @Parameter( defaultValue = "true" )
     protected boolean skipEmptyReport;
 
+    /**
+     * File that lists classes and rules to be excluded from failures.
+     * For PMD, this is a properties file. For CPD, this
+     * is a text file that contains comma-separated lists of classes
+     * that are allowed to duplicate.
+     *
+     * @since 3.7
+     */
+    @Parameter( property = "pmd.excludeFromFailureFile", defaultValue = "" )
+    protected String excludeFromFailureFile;
+
+
     /** The files that are being analyzed. */
     protected Map<File, PmdFileInfo> filesToProcess;
 

Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdViolationCheckMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdViolationCheckMojo.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdViolationCheckMojo.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/AbstractPmdViolationCheckMojo.java Sat Oct  1 09:29:45 2016
@@ -83,8 +83,10 @@ public abstract class AbstractPmdViolati
     private boolean printFailingErrors;
 
     /**
-     * File that lists classes and rules to be excluded from failures For PMD, this is a properties file For CPD, this
-     * is a text file that contains comma-separated lists of classes that are allowed to duplicate
+     * File that lists classes and rules to be excluded from failures.
+     * For PMD, this is a properties file. For CPD, this
+     * is a text file that contains comma-separated lists of classes
+     * that are allowed to duplicate.
      *
      * @since 3.0
      */

Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/CpdReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/CpdReport.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/CpdReport.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/CpdReport.java Sat Oct  1 09:29:45 2016
@@ -22,13 +22,28 @@ package org.apache.maven.plugin.pmd;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
+import java.io.LineNumberReader;
 import java.io.OutputStreamWriter;
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
 import java.util.ResourceBundle;
+import java.util.Set;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.WriterFactory;
 
 import net.sourceforge.pmd.cpd.CPD;
 import net.sourceforge.pmd.cpd.CPDConfiguration;
@@ -39,16 +54,11 @@ import net.sourceforge.pmd.cpd.JavaLangu
 import net.sourceforge.pmd.cpd.JavaTokenizer;
 import net.sourceforge.pmd.cpd.Language;
 import net.sourceforge.pmd.cpd.LanguageFactory;
+import net.sourceforge.pmd.cpd.Mark;
+import net.sourceforge.pmd.cpd.Match;
 import net.sourceforge.pmd.cpd.Renderer;
 import net.sourceforge.pmd.cpd.XMLRenderer;
 
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.WriterFactory;
-
 /**
  * Creates a report for PMD's CPD tool. See <a
  * href="http://pmd.sourceforge.net/cpd.html">http://pmd.sourceforge.net/cpd.html</a> for more detail.
@@ -239,6 +249,18 @@ public class CpdReport
                 filesToProcess = getFilesToProcess();
             }
 
+            if ( !StringUtils.isEmpty( excludeFromFailureFile ) )
+            {
+                try
+                {
+                    loadExcludeFromFailuresData( excludeFromFailureFile );
+                }
+                catch ( MojoExecutionException e )
+                {
+                    throw new MavenReportException( "Error loading exclusions", e );
+                }
+            }
+
             String encoding = determineEncoding( !filesToProcess.isEmpty() );
             Language cpdLanguage;
             if ( "java".equals ( language ) || null == language )
@@ -290,10 +312,25 @@ public class CpdReport
         }
     }
 
+    private Iterator<Match> filterMatches( Iterator<Match> matches )
+    {
+        List<Match> filteredMatches = new ArrayList<>();
+        while ( matches.hasNext() )
+        {
+            Match match = matches.next();
+            if ( !isExcludedFromFailure( match ) )
+            {
+                filteredMatches.add( match );
+            }
+        }
+        return filteredMatches.iterator();
+    }
+
     private void generateReport( Locale locale )
     {
         CpdReportGenerator gen = new CpdReportGenerator( getSink(), filesToProcess, getBundle( locale ), aggregate );
-        gen.generate( cpd.getMatches() );
+        Iterator<Match> matches = cpd.getMatches();
+        gen.generate( filterMatches( matches ) );
     }
 
     private String determineEncoding( boolean showWarn )
@@ -327,7 +364,7 @@ public class CpdReport
             return;
         }
 
-        String buffer = r.render( cpd.getMatches() );
+        String buffer = r.render( filterMatches( cpd.getMatches() ) );
         File targetFile = new File( targetDirectory, "cpd." + format );
         targetDirectory.mkdirs();
         try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ), getOutputEncoding() ) )
@@ -393,4 +430,82 @@ public class CpdReport
 
         return renderer;
     }
+
+
+
+
+
+    private final List<Set<String>> exclusionList = new ArrayList<>();
+    protected boolean isExcludedFromFailure( final Match errorDetail )
+    {
+        final Set<String> uniquePaths = new HashSet<>();
+        for ( Mark mark : errorDetail.getMarkSet() )
+        {
+            uniquePaths.add( mark.getFilename() );
+        }
+        for ( final Set<String> singleExclusionGroup : exclusionList )
+        {
+            if ( uniquePaths.size() == singleExclusionGroup.size()
+                && duplicationExcludedByGroup( uniquePaths, singleExclusionGroup ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean duplicationExcludedByGroup( final Set<String> uniquePaths, final Set<String> singleExclusionGroup )
+    {
+        for ( final String path : uniquePaths )
+        {
+            if ( !fileExcludedByGroup( path, singleExclusionGroup ) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean fileExcludedByGroup( final String path, final Set<String> singleExclusionGroup )
+    {
+        final String formattedPath = path.replace( '\\', '.' ).replace( '/', '.' );
+        for ( final String className : singleExclusionGroup )
+        {
+            if ( formattedPath.contains( className ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected void loadExcludeFromFailuresData( final String excludeFromFailureFile )
+        throws MojoExecutionException
+    {
+        try ( LineNumberReader reader = new LineNumberReader( new FileReader( excludeFromFailureFile ) ) )
+        {
+            String line;
+            while ( ( line = reader.readLine() ) != null )
+            {
+                if ( !line.startsWith( "#" ) )
+                {
+                    exclusionList.add( createSetFromExclusionLine( line ) );
+                }
+            }
+        }
+        catch ( final IOException e )
+        {
+            throw new MojoExecutionException( "Cannot load file " + excludeFromFailureFile, e );
+        }
+    }
+
+    private Set<String> createSetFromExclusionLine( final String line )
+    {
+        final Set<String> result = new HashSet<>();
+        for ( final String className : line.split( "," ) )
+        {
+            result.add( className.trim() );
+        }
+        return result;
+    }
 }

Modified: maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/main/java/org/apache/maven/plugin/pmd/PmdReport.java?rev=1762988&r1=1762987&r2=1762988&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 Sat Oct  1 09:29:45 2016
@@ -20,6 +20,7 @@ package org.apache.maven.plugin.pmd;
  */
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -28,10 +29,16 @@ import java.io.PrintStream;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Properties;
 import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import net.sourceforge.pmd.PMD;
 import net.sourceforge.pmd.PMDConfiguration;
@@ -40,6 +47,7 @@ import net.sourceforge.pmd.RuleContext;
 import net.sourceforge.pmd.RulePriority;
 import net.sourceforge.pmd.RuleSetFactory;
 import net.sourceforge.pmd.RuleSetReferenceId;
+import net.sourceforge.pmd.RuleViolation;
 import net.sourceforge.pmd.benchmark.Benchmarker;
 import net.sourceforge.pmd.benchmark.TextReport;
 import net.sourceforge.pmd.lang.LanguageRegistry;
@@ -53,6 +61,7 @@ import net.sourceforge.pmd.util.datasour
 import net.sourceforge.pmd.util.datasource.FileDataSource;
 
 import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -63,6 +72,7 @@ import org.codehaus.plexus.resource.load
 import org.codehaus.plexus.resource.loader.FileResourceLoader;
 import org.codehaus.plexus.resource.loader.ResourceNotFoundException;
 import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -297,6 +307,18 @@ public class PmdReport
             return;
         }
 
+        if ( !StringUtils.isEmpty( excludeFromFailureFile ) )
+        {
+            try
+            {
+                loadExcludeFromFailuresData( excludeFromFailureFile );
+            }
+            catch ( MojoExecutionException e )
+            {
+                throw new MavenReportException( "Unable to load exclusions", e );
+            }
+        }
+
         // configure ResourceManager
         locator.addSearchPath( FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath() );
         locator.addSearchPath( "url", "" );
@@ -385,6 +407,16 @@ public class PmdReport
             getLog().warn( renderer.getErrorsAsString() );
         }
 
+        Iterator<RuleViolation> violationIt = renderer.getViolations().iterator();
+        while ( violationIt.hasNext() )
+        {
+            RuleViolation rv = violationIt.next();
+            if ( isExcludedFromFailure( rv ) )
+            {
+                violationIt.remove();
+            }
+        }
+
         // if format is XML, we need to output it even if the file list is empty or we have no violations
         // so the "check" goals can check for violations
         if ( isXml() && renderer != null )
@@ -645,4 +677,76 @@ public class PmdReport
         return renderer;
     }
 
+    private final Map<String, Set<String>> excludeFromFailureClasses = new HashMap<>();
+
+    protected void loadExcludeFromFailuresData( final String excludeFromFailureFile )
+        throws MojoExecutionException
+    {
+        File file = new File( excludeFromFailureFile );
+        if ( !file.exists() )
+        {
+            return;
+        }
+        final Properties props = new Properties();
+        FileInputStream fileInputStream = null;
+        try
+        {
+            fileInputStream = new FileInputStream( new File( excludeFromFailureFile ) );
+            props.load( fileInputStream );
+            fileInputStream.close();
+            fileInputStream = null;
+        }
+        catch ( final IOException e )
+        {
+            throw new MojoExecutionException( "Cannot load properties file " + excludeFromFailureFile, e );
+        }
+        finally
+        {
+            IOUtil.close( fileInputStream );
+        }
+        for ( final Entry<Object, Object> propEntry : props.entrySet() )
+        {
+            final Set<String> excludedRuleSet = new HashSet<>();
+            final String className = propEntry.getKey().toString();
+            final String[] excludedRules = propEntry.getValue().toString().split( "," );
+            for ( final String excludedRule : excludedRules )
+            {
+                excludedRuleSet.add( excludedRule.trim() );
+            }
+            excludeFromFailureClasses.put( className, excludedRuleSet );
+        }
+    }
+
+    protected boolean isExcludedFromFailure( final RuleViolation errorDetail )
+    {
+        final String className = extractClassName( errorDetail );
+        final Set<String> excludedRuleSet = excludeFromFailureClasses.get( className );
+        return excludedRuleSet != null && excludedRuleSet.contains( errorDetail.getRule().getName() );
+    }
+
+    private String extractClassName( final RuleViolation errorDetail )
+    {
+        // for some reason, some violations don't contain the package name, so we have to guess the full class name
+        // this looks like a bug in PMD - at least for UnusedImport rule.
+        if ( StringUtils.isNotEmpty( errorDetail.getPackageName() )
+                && StringUtils.isNotEmpty( errorDetail.getClassName() ) )
+        {
+            return errorDetail.getPackageName() + "." + errorDetail.getClassName();
+        }
+        else if ( StringUtils.isNotEmpty( errorDetail.getPackageName() ) )
+        {
+            String fileName = errorDetail.getFilename();
+            fileName = fileName.substring( fileName.lastIndexOf( File.separatorChar ) + 1 );
+            fileName = fileName.substring( 0, fileName.length() - 5 );
+            return errorDetail.getPackageName() + "." + fileName;
+        }
+        else
+        {
+            final String fileName = errorDetail.getFilename();
+            final int javaIdx = fileName.indexOf( File.separator + "java" + File.separator );
+            return fileName.substring( javaIdx >= 0 ? javaIdx + 6 : 0, fileName.length() - 5 ).replace(
+                File.separatorChar, '.' );
+        }
+    }
+
 }

Modified: maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdReportTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdReportTest.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdReportTest.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdReportTest.java Sat Oct  1 09:29:45 2016
@@ -37,6 +37,7 @@ import net.sourceforge.pmd.cpd.Mark;
 import net.sourceforge.pmd.cpd.Match;
 import net.sourceforge.pmd.cpd.TokenEntry;
 
+import org.apache.commons.lang3.StringUtils;
 import org.codehaus.plexus.util.FileUtils;
 import org.w3c.dom.Document;
 
@@ -304,6 +305,22 @@ public class CpdReportTest
             assertTrue( lowerCaseContains( str, "sampleDup.jsp" ) );
     }
 
+    public void testExclusionsConfiguration()
+            throws Exception
+    {
+        File testPom =
+            new File( getBasedir(),
+                      "src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml" );
+        final CpdReport mojo = (CpdReport) lookupMojo( "cpd", testPom );
+        mojo.execute();
+
+        // verify  the generated file to exist and no duplications are reported
+        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
+        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        String str = readFile( generatedFile );
+        assertEquals( 0, StringUtils.countMatches( str, "<duplication" ) );
+    }
+
     public static class MockCpd
         extends CPD
     {

Modified: maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdViolationCheckMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdViolationCheckMojoTest.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdViolationCheckMojoTest.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/CpdViolationCheckMojoTest.java Sat Oct  1 09:29:45 2016
@@ -106,10 +106,10 @@ public class CpdViolationCheckMojoTest
 
         testPom =
             new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml" );
+                      "src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml" );
         final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
-        cpdViolationMojo.execute();
 
-        assertTrue( true );
+        // this call shouldn't throw an exception, as the classes with duplications have been excluded
+        cpdViolationMojo.execute();
     }
 }

Modified: maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdReportTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdReportTest.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdReportTest.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdReportTest.java Sat Oct  1 09:29:45 2016
@@ -28,6 +28,7 @@ import java.nio.charset.StandardCharsets
 import java.util.Locale;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 
@@ -457,4 +458,20 @@ public class PmdReportTest
         assertFalse( "Exclusion of an exact source directory not working", str.contains( "OverrideBothEqualsAndHashcode" ) );
         assertFalse( "Exclusion of basedirectory with subdirectories not working (MPMD-178)", str.contains( "JumbledIncrementer") );
     }
+
+    public void testViolationExclusion()
+            throws Exception
+        {
+            File testPom =
+                new File( getBasedir(),
+                          "src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml" );
+            final PmdReport mojo = (PmdReport) lookupMojo( "pmd", testPom );
+            mojo.execute();
+
+            File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
+            assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+            String str = readFile( generatedFile );
+
+            assertEquals(0, StringUtils.countMatches(str, "<violation"));
+        }
 }

Modified: maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdViolationCheckMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdViolationCheckMojoTest.java?rev=1762988&r1=1762987&r2=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdViolationCheckMojoTest.java (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/java/org/apache/maven/plugin/pmd/PmdViolationCheckMojoTest.java Sat Oct  1 09:29:45 2016
@@ -151,8 +151,8 @@ public class PmdViolationCheckMojoTest
             new File( getBasedir(),
                       "src/test/resources/unit/default-configuration/pmd-check-pmd-exclusions-configuration-plugin-config.xml" );
         final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
-        pmdViolationMojo.execute();
 
-        assertTrue( true );
+        // this call shouldn't throw an exception, as the classes with violations have been excluded
+        pmdViolationMojo.execute();
     }
 }

Copied: maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml (from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml)
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml?p2=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml&p1=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml&r1=1762963&r2=1762988&rev=1762988&view=diff
==============================================================================
    (empty)

Copied: maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml (from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml)
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml?p2=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml&p1=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml&r1=1762963&r2=1762988&rev=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml Sat Oct  1 09:29:45 2016
@@ -24,7 +24,7 @@ under the License.
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
   <inceptionYear>2006</inceptionYear>
-  <name>Maven PMD Plugin Exclusions Configuration Test</name>
+  <name>Maven CPD Plugin Default Configuration Test</name>
   <url>http://maven.apache.org</url>
   <build>
     <finalName>default-configuration</finalName>
@@ -32,15 +32,19 @@ under the License.
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-pmd-plugin</artifactId>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
         <configuration>
           <project implementation="org.apache.maven.plugin.pmd.stubs.DefaultConfigurationMavenProjectStub"/>
+          <outputDirectory>${basedir}/target/test/unit/default-configuration/target/site</outputDirectory>
           <targetDirectory>${basedir}/target/test/unit/default-configuration/target</targetDirectory>
-          <failOnViolation>true</failOnViolation>
-          <verbose>false</verbose>  
-          <language>java</language>
-          <printFailingErrors>true</printFailingErrors>
+          <format>xml</format>
+          <linkXRef>false</linkXRef>
+          <xrefLocation>${basedir}/target/test/unit/default-configuration/target/site/xref</xrefLocation>
+          <minimumTokens>100</minimumTokens>
+          
+          <compileSourceRoots>
+            <compileSourceRoot>${basedir}/src/test/resources/unit/default-configuration/</compileSourceRoot>
+          </compileSourceRoots>
+          <sourceEncoding>UTF-8</sourceEncoding>
           <excludeFromFailureFile>${basedir}/src/test/resources/unit/excludes/cpd_exclude.txt</excludeFromFailureFile>
         </configuration>
       </plugin>

Copied: maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml (from r1762963, maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml)
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml?p2=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml&p1=maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml&r1=1762963&r2=1762988&rev=1762988&view=diff
==============================================================================
--- maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-check-cpd-exclusions-configuration-plugin-config.xml (original)
+++ maven/plugins/trunk/maven-pmd-plugin/src/test/resources/unit/default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml Sat Oct  1 09:29:45 2016
@@ -24,7 +24,7 @@ under the License.
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
   <inceptionYear>2006</inceptionYear>
-  <name>Maven PMD Plugin Exclusions Configuration Test</name>
+  <name>Maven PMD Plugin Default Configuration Test</name>
   <url>http://maven.apache.org</url>
   <build>
     <finalName>default-configuration</finalName>
@@ -32,17 +32,27 @@ under the License.
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-pmd-plugin</artifactId>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-pmd-plugin</artifactId>
         <configuration>
           <project implementation="org.apache.maven.plugin.pmd.stubs.DefaultConfigurationMavenProjectStub"/>
+          <outputDirectory>${basedir}/target/test/unit/default-configuration/target/site</outputDirectory>
           <targetDirectory>${basedir}/target/test/unit/default-configuration/target</targetDirectory>
-          <failOnViolation>true</failOnViolation>
-          <verbose>false</verbose>  
-          <language>java</language>
-          <printFailingErrors>true</printFailingErrors>
-          <excludeFromFailureFile>${basedir}/src/test/resources/unit/excludes/cpd_exclude.txt</excludeFromFailureFile>
+          <format>xml</format>
+          <linkXRef>true</linkXRef>
+          <xrefLocation>${basedir}/target/test/unit/default-configuration/target/site/xref</xrefLocation>
+          <sourceEncoding>UTF-8</sourceEncoding>
+          
+          <compileSourceRoots>
+            <compileSourceRoot>${basedir}/src/test/resources/unit/default-configuration/</compileSourceRoot>
+          </compileSourceRoots>
+          <excludeFromFailureFile>${basedir}/src/test/resources/unit/excludes/pmd_exclude.properties</excludeFromFailureFile>
         </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>pmd</groupId>
+            <artifactId>pmd</artifactId>
+            <version>3.6</version>
+          </dependency>
+        </dependencies>
       </plugin>
     </plugins>
   </build>