diff --git a/pom.xml b/pom.xml
index 5b20c96..551a343 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
@@ -18,14 +17,13 @@
 specific language governing permissions and limitations
 under the License.
 -->
-
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
-    <artifactId>maven-plugins</artifactId>
     <groupId>org.apache.maven.plugins</groupId>
-    <version>37</version>
+    <artifactId>maven-plugins</artifactId>
+    <version>39</version>
     <relativePath />
   </parent>
 
@@ -34,11 +32,9 @@
   <packaging>maven-plugin</packaging>
 
   <name>Apache Maven PMD Plugin</name>
-  <description>
-    A Maven plugin for the PMD toolkit, that produces a report on both code rule violations and detected copy and paste
+  <description>A Maven plugin for the PMD toolkit, that produces a report on both code rule violations and detected copy and paste
     fragments,
-    as well as being able to fail the build based on these metrics.
-  </description>
+    as well as being able to fail the build based on these metrics.</description>
   <inceptionYear>2005</inceptionYear>
 
   <contributors>
@@ -66,8 +62,8 @@
   <scm>
     <connection>scm:git:https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git</connection>
     <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git</developerConnection>
-    <url>https://github.com/apache/maven-pmd-plugin/tree/${project.scm.tag}</url>
     <tag>HEAD</tag>
+    <url>https://github.com/apache/maven-pmd-plugin/tree/${project.scm.tag}</url>
   </scm>
   <issueManagement>
     <system>JIRA</system>
@@ -88,7 +84,8 @@
     <mavenVersion>3.2.5</mavenVersion>
     <doxiaVersion>1.12.0</doxiaVersion>
     <doxiaSitetoolsVersion>1.11.1</doxiaSitetoolsVersion>
-    <javaVersion>8</javaVersion><!-- Because PMD 6.35.0+ requires Java 8 -->
+    <javaVersion>8</javaVersion>
+    <!-- Because PMD 6.35.0+ requires Java 8 -->
     <pmdVersion>6.55.0</pmdVersion>
     <slf4jVersion>1.7.36</slf4jVersion>
     <aetherVersion>1.0.0.v20140518</aetherVersion>
@@ -357,11 +354,11 @@
         </configuration>
         <executions>
           <execution>
-            <phase>generate-sources</phase>
             <goals>
               <goal>java</goal>
               <goal>xpp3-reader</goal>
             </goals>
+            <phase>generate-sources</phase>
           </execution>
         </executions>
       </plugin>
@@ -379,10 +376,10 @@
         <executions>
           <execution>
             <id>check-java-1.8-compat</id>
-            <phase>process-classes</phase>
             <goals>
               <goal>check</goal>
             </goals>
+            <phase>process-classes</phase>
           </execution>
         </executions>
       </plugin>
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
index c262397..0142f2d 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import java.util.Set;
 import java.util.TreeMap;
 
+import net.sourceforge.pmd.PMDVersion;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.Reporting;
@@ -50,17 +50,13 @@
 import org.codehaus.plexus.util.PathTool;
 import org.codehaus.plexus.util.StringUtils;
 
-import net.sourceforge.pmd.PMDVersion;
-
 /**
  * Base class for the PMD reports.
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @version $Id$
  */
-public abstract class AbstractPmdReport
-    extends AbstractMavenReport
-{
+public abstract class AbstractPmdReport extends AbstractMavenReport {
     // ----------------------------------------------------------------------
     // Configurables
     // ----------------------------------------------------------------------
@@ -68,7 +64,7 @@
     /**
      * The output directory for the intermediate XML report.
      */
-    @Parameter( property = "project.build.directory", required = true )
+    @Parameter(property = "project.build.directory", required = true)
     protected File targetDirectory;
 
     /**
@@ -77,26 +73,26 @@
      * renderers. XML is produced in any case, since this format is needed
      * for the check goals (pmd:check, pmd:aggregator-check, pmd:cpd-check, pmd:aggregator-cpd-check).
      */
-    @Parameter( property = "format", defaultValue = "xml" )
+    @Parameter(property = "format", defaultValue = "xml")
     protected String format = "xml";
 
     /**
      * Link the violation line numbers to the source xref. Links will be created automatically if the jxr plugin is
      * being used.
      */
-    @Parameter( property = "linkXRef", defaultValue = "true" )
+    @Parameter(property = "linkXRef", defaultValue = "true")
     private boolean linkXRef;
 
     /**
      * Location of the Xrefs to link to.
      */
-    @Parameter( defaultValue = "${project.reporting.outputDirectory}/xref" )
+    @Parameter(defaultValue = "${project.reporting.outputDirectory}/xref")
     private File xrefLocation;
 
     /**
      * Location of the Test Xrefs to link to.
      */
-    @Parameter( defaultValue = "${project.reporting.outputDirectory}/xref-test" )
+    @Parameter(defaultValue = "${project.reporting.outputDirectory}/xref-test")
     private File xrefTestLocation;
 
     /**
@@ -124,7 +120,7 @@
      * Defaults to <code>project.compileSourceRoots</code>.
      * @since 3.7
      */
-    @Parameter( defaultValue = "${project.compileSourceRoots}" )
+    @Parameter(defaultValue = "${project.compileSourceRoots}")
     private List<String> compileSourceRoots;
 
     /**
@@ -132,7 +128,7 @@
      * Defaults to <code>project.testCompileSourceRoots</code>
      * @since 3.7
      */
-    @Parameter( defaultValue = "${project.testCompileSourceRoots}" )
+    @Parameter(defaultValue = "${project.testCompileSourceRoots}")
     private List<String> testSourceRoots;
 
     /**
@@ -148,7 +144,7 @@
      *
      * @since 2.2
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     protected boolean includeTests;
 
     /**
@@ -158,7 +154,7 @@
      * @deprecated since 3.15.0 Use the goals <code>pmd:aggregate-pmd</code> and <code>pmd:aggregate-cpd</code>
      * instead.
      */
-    @Parameter( property = "aggregate", defaultValue = "false" )
+    @Parameter(property = "aggregate", defaultValue = "false")
     @Deprecated
     protected boolean aggregate;
 
@@ -167,7 +163,7 @@
      *
      * @since 3.0
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     protected boolean includeXmlInSite;
 
     /**
@@ -178,7 +174,7 @@
      *
      * @since 3.1
      */
-    @Parameter( defaultValue = "false" )
+    @Parameter(defaultValue = "false")
     protected boolean skipEmptyReport;
 
     /**
@@ -189,7 +185,7 @@
      *
      * @since 3.7
      */
-    @Parameter( property = "pmd.excludeFromFailureFile", defaultValue = "" )
+    @Parameter(property = "pmd.excludeFromFailureFile", defaultValue = "")
     protected String excludeFromFailureFile;
 
     /**
@@ -201,7 +197,7 @@
      *
      * @since 3.9.0
      */
-    @Parameter( defaultValue = "true", property = "pmd.showPmdLog" )
+    @Parameter(defaultValue = "true", property = "pmd.showPmdLog")
     protected boolean showPmdLog = true;
 
     /**
@@ -248,14 +244,14 @@
     /**
      * The projects in the reactor for aggregation report.
      */
-    @Parameter( property = "reactorProjects", readonly = true )
+    @Parameter(property = "reactorProjects", readonly = true)
     protected List<MavenProject> reactorProjects;
 
     /**
      * The current build session instance. This is used for
      * toolchain manager API calls and for dependency resolver API calls.
      */
-    @Parameter( defaultValue = "${session}", required = true, readonly = true )
+    @Parameter(defaultValue = "${session}", required = true, readonly = true)
     protected MavenSession session;
 
     @Component
@@ -268,50 +264,39 @@
      * {@inheritDoc}
      */
     @Override
-    protected MavenProject getProject()
-    {
+    protected MavenProject getProject() {
         return project;
     }
 
-    protected String constructXRefLocation( boolean test )
-    {
+    protected String constructXRefLocation(boolean test) {
         String location = null;
-        if ( linkXRef )
-        {
+        if (linkXRef) {
             File xrefLoc = test ? xrefTestLocation : xrefLocation;
 
             String relativePath =
-                PathTool.getRelativePath( outputDirectory.getAbsolutePath(), xrefLoc.getAbsolutePath() );
-            if ( StringUtils.isEmpty( relativePath ) )
-            {
+                    PathTool.getRelativePath(outputDirectory.getAbsolutePath(), xrefLoc.getAbsolutePath());
+            if (StringUtils.isEmpty(relativePath)) {
                 relativePath = ".";
             }
             relativePath = relativePath + "/" + xrefLoc.getName();
-            if ( xrefLoc.exists() )
-            {
+            if (xrefLoc.exists()) {
                 // XRef was already generated by manual execution of a lifecycle binding
                 location = relativePath;
-            }
-            else
-            {
+            } else {
                 // Not yet generated - check if the report is on its way
                 Reporting reporting = project.getModel().getReporting();
-                List<ReportPlugin> reportPlugins = reporting != null
-                        ? reporting.getPlugins()
-                        : Collections.<ReportPlugin>emptyList();
-                for ( ReportPlugin plugin : reportPlugins )
-                {
+                List<ReportPlugin> reportPlugins =
+                        reporting != null ? reporting.getPlugins() : Collections.<ReportPlugin>emptyList();
+                for (ReportPlugin plugin : reportPlugins) {
                     String artifactId = plugin.getArtifactId();
-                    if ( "maven-jxr-plugin".equals( artifactId ) || "jxr-maven-plugin".equals( artifactId ) )
-                    {
+                    if ("maven-jxr-plugin".equals(artifactId) || "jxr-maven-plugin".equals(artifactId)) {
                         location = relativePath;
                     }
                 }
             }
 
-            if ( location == null )
-            {
-                getLog().warn( "Unable to locate Source XRef to link to - DISABLED" );
+            if (location == null) {
+                getLog().warn("Unable to locate Source XRef to link to - DISABLED");
             }
         }
         return location;
@@ -324,112 +309,88 @@
      * @throws IOException If an I/O error occurs during construction of the
      *                     canonical pathnames of the files
      */
-    protected Map<File, PmdFileInfo> getFilesToProcess()
-        throws IOException
-    {
-        if ( aggregate && !project.isExecutionRoot() )
-        {
+    protected Map<File, PmdFileInfo> getFilesToProcess() throws IOException {
+        if (aggregate && !project.isExecutionRoot()) {
             return Collections.emptyMap();
         }
 
-        if ( excludeRoots == null )
-        {
+        if (excludeRoots == null) {
             excludeRoots = new File[0];
         }
 
-        Collection<File> excludeRootFiles = new HashSet<>( excludeRoots.length );
+        Collection<File> excludeRootFiles = new HashSet<>(excludeRoots.length);
 
-        for ( File file : excludeRoots )
-        {
-            if ( file.isDirectory() )
-            {
-                excludeRootFiles.add( file );
+        for (File file : excludeRoots) {
+            if (file.isDirectory()) {
+                excludeRootFiles.add(file);
             }
         }
 
         List<PmdFileInfo> directories = new ArrayList<>();
 
-        if ( null == compileSourceRoots )
-        {
+        if (null == compileSourceRoots) {
             compileSourceRoots = project.getCompileSourceRoots();
         }
-        if ( compileSourceRoots != null )
-        {
-            for ( String root : compileSourceRoots )
-            {
-                File sroot = new File( root );
-                if ( sroot.exists() )
-                {
-                    String sourceXref = constructXRefLocation( false );
-                    directories.add( new PmdFileInfo( project, sroot, sourceXref ) );
+        if (compileSourceRoots != null) {
+            for (String root : compileSourceRoots) {
+                File sroot = new File(root);
+                if (sroot.exists()) {
+                    String sourceXref = constructXRefLocation(false);
+                    directories.add(new PmdFileInfo(project, sroot, sourceXref));
                 }
             }
         }
 
-        if ( null == testSourceRoots )
-        {
+        if (null == testSourceRoots) {
             testSourceRoots = project.getTestCompileSourceRoots();
         }
-        if ( includeTests && testSourceRoots != null )
-        {
-            for ( String root : testSourceRoots )
-            {
-                File sroot = new File( root );
-                if ( sroot.exists() )
-                {
-                    String testXref = constructXRefLocation( true );
-                    directories.add( new PmdFileInfo( project, sroot, testXref ) );
+        if (includeTests && testSourceRoots != null) {
+            for (String root : testSourceRoots) {
+                File sroot = new File(root);
+                if (sroot.exists()) {
+                    String testXref = constructXRefLocation(true);
+                    directories.add(new PmdFileInfo(project, sroot, testXref));
                 }
             }
         }
-        if ( isAggregator() )
-        {
-            for ( MavenProject localProject : getAggregatedProjects() )
-            {
+        if (isAggregator()) {
+            for (MavenProject localProject : getAggregatedProjects()) {
                 List<String> localCompileSourceRoots = localProject.getCompileSourceRoots();
-                for ( String root : localCompileSourceRoots )
-                {
-                    File sroot = new File( root );
-                    if ( sroot.exists() )
-                    {
-                        String sourceXref = constructXRefLocation( false );
-                        directories.add( new PmdFileInfo( localProject, sroot, sourceXref ) );
+                for (String root : localCompileSourceRoots) {
+                    File sroot = new File(root);
+                    if (sroot.exists()) {
+                        String sourceXref = constructXRefLocation(false);
+                        directories.add(new PmdFileInfo(localProject, sroot, sourceXref));
                     }
                 }
-                if ( includeTests )
-                {
+                if (includeTests) {
                     List<String> localTestCompileSourceRoots = localProject.getTestCompileSourceRoots();
-                    for ( String root : localTestCompileSourceRoots )
-                    {
-                        File sroot = new File( root );
-                        if ( sroot.exists() )
-                        {
-                            String testXref = constructXRefLocation( true );
-                            directories.add( new PmdFileInfo( localProject, sroot, testXref ) );
+                    for (String root : localTestCompileSourceRoots) {
+                        File sroot = new File(root);
+                        if (sroot.exists()) {
+                            String testXref = constructXRefLocation(true);
+                            directories.add(new PmdFileInfo(localProject, sroot, testXref));
                         }
                     }
                 }
             }
-
         }
 
         String excluding = getExcludes();
-        getLog().debug( "Exclusions: " + excluding );
+        getLog().debug("Exclusions: " + excluding);
         String including = getIncludes();
-        getLog().debug( "Inclusions: " + including );
+        getLog().debug("Inclusions: " + including);
 
         Map<File, PmdFileInfo> files = new TreeMap<>();
 
-        for ( PmdFileInfo finfo : directories )
-        {
-            getLog().debug( "Searching for files in directory " + finfo.getSourceDirectory().toString() );
+        for (PmdFileInfo finfo : directories) {
+            getLog().debug("Searching for files in directory "
+                    + finfo.getSourceDirectory().toString());
             File sourceDirectory = finfo.getSourceDirectory();
-            if ( sourceDirectory.isDirectory() && !isDirectoryExcluded( excludeRootFiles, sourceDirectory ) )
-            {
-                List<File> newfiles = FileUtils.getFiles( sourceDirectory, including, excluding );
-                for ( File newfile : newfiles )
-                {
-                    files.put( newfile.getCanonicalFile(), finfo );
+            if (sourceDirectory.isDirectory() && !isDirectoryExcluded(excludeRootFiles, sourceDirectory)) {
+                List<File> newfiles = FileUtils.getFiles(sourceDirectory, including, excluding);
+                for (File newfile : newfiles) {
+                    files.put(newfile.getCanonicalFile(), finfo);
                 }
             }
         }
@@ -437,29 +398,22 @@
         return files;
     }
 
-    private boolean isDirectoryExcluded( Collection<File> excludeRootFiles, File sourceDirectoryToCheck )
-    {
+    private boolean isDirectoryExcluded(Collection<File> excludeRootFiles, File sourceDirectoryToCheck) {
         boolean returnVal = false;
-        for ( File excludeDir : excludeRootFiles )
-        {
-            try
-            {
-                if ( sourceDirectoryToCheck
-                    .getCanonicalFile()
-                    .toPath()
-                    .startsWith( excludeDir.getCanonicalFile().toPath() ) )
-                {
-                    getLog().debug( "Directory " + sourceDirectoryToCheck.getAbsolutePath()
-                                        + " has been excluded as it matches excludeRoot "
-                                        + excludeDir.getAbsolutePath() );
+        for (File excludeDir : excludeRootFiles) {
+            try {
+                if (sourceDirectoryToCheck
+                        .getCanonicalFile()
+                        .toPath()
+                        .startsWith(excludeDir.getCanonicalFile().toPath())) {
+                    getLog().debug("Directory " + sourceDirectoryToCheck.getAbsolutePath()
+                            + " has been excluded as it matches excludeRoot "
+                            + excludeDir.getAbsolutePath());
                     returnVal = true;
                     break;
                 }
-            }
-            catch ( IOException e )
-            {
-                getLog().warn( "Error while checking " + sourceDirectoryToCheck
-                               + " whether it should be excluded.", e );
+            } catch (IOException e) {
+                getLog().warn("Error while checking " + sourceDirectoryToCheck + " whether it should be excluded.", e);
             }
         }
         return returnVal;
@@ -470,18 +424,15 @@
      *
      * @return The comma separated list of effective include patterns, never <code>null</code>.
      */
-    private String getIncludes()
-    {
+    private String getIncludes() {
         Collection<String> patterns = new LinkedHashSet<>();
-        if ( includes != null )
-        {
-            patterns.addAll( includes );
+        if (includes != null) {
+            patterns.addAll(includes);
         }
-        if ( patterns.isEmpty() )
-        {
-            patterns.add( "**/*.java" );
+        if (patterns.isEmpty()) {
+            patterns.add("**/*.java");
         }
-        return StringUtils.join( patterns.iterator(), "," );
+        return StringUtils.join(patterns.iterator(), ",");
     }
 
     /**
@@ -489,134 +440,111 @@
      *
      * @return The comma separated list of effective exclude patterns, never <code>null</code>.
      */
-    private String getExcludes()
-    {
-        Collection<String> patterns = new LinkedHashSet<>( FileUtils.getDefaultExcludesAsList() );
-        if ( excludes != null )
-        {
-            patterns.addAll( excludes );
+    private String getExcludes() {
+        Collection<String> patterns = new LinkedHashSet<>(FileUtils.getDefaultExcludesAsList());
+        if (excludes != null) {
+            patterns.addAll(excludes);
         }
-        return StringUtils.join( patterns.iterator(), "," );
+        return StringUtils.join(patterns.iterator(), ",");
     }
 
-    protected boolean isXml()
-    {
-        return "xml".equals( format );
+    protected boolean isXml() {
+        return "xml".equals(format);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public boolean canGenerateReport()
-    {
-        if ( aggregate && !project.isExecutionRoot() )
-        {
+    public boolean canGenerateReport() {
+        if (aggregate && !project.isExecutionRoot()) {
             return false;
         }
 
-        if ( !isAggregator() && "pom".equalsIgnoreCase( project.getPackaging() ) )
-        {
+        if (!isAggregator() && "pom".equalsIgnoreCase(project.getPackaging())) {
             return false;
         }
 
         // if format is XML, we need to output it even if the file list is empty
         // so the "check" goals can check for failures
-        if ( isXml() )
-        {
+        if (isXml()) {
             return true;
         }
-        try
-        {
+        try {
             filesToProcess = getFilesToProcess();
-            if ( filesToProcess.isEmpty() )
-            {
+            if (filesToProcess.isEmpty()) {
                 return false;
             }
-        }
-        catch ( IOException e )
-        {
-            getLog().error( e );
+        } catch (IOException e) {
+            getLog().error(e);
         }
         return true;
     }
 
-    protected String determineCurrentRootLogLevel()
-    {
-        String logLevel = System.getProperty( "org.slf4j.simpleLogger.defaultLogLevel" );
-        if ( logLevel == null )
-        {
-            logLevel = System.getProperty( "maven.logging.root.level" );
+    protected String determineCurrentRootLogLevel() {
+        String logLevel = System.getProperty("org.slf4j.simpleLogger.defaultLogLevel");
+        if (logLevel == null) {
+            logLevel = System.getProperty("maven.logging.root.level");
         }
-        if ( logLevel == null )
-        {
+        if (logLevel == null) {
             // TODO: logback level
             logLevel = "info";
         }
         return logLevel;
     }
 
-    static String getPmdVersion()
-    {
+    static String getPmdVersion() {
         return PMDVersion.VERSION;
     }
 
-    //TODO remove the part with ToolchainManager lookup once we depend on
-    //3.0.9 (have it as prerequisite). Define as regular component field then.
-    protected final Toolchain getToolchain()
-    {
+    // TODO remove the part with ToolchainManager lookup once we depend on
+    // 3.0.9 (have it as prerequisite). Define as regular component field then.
+    protected final Toolchain getToolchain() {
         Toolchain tc = null;
 
-        if ( jdkToolchain != null )
-        {
+        if (jdkToolchain != null) {
             // Maven 3.3.1 has plugin execution scoped Toolchain Support
-            try
-            {
-                Method getToolchainsMethod =
-                    toolchainManager.getClass().getMethod( "getToolchains", MavenSession.class, String.class,
-                                                           Map.class );
+            try {
+                Method getToolchainsMethod = toolchainManager
+                        .getClass()
+                        .getMethod("getToolchains", MavenSession.class, String.class, Map.class);
 
-                @SuppressWarnings( "unchecked" )
+                @SuppressWarnings("unchecked")
                 List<Toolchain> tcs =
-                    (List<Toolchain>) getToolchainsMethod.invoke( toolchainManager, session, "jdk",
-                                                                  jdkToolchain );
+                        (List<Toolchain>) getToolchainsMethod.invoke(toolchainManager, session, "jdk", jdkToolchain);
 
-                if ( tcs != null && !tcs.isEmpty() )
-                {
-                    tc = tcs.get( 0 );
+                if (tcs != null && !tcs.isEmpty()) {
+                    tc = tcs.get(0);
                 }
-            }
-            catch ( NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
-                | InvocationTargetException e )
-            {
+            } catch (NoSuchMethodException
+                    | SecurityException
+                    | IllegalAccessException
+                    | IllegalArgumentException
+                    | InvocationTargetException e) {
                 // ignore
             }
         }
 
-        if ( tc == null )
-        {
-            tc = toolchainManager.getToolchainFromBuildContext( "jdk", session );
+        if (tc == null) {
+            tc = toolchainManager.getToolchainFromBuildContext("jdk", session);
         }
 
         return tc;
     }
 
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         // returning here aggregate for backwards compatibility
         return aggregate;
     }
 
     // Note: same logic as in m-javadoc-p (MJAVADOC-134)
-    protected Collection<MavenProject> getAggregatedProjects()
-    {
+    protected Collection<MavenProject> getAggregatedProjects() {
         Map<Path, MavenProject> reactorProjectsMap = new HashMap<>();
-        for ( MavenProject reactorProject : this.reactorProjects )
-        {
-            reactorProjectsMap.put( reactorProject.getBasedir().toPath(), reactorProject );
+        for (MavenProject reactorProject : this.reactorProjects) {
+            reactorProjectsMap.put(reactorProject.getBasedir().toPath(), reactorProject);
         }
 
-        return modulesForAggregatedProject( project, reactorProjectsMap );
+        return modulesForAggregatedProject(project, reactorProjectsMap);
     }
 
     /**
@@ -626,33 +554,28 @@
      * @param reactorProjectsMap map of (still) available reactor projects
      * @throws MavenReportException if any
      */
-    private Set<MavenProject> modulesForAggregatedProject( MavenProject aggregatedProject,
-                                                           Map<Path, MavenProject> reactorProjectsMap )
-    {
+    private Set<MavenProject> modulesForAggregatedProject(
+            MavenProject aggregatedProject, Map<Path, MavenProject> reactorProjectsMap) {
         // Maven does not supply an easy way to get the projects representing
         // the modules of a project. So we will get the paths to the base
         // directories of the modules from the project and compare with the
         // base directories of the projects in the reactor.
 
-        if ( aggregatedProject.getModules().isEmpty() )
-        {
-            return Collections.singleton( aggregatedProject );
+        if (aggregatedProject.getModules().isEmpty()) {
+            return Collections.singleton(aggregatedProject);
         }
 
         List<Path> modulePaths = new LinkedList<Path>();
-        for ( String module :  aggregatedProject.getModules() )
-        {
-            modulePaths.add( new File( aggregatedProject.getBasedir(), module ).toPath() );
+        for (String module : aggregatedProject.getModules()) {
+            modulePaths.add(new File(aggregatedProject.getBasedir(), module).toPath());
         }
 
         Set<MavenProject> aggregatedModules = new LinkedHashSet<>();
 
-        for ( Path modulePath : modulePaths )
-        {
-            MavenProject module = reactorProjectsMap.remove( modulePath );
-            if ( module != null )
-            {
-                aggregatedModules.addAll( modulesForAggregatedProject( module, reactorProjectsMap ) );
+        for (Path modulePath : modulePaths) {
+            MavenProject module = reactorProjectsMap.remove(modulePath);
+            if (module != null) {
+                aggregatedModules.addAll(modulesForAggregatedProject(module, reactorProjectsMap));
             }
         }
 
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
index 88bdaba..48cda50 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AbstractPmdViolationCheckMojo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -39,13 +38,11 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @version $Id$
  */
-public abstract class AbstractPmdViolationCheckMojo<D>
-    extends AbstractMojo
-{
+public abstract class AbstractPmdViolationCheckMojo<D> extends AbstractMojo {
     /**
      * The location of the XML report to check, as generated by the PMD report.
      */
-    @Parameter( property = "project.build.directory", required = true )
+    @Parameter(property = "project.build.directory", required = true)
     private File targetDirectory;
 
     /**
@@ -53,7 +50,7 @@
      * The properties {@code failurePriority} and {@code maxAllowedViolations} control
      * under which conditions exactly the build should be failed.
      */
-    @Parameter( property = "pmd.failOnViolation", defaultValue = "true", required = true )
+    @Parameter(property = "pmd.failOnViolation", defaultValue = "true", required = true)
     protected boolean failOnViolation;
 
     /**
@@ -63,14 +60,14 @@
      * @deprecated since 3.15.0 Use the goal <code>pmd:aggregate-check</code> or
      * <code>pmd:aggregate-cpd-check</code> instead.
      */
-    @Parameter( property = "aggregate", defaultValue = "false" )
+    @Parameter(property = "aggregate", defaultValue = "false")
     @Deprecated
     protected boolean aggregate;
 
     /**
      * Print details of check failures to build output.
      */
-    @Parameter( property = "pmd.verbose", defaultValue = "false" )
+    @Parameter(property = "pmd.verbose", defaultValue = "false")
     private boolean verbose;
 
     /**
@@ -78,7 +75,7 @@
      *
      * @since 3.0
      */
-    @Parameter( property = "pmd.printFailingErrors", defaultValue = "false" )
+    @Parameter(property = "pmd.printFailingErrors", defaultValue = "false")
     private boolean printFailingErrors;
 
     /**
@@ -89,7 +86,7 @@
      *
      * @since 3.0
      */
-    @Parameter( property = "pmd.excludeFromFailureFile", defaultValue = "" )
+    @Parameter(property = "pmd.excludeFromFailureFile", defaultValue = "")
     private String excludeFromFailureFile;
 
     /**
@@ -102,7 +99,7 @@
      *
      * @since 3.10.0
      */
-    @Parameter( property = "pmd.maxAllowedViolations", defaultValue = "0" )
+    @Parameter(property = "pmd.maxAllowedViolations", defaultValue = "0")
     private int maxAllowedViolations;
 
     /** Helper to exclude violations from the result. */
@@ -112,80 +109,66 @@
      * Initialize this abstact check mojo by giving the correct ExcludeFromFile helper.
      * @param excludeFromFile the needed helper, for the specific violation type
      */
-    protected AbstractPmdViolationCheckMojo( ExcludeFromFile<D> excludeFromFile )
-    {
+    protected AbstractPmdViolationCheckMojo(ExcludeFromFile<D> excludeFromFile) {
         this.excludeFromFile = excludeFromFile;
     }
 
     /**
      * The project to analyze.
      */
-    @Parameter( defaultValue = "${project}", readonly = true, required = true )
+    @Parameter(defaultValue = "${project}", readonly = true, required = true)
     protected MavenProject project;
 
-    protected void executeCheck( final String filename, final String tagName, final String key,
-                                 final int failurePriority )
-        throws MojoFailureException, MojoExecutionException
-    {
-        if ( aggregate && !project.isExecutionRoot() )
-        {
+    protected void executeCheck(
+            final String filename, final String tagName, final String key, final int failurePriority)
+            throws MojoFailureException, MojoExecutionException {
+        if (aggregate && !project.isExecutionRoot()) {
             return;
         }
 
-        if ( !isAggregator() && "pom".equalsIgnoreCase( project.getPackaging() ) )
-        {
+        if (!isAggregator() && "pom".equalsIgnoreCase(project.getPackaging())) {
             return;
         }
 
-        excludeFromFile.loadExcludeFromFailuresData( excludeFromFailureFile );
-        final File outputFile = new File( targetDirectory, filename );
+        excludeFromFile.loadExcludeFromFailuresData(excludeFromFailureFile);
+        final File outputFile = new File(targetDirectory, filename);
 
-        if ( outputFile.exists() )
-        {
-            getLog().info( "PMD version: " + AbstractPmdReport.getPmdVersion() );
+        if (outputFile.exists()) {
+            getLog().info("PMD version: " + AbstractPmdReport.getPmdVersion());
 
-            try
-            {
-                final ViolationDetails<D> violations = getViolations( outputFile, failurePriority );
+            try {
+                final ViolationDetails<D> violations = getViolations(outputFile, failurePriority);
 
                 final List<D> failures = violations.getFailureDetails();
                 final List<D> warnings = violations.getWarningDetails();
 
-                if ( verbose )
-                {
-                    printErrors( failures, warnings );
+                if (verbose) {
+                    printErrors(failures, warnings);
                 }
 
                 final int failureCount = failures.size();
                 final int warningCount = warnings.size();
 
-                final String message = getMessage( failureCount, warningCount, key, outputFile );
+                final String message = getMessage(failureCount, warningCount, key, outputFile);
 
-                getLog().debug( "PMD failureCount: " + failureCount + ", warningCount: " + warningCount );
+                getLog().debug("PMD failureCount: " + failureCount + ", warningCount: " + warningCount);
 
-                if ( failureCount > getMaxAllowedViolations() && isFailOnViolation() )
-                {
-                    throw new MojoFailureException( message );
+                if (failureCount > getMaxAllowedViolations() && isFailOnViolation()) {
+                    throw new MojoFailureException(message);
                 }
 
-                this.getLog().info( message );
+                this.getLog().info(message);
 
-                if ( failureCount > 0 && isFailOnViolation() && failureCount <= getMaxAllowedViolations() )
-                {
-                    this.getLog().info( "The build is not failed, since " + getMaxAllowedViolations()
-                        + " violations are allowed (maxAllowedViolations)." );
+                if (failureCount > 0 && isFailOnViolation() && failureCount <= getMaxAllowedViolations()) {
+                    this.getLog()
+                            .info("The build is not failed, since " + getMaxAllowedViolations()
+                                    + " violations are allowed (maxAllowedViolations).");
                 }
+            } catch (final IOException | XmlPullParserException e) {
+                throw new MojoExecutionException("Unable to read PMD results xml: " + outputFile.getAbsolutePath(), e);
             }
-            catch ( final IOException | XmlPullParserException e )
-            {
-                throw new MojoExecutionException(
-                                                  "Unable to read PMD results xml: " + outputFile.getAbsolutePath(),
-                                                  e );
-            }
-        }
-        else
-        {
-            throw new MojoFailureException( "Unable to perform check, " + "unable to find " + outputFile );
+        } else {
+            throw new MojoFailureException("Unable to perform check, " + "unable to find " + outputFile);
         }
     }
 
@@ -198,38 +181,32 @@
      * @throws XmlPullParserException
      * @throws IOException
      */
-    private ViolationDetails<D> getViolations( final File analysisFile, final int failurePriority )
-        throws XmlPullParserException, IOException
-    {
+    private ViolationDetails<D> getViolations(final File analysisFile, final int failurePriority)
+            throws XmlPullParserException, IOException {
         final List<D> failures = new ArrayList<>();
         final List<D> warnings = new ArrayList<>();
 
-        final List<D> violations = getErrorDetails( analysisFile );
+        final List<D> violations = getErrorDetails(analysisFile);
 
-        for ( final D violation : violations )
-        {
-            final int priority = getPriority( violation );
-            if ( priority <= failurePriority && !excludeFromFile.isExcludedFromFailure( violation ) )
-            {
-                failures.add( violation );
-                if ( printFailingErrors )
-                {
-                    printError( violation, "Failure" );
+        for (final D violation : violations) {
+            final int priority = getPriority(violation);
+            if (priority <= failurePriority && !excludeFromFile.isExcludedFromFailure(violation)) {
+                failures.add(violation);
+                if (printFailingErrors) {
+                    printError(violation, "Failure");
                 }
-            }
-            else
-            {
-                warnings.add( violation );
+            } else {
+                warnings.add(violation);
             }
         }
 
         final ViolationDetails<D> details = newViolationDetailsInstance();
-        details.setFailureDetails( failures );
-        details.setWarningDetails( warnings );
+        details.setFailureDetails(failures);
+        details.setWarningDetails(warnings);
         return details;
     }
 
-    protected abstract int getPriority( D errorDetail );
+    protected abstract int getPriority(D errorDetail);
 
     protected abstract ViolationDetails<D> newViolationDetailsInstance();
 
@@ -239,16 +216,13 @@
      * @param failures list of failures
      * @param warnings list of warnings
      */
-    protected void printErrors( final List<D> failures, final List<D> warnings )
-    {
-        for ( final D warning : warnings )
-        {
-            printError( warning, "Warning" );
+    protected void printErrors(final List<D> failures, final List<D> warnings) {
+        for (final D warning : warnings) {
+            printError(warning, "Warning");
         }
 
-        for ( final D failure : failures )
-        {
-            printError( failure, "Failure" );
+        for (final D failure : failures) {
+            printError(failure, "Failure");
         }
     }
 
@@ -261,31 +235,27 @@
      * @param outputFile
      * @return
      */
-    private String getMessage( final int failureCount, final int warningCount, final String key, final File outputFile )
-    {
-        final StringBuilder message = new StringBuilder( 256 );
-        if ( failureCount > 0 || warningCount > 0 )
-        {
-            if ( failureCount > 0 )
-            {
-                message.append( "You have " ).append( failureCount ).append( " " ).append( key ).
-                  append( failureCount > 1 ? "s" : "" );
+    private String getMessage(final int failureCount, final int warningCount, final String key, final File outputFile) {
+        final StringBuilder message = new StringBuilder(256);
+        if (failureCount > 0 || warningCount > 0) {
+            if (failureCount > 0) {
+                message.append("You have ")
+                        .append(failureCount)
+                        .append(" ")
+                        .append(key)
+                        .append(failureCount > 1 ? "s" : "");
             }
 
-            if ( warningCount > 0 )
-            {
-                if ( failureCount > 0 )
-                {
-                    message.append( " and " );
+            if (warningCount > 0) {
+                if (failureCount > 0) {
+                    message.append(" and ");
+                } else {
+                    message.append("You have ");
                 }
-                else
-                {
-                    message.append( "You have " );
-                }
-                message.append( warningCount ).append( " warning" ).append( warningCount > 1 ? "s" : "" );
+                message.append(warningCount).append(" warning").append(warningCount > 1 ? "s" : "");
             }
 
-            message.append( ". For more details see: " ).append( outputFile.getAbsolutePath() );
+            message.append(". For more details see: ").append(outputFile.getAbsolutePath());
         }
         return message.toString();
     }
@@ -297,7 +267,7 @@
      * or a {@link org.apache.maven.plugins.pmd.model.Duplication} from CPD
      * @param severity the found issue is prefixed with the given severity, usually "Warning" or "Failure".
      */
-    protected abstract void printError( D item, String severity );
+    protected abstract void printError(D item, String severity);
 
     /**
      * Gets the attributes and text for the violation tag and puts them in a HashMap
@@ -308,21 +278,17 @@
      * @throws XmlPullParserException if the analysis file contains invalid XML
      * @throws IOException if the analysis file could be read
      */
-    protected abstract List<D> getErrorDetails( File analysisFile )
-        throws XmlPullParserException, IOException;
+    protected abstract List<D> getErrorDetails(File analysisFile) throws XmlPullParserException, IOException;
 
-    public boolean isFailOnViolation()
-    {
+    public boolean isFailOnViolation() {
         return failOnViolation;
     }
 
-    public Integer getMaxAllowedViolations()
-    {
+    public Integer getMaxAllowedViolations() {
         return maxAllowedViolations;
     }
 
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         // returning here aggregate for backwards compatibility
         return aggregate;
     }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java
index e3aa906..482b709 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugins.annotations.Mojo;
 
@@ -30,12 +29,10 @@
  *
  * @since 3.15.0
  */
-@Mojo( name = "aggregate-cpd", aggregator = true, threadSafe = true )
-public class AggregatorCpdReport extends CpdReport
-{
+@Mojo(name = "aggregate-cpd", aggregator = true, threadSafe = true)
+public class AggregatorCpdReport extends CpdReport {
     @Override
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         return true;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java
index 25bbb78..1e034a6 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorCpdViolationCheckMojo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -28,13 +27,11 @@
  *
  * @since 3.15.0
  */
-@Mojo( name = "aggregate-cpd-check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true, aggregator = true )
-@Execute( goal = "aggregate-cpd" )
-public class AggregatorCpdViolationCheckMojo extends CpdViolationCheckMojo
-{
+@Mojo(name = "aggregate-cpd-check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true, aggregator = true)
+@Execute(goal = "aggregate-cpd")
+public class AggregatorCpdViolationCheckMojo extends CpdViolationCheckMojo {
     @Override
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         return true;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java
index 216ebae..8418594 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdNoForkReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -26,12 +25,13 @@
 
 /**
  * Creates a PMD site report in an <b>aggregator</b> project without forking the <code>test-compile</code> phase again.
- * 
+ *
  * @since 3.15.0
  */
-@Mojo( name = "aggregate-pmd-no-fork", aggregator = true, threadSafe = true,
-    requiresDependencyResolution = ResolutionScope.TEST )
-@Execute( phase = LifecyclePhase.NONE )
-public class AggregatorPmdNoForkReport extends AggregatorPmdReport
-{
-}
+@Mojo(
+        name = "aggregate-pmd-no-fork",
+        aggregator = true,
+        threadSafe = true,
+        requiresDependencyResolution = ResolutionScope.TEST)
+@Execute(phase = LifecyclePhase.NONE)
+public class AggregatorPmdNoForkReport extends AggregatorPmdReport {}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java
index 3495241..8e635b4 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -27,17 +26,14 @@
 /**
  * Creates a PMD site report in an <b>aggregator</b> project based on the rulesets and configuration set in the plugin.
  * It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.
- * 
+ *
  * @since 3.15.0
  */
-@Mojo( name = "aggregate-pmd", aggregator = true, threadSafe = true,
-    requiresDependencyResolution = ResolutionScope.TEST )
-@Execute( phase = LifecyclePhase.TEST_COMPILE )
-public class AggregatorPmdReport extends PmdReport
-{
+@Mojo(name = "aggregate-pmd", aggregator = true, threadSafe = true, requiresDependencyResolution = ResolutionScope.TEST)
+@Execute(phase = LifecyclePhase.TEST_COMPILE)
+public class AggregatorPmdReport extends PmdReport {
     @Override
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         return true;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java
index 6fdcab3..48cd826 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/AggregatorPmdViolationCheckMojo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -28,13 +27,11 @@
  *
  * @since 3.15.0
  */
-@Mojo( name = "aggregate-pmd-check", defaultPhase = LifecyclePhase.VERIFY, aggregator = true, threadSafe = true )
-@Execute( goal = "aggregate-pmd" )
-public class AggregatorPmdViolationCheckMojo extends PmdViolationCheckMojo
-{
+@Mojo(name = "aggregate-pmd-check", defaultPhase = LifecyclePhase.VERIFY, aggregator = true, threadSafe = true)
+@Execute(goal = "aggregate-pmd")
+public class AggregatorPmdViolationCheckMojo extends PmdViolationCheckMojo {
     @Override
-    protected boolean isAggregator()
-    {
+    protected boolean isAggregator() {
         return true;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
index 522b350..e5c4249 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -25,6 +24,8 @@
 import java.util.Properties;
 import java.util.ResourceBundle;
 
+import net.sourceforge.pmd.cpd.JavaTokenizer;
+import net.sourceforge.pmd.cpd.renderer.CPDRenderer;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.pmd.exec.CpdExecutor;
@@ -33,9 +34,6 @@
 import org.apache.maven.reporting.MavenReportException;
 import org.apache.maven.toolchain.Toolchain;
 
-import net.sourceforge.pmd.cpd.JavaTokenizer;
-import net.sourceforge.pmd.cpd.renderer.CPDRenderer;
-
 /**
  * Creates a report for PMD's Copy/Paste Detector (CPD) tool.
  * It can also generate a cpd results file in any of these formats: xml, csv or txt.
@@ -47,23 +45,21 @@
  * @version $Id$
  * @since 2.0
  */
-@Mojo( name = "cpd", threadSafe = true )
-public class CpdReport
-    extends AbstractPmdReport
-{
+@Mojo(name = "cpd", threadSafe = true)
+public class CpdReport extends AbstractPmdReport {
     /**
      * The programming language to be analyzed by CPD. Valid values are currently <code>java</code>,
      * <code>javascript</code> or <code>jsp</code>.
      *
      * @since 3.5
      */
-    @Parameter( defaultValue = "java" )
+    @Parameter(defaultValue = "java")
     private String language;
 
     /**
      * The minimum number of tokens that need to be duplicated before it causes a violation.
      */
-    @Parameter( property = "minimumTokens", defaultValue = "100" )
+    @Parameter(property = "minimumTokens", defaultValue = "100")
     private int minimumTokens;
 
     /**
@@ -71,7 +67,7 @@
      *
      * @since 2.1
      */
-    @Parameter( property = "cpd.skip", defaultValue = "false" )
+    @Parameter(property = "cpd.skip", defaultValue = "false")
     private boolean skip;
 
     /**
@@ -81,7 +77,7 @@
      *
      * @since 2.5
      */
-    @Parameter( property = "cpd.ignoreLiterals", defaultValue = "false" )
+    @Parameter(property = "cpd.ignoreLiterals", defaultValue = "false")
     private boolean ignoreLiterals;
 
     /**
@@ -89,7 +85,7 @@
      *
      * @since 2.5
      */
-    @Parameter( property = "cpd.ignoreIdentifiers", defaultValue = "false" )
+    @Parameter(property = "cpd.ignoreIdentifiers", defaultValue = "false")
     private boolean ignoreIdentifiers;
 
     /**
@@ -97,7 +93,7 @@
      *
      * @since 3.11.0
      */
-    @Parameter( property = "cpd.ignoreAnnotations", defaultValue = "false" )
+    @Parameter(property = "cpd.ignoreAnnotations", defaultValue = "false")
     private boolean ignoreAnnotations;
 
     /**
@@ -110,154 +106,123 @@
     /**
      * {@inheritDoc}
      */
-    public String getName( Locale locale )
-    {
-        return getBundle( locale ).getString( "report.cpd.name" );
+    public String getName(Locale locale) {
+        return getBundle(locale).getString("report.cpd.name");
     }
 
     /**
      * {@inheritDoc}
      */
-    public String getDescription( Locale locale )
-    {
-        return getBundle( locale ).getString( "report.cpd.description" );
+    public String getDescription(Locale locale) {
+        return getBundle(locale).getString("report.cpd.description");
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void executeReport( Locale locale )
-        throws MavenReportException
-    {
+    public void executeReport(Locale locale) throws MavenReportException {
         ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
-        try
-        {
-            Thread.currentThread().setContextClassLoader( this.getClass().getClassLoader() );
+        try {
+            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 
-            generateMavenSiteReport( locale );
-        }
-        finally
-        {
-            Thread.currentThread().setContextClassLoader( origLoader );
+            generateMavenSiteReport(locale);
+        } finally {
+            Thread.currentThread().setContextClassLoader(origLoader);
         }
     }
 
     @Override
-    public boolean canGenerateReport()
-    {
-        if ( skip )
-        {
-            getLog().info( "Skipping CPD execution" );
+    public boolean canGenerateReport() {
+        if (skip) {
+            getLog().info("Skipping CPD execution");
             return false;
         }
 
         boolean result = super.canGenerateReport();
-        if ( result )
-        {
-            try
-            {
+        if (result) {
+            try {
                 executeCpd();
-                if ( skipEmptyReport )
-                {
+                if (skipEmptyReport) {
                     result = cpdResult.hasDuplications();
-                    if ( !result )
-                    {
-                        getLog().debug( "Skipping report since skipEmptyReport is true and there are no CPD issues." );
+                    if (!result) {
+                        getLog().debug("Skipping report since skipEmptyReport is true and there are no CPD issues.");
                     }
                 }
-            }
-            catch ( MavenReportException e )
-            {
-                throw new RuntimeException( e );
+            } catch (MavenReportException e) {
+                throw new RuntimeException(e);
             }
         }
         return result;
     }
 
-    private void executeCpd()
-        throws MavenReportException
-    {
-        if ( cpdResult != null )
-        {
+    private void executeCpd() throws MavenReportException {
+        if (cpdResult != null) {
             // CPD has already been run
-            getLog().debug( "CPD has already been run - skipping redundant execution." );
+            getLog().debug("CPD has already been run - skipping redundant execution.");
             return;
         }
 
         Properties languageProperties = new Properties();
-        if ( ignoreLiterals )
-        {
-            languageProperties.setProperty( JavaTokenizer.IGNORE_LITERALS, "true" );
+        if (ignoreLiterals) {
+            languageProperties.setProperty(JavaTokenizer.IGNORE_LITERALS, "true");
         }
-        if ( ignoreIdentifiers )
-        {
-            languageProperties.setProperty( JavaTokenizer.IGNORE_IDENTIFIERS, "true" );
+        if (ignoreIdentifiers) {
+            languageProperties.setProperty(JavaTokenizer.IGNORE_IDENTIFIERS, "true");
         }
-        if ( ignoreAnnotations )
-        {
-            languageProperties.setProperty( JavaTokenizer.IGNORE_ANNOTATIONS, "true" );
+        if (ignoreAnnotations) {
+            languageProperties.setProperty(JavaTokenizer.IGNORE_ANNOTATIONS, "true");
         }
-        try
-        {
+        try {
             filesToProcess = getFilesToProcess();
 
             CpdRequest request = new CpdRequest();
-            request.setMinimumTokens( minimumTokens );
-            request.setLanguage( language );
-            request.setLanguageProperties( languageProperties );
-            request.setSourceEncoding( getInputEncoding() );
-            request.addFiles( filesToProcess.keySet() );
+            request.setMinimumTokens(minimumTokens);
+            request.setLanguage(language);
+            request.setLanguageProperties(languageProperties);
+            request.setSourceEncoding(getInputEncoding());
+            request.addFiles(filesToProcess.keySet());
 
-            request.setShowPmdLog( showPmdLog );
-            request.setLogLevel( determineCurrentRootLogLevel() );
+            request.setShowPmdLog(showPmdLog);
+            request.setLogLevel(determineCurrentRootLogLevel());
 
-            request.setExcludeFromFailureFile( excludeFromFailureFile );
-            request.setTargetDirectory( targetDirectory.getAbsolutePath() );
-            request.setOutputEncoding( getOutputEncoding() );
-            request.setFormat( format );
-            request.setIncludeXmlInSite( includeXmlInSite );
-            request.setReportOutputDirectory( getReportOutputDirectory().getAbsolutePath() );
+            request.setExcludeFromFailureFile(excludeFromFailureFile);
+            request.setTargetDirectory(targetDirectory.getAbsolutePath());
+            request.setOutputEncoding(getOutputEncoding());
+            request.setFormat(format);
+            request.setIncludeXmlInSite(includeXmlInSite);
+            request.setReportOutputDirectory(getReportOutputDirectory().getAbsolutePath());
 
             Toolchain tc = getToolchain();
-            if ( tc != null )
-            {
-                getLog().info( "Toolchain in maven-pmd-plugin: " + tc );
-                String javaExecutable = tc.findTool( "java" ); //NOI18N
-                request.setJavaExecutable( javaExecutable );
+            if (tc != null) {
+                getLog().info("Toolchain in maven-pmd-plugin: " + tc);
+                String javaExecutable = tc.findTool("java"); // NOI18N
+                request.setJavaExecutable(javaExecutable);
             }
 
-            getLog().info( "PMD version: " + AbstractPmdReport.getPmdVersion() );
-            cpdResult = CpdExecutor.execute( request );
-        }
-        catch ( UnsupportedEncodingException e )
-        {
-            throw new MavenReportException( "Encoding '" + getInputEncoding() + "' is not supported.", e );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+            getLog().info("PMD version: " + AbstractPmdReport.getPmdVersion());
+            cpdResult = CpdExecutor.execute(request);
+        } catch (UnsupportedEncodingException e) {
+            throw new MavenReportException("Encoding '" + getInputEncoding() + "' is not supported.", e);
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 
-    private void generateMavenSiteReport( Locale locale )
-    {
-        CpdReportGenerator gen = new CpdReportGenerator( getSink(), filesToProcess, getBundle( locale ),
-                isAggregator() );
-        gen.generate( cpdResult.getDuplications() );
+    private void generateMavenSiteReport(Locale locale) {
+        CpdReportGenerator gen = new CpdReportGenerator(getSink(), filesToProcess, getBundle(locale), isAggregator());
+        gen.generate(cpdResult.getDuplications());
     }
 
     /**
      * {@inheritDoc}
      */
-    public String getOutputName()
-    {
+    public String getOutputName() {
         return "cpd";
     }
 
-    private static ResourceBundle getBundle( Locale locale )
-    {
-        return ResourceBundle.getBundle( "cpd-report", locale, CpdReport.class.getClassLoader() );
+    private static ResourceBundle getBundle(Locale locale) {
+        return ResourceBundle.getBundle("cpd-report", locale, CpdReport.class.getClassLoader());
     }
 
     /**
@@ -268,8 +233,7 @@
      * @deprecated Use {@link CpdExecutor#createRenderer(String, String)} instead.
      */
     @Deprecated
-    public CPDRenderer createRenderer() throws MavenReportException
-    {
-        return CpdExecutor.createRenderer( format, getOutputEncoding() );
+    public CPDRenderer createRenderer() throws MavenReportException {
+        return CpdExecutor.createRenderer(format, getOutputEncoding());
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/CpdReportGenerator.java b/src/main/java/org/apache/maven/plugins/pmd/CpdReportGenerator.java
index 1823055..dd13594 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdReportGenerator.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReportGenerator.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.util.List;
@@ -36,8 +35,7 @@
  * @author mperham
  * @version $Id$
  */
-public class CpdReportGenerator
-{
+public class CpdReportGenerator {
     private Sink sink;
 
     private Map<File, PmdFileInfo> fileMap;
@@ -46,8 +44,7 @@
 
     private boolean aggregate;
 
-    public CpdReportGenerator( Sink sink, Map<File, PmdFileInfo> fileMap, ResourceBundle bundle, boolean aggregate )
-    {
+    public CpdReportGenerator(Sink sink, Map<File, PmdFileInfo> fileMap, ResourceBundle bundle, boolean aggregate) {
         this.sink = sink;
         this.fileMap = fileMap;
         this.bundle = bundle;
@@ -59,19 +56,17 @@
      *
      * @return a String that contains the title
      */
-    private String getTitle()
-    {
-        return bundle.getString( "report.cpd.title" );
+    private String getTitle() {
+        return bundle.getString("report.cpd.title");
     }
 
     /**
      * Method that generates the start of the CPD report.
      */
-    public void beginDocument()
-    {
+    public void beginDocument() {
         sink.head();
         sink.title();
-        sink.text( getTitle() );
+        sink.text(getTitle());
         sink.title_();
         sink.head_();
 
@@ -79,15 +74,15 @@
 
         sink.section1();
         sink.sectionTitle1();
-        sink.text( getTitle() );
+        sink.text(getTitle());
         sink.sectionTitle1_();
 
         sink.paragraph();
-        sink.text( bundle.getString( "report.cpd.cpdlink" ) + " " );
-        sink.link( "https://pmd.github.io/latest/pmd_userdocs_cpd.html" );
-        sink.text( "CPD" );
+        sink.text(bundle.getString("report.cpd.cpdlink") + " ");
+        sink.link("https://pmd.github.io/latest/pmd_userdocs_cpd.html");
+        sink.text("CPD");
         sink.link_();
-        sink.text( " " + AbstractPmdReport.getPmdVersion() + "." );
+        sink.text(" " + AbstractPmdReport.getPmdVersion() + ".");
         sink.paragraph_();
 
         sink.section1_();
@@ -96,7 +91,7 @@
 
         sink.section1();
         sink.sectionTitle1();
-        sink.text( bundle.getString( "report.cpd.dupes" ) );
+        sink.text(bundle.getString("report.cpd.dupes"));
         sink.sectionTitle1_();
 
         // TODO files summary
@@ -105,38 +100,35 @@
     /**
      * Method that generates a line of CPD report according to a TokenEntry.
      */
-    private void generateFileLine( CpdFile duplicationMark )
-    {
+    private void generateFileLine(CpdFile duplicationMark) {
         // Get information for report generation
         String filename = duplicationMark.getPath();
-        File file = new File( filename );
-        PmdFileInfo fileInfo = fileMap.get( file );
+        File file = new File(filename);
+        PmdFileInfo fileInfo = fileMap.get(file);
         File sourceDirectory = fileInfo.getSourceDirectory();
-        filename = StringUtils.substring( filename, sourceDirectory.getAbsolutePath().length() + 1 );
+        filename = StringUtils.substring(
+                filename, sourceDirectory.getAbsolutePath().length() + 1);
         String xrefLocation = fileInfo.getXrefLocation();
         MavenProject projectFile = fileInfo.getProject();
         int line = duplicationMark.getLine();
 
         sink.tableRow();
         sink.tableCell();
-        sink.text( filename );
+        sink.text(filename);
         sink.tableCell_();
-        if ( aggregate )
-        {
+        if (aggregate) {
             sink.tableCell();
-            sink.text( projectFile.getName() );
+            sink.text(projectFile.getName());
             sink.tableCell_();
         }
         sink.tableCell();
 
-        if ( xrefLocation != null )
-        {
-            sink.link( xrefLocation + "/" + filename.replaceAll( "\\.java$", ".html" ).replace( '\\', '/' ) + "#L"
-                + line );
+        if (xrefLocation != null) {
+            sink.link(xrefLocation + "/"
+                    + filename.replaceAll("\\.java$", ".html").replace('\\', '/') + "#L" + line);
         }
-        sink.text( String.valueOf( line ) );
-        if ( xrefLocation != null )
-        {
+        sink.text(String.valueOf(line));
+        if (xrefLocation != null) {
             sink.link_();
         }
 
@@ -149,58 +141,52 @@
      *
      * @param duplications the found duplications
      */
-    public void generate( List<Duplication> duplications )
-    {
+    public void generate(List<Duplication> duplications) {
         beginDocument();
 
-        if ( duplications.isEmpty() )
-        {
+        if (duplications.isEmpty()) {
             sink.paragraph();
-            sink.text( bundle.getString( "report.cpd.noProblems" ) );
+            sink.text(bundle.getString("report.cpd.noProblems"));
             sink.paragraph_();
         }
 
-        for ( Duplication duplication : duplications )
-        {
+        for (Duplication duplication : duplications) {
             String code = duplication.getCodefragment();
 
             sink.table();
-            sink.tableRows( null, false );
+            sink.tableRows(null, false);
             sink.tableRow();
             sink.tableHeaderCell();
-            sink.text( bundle.getString( "report.cpd.column.file" ) );
+            sink.text(bundle.getString("report.cpd.column.file"));
             sink.tableHeaderCell_();
-            if ( aggregate )
-            {
+            if (aggregate) {
                 sink.tableHeaderCell();
-                sink.text( bundle.getString( "report.cpd.column.project" ) );
+                sink.text(bundle.getString("report.cpd.column.project"));
                 sink.tableHeaderCell_();
             }
             sink.tableHeaderCell();
-            sink.text( bundle.getString( "report.cpd.column.line" ) );
+            sink.text(bundle.getString("report.cpd.column.line"));
             sink.tableHeaderCell_();
             sink.tableRow_();
 
             // Iterating on every token entry
-            for ( CpdFile mark : duplication.getFiles() )
-            {
-                generateFileLine( mark );
+            for (CpdFile mark : duplication.getFiles()) {
+                generateFileLine(mark);
             }
 
             // Source snippet
             sink.tableRow();
 
             int colspan = 2;
-            if ( aggregate )
-            {
+            if (aggregate) {
                 ++colspan;
             }
             // TODO Cleaner way to do this?
-            sink.rawText( "<td colspan='" + colspan + "'>" );
-            sink.verbatim( null );
-            sink.text( code );
+            sink.rawText("<td colspan='" + colspan + "'>");
+            sink.verbatim(null);
+            sink.text(code);
             sink.verbatim_();
-            sink.rawText( "</td>" );
+            sink.rawText("</td>");
             sink.tableRow_();
             sink.tableRows_();
             sink.table_();
diff --git a/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
index 3feab0d..7852f76 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,14 +26,14 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.pmd.model.CpdErrorDetail;
-import org.apache.maven.plugins.pmd.model.CpdFile;
-import org.apache.maven.plugins.pmd.model.Duplication;
-import org.apache.maven.plugins.pmd.model.io.xpp3.CpdXpp3Reader;
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.pmd.model.CpdErrorDetail;
+import org.apache.maven.plugins.pmd.model.CpdFile;
+import org.apache.maven.plugins.pmd.model.Duplication;
+import org.apache.maven.plugins.pmd.model.io.xpp3.CpdXpp3Reader;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
@@ -43,23 +42,20 @@
  * @version $Id$
  * @since 2.0
  */
-@Mojo( name = "cpd-check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true )
-@Execute( goal = "cpd" )
-public class CpdViolationCheckMojo
-    extends AbstractPmdViolationCheckMojo<Duplication>
-{
+@Mojo(name = "cpd-check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
+@Execute(goal = "cpd")
+public class CpdViolationCheckMojo extends AbstractPmdViolationCheckMojo<Duplication> {
     /**
      * Default constructor. Initializes with the correct {@link ExcludeDuplicationsFromFile}.
      */
-    public CpdViolationCheckMojo()
-    {
-        super( new ExcludeDuplicationsFromFile() );
+    public CpdViolationCheckMojo() {
+        super(new ExcludeDuplicationsFromFile());
     }
 
     /**
      * Skip the CPD violation checks. Most useful on the command line via "-Dcpd.skip=true".
      */
-    @Parameter( property = "cpd.skip", defaultValue = "false" )
+    @Parameter(property = "cpd.skip", defaultValue = "false")
     private boolean skip;
 
     /**
@@ -67,79 +63,69 @@
      *
      * @since 3.0
      */
-    @Parameter( property = "cpd.failOnViolation", defaultValue = "true", required = true )
+    @Parameter(property = "cpd.failOnViolation", defaultValue = "true", required = true)
     protected boolean failOnViolation;
 
     /**
      * {@inheritDoc}
      */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( skip )
-        {
-            getLog().info( "Skipping CPD execution" );
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (skip) {
+            getLog().info("Skipping CPD execution");
             return;
         }
 
-        executeCheck( "cpd.xml", "duplication", "CPD duplication", 10 );
+        executeCheck("cpd.xml", "duplication", "CPD duplication", 10);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void printError( Duplication item, String severity )
-    {
+    protected void printError(Duplication item, String severity) {
         int lines = item.getLines();
 
-        StringBuilder buff = new StringBuilder( 100 );
-        buff.append( "CPD " ).append( severity ).append( ": Found " );
-        buff.append( lines ).append( " lines of duplicated code at locations:" );
-        this.getLog().info( buff.toString() );
+        StringBuilder buff = new StringBuilder(100);
+        buff.append("CPD ").append(severity).append(": Found ");
+        buff.append(lines).append(" lines of duplicated code at locations:");
+        this.getLog().info(buff.toString());
 
-        for ( CpdFile file : item.getFiles() )
-        {
-            buff.setLength( 0 );
-            buff.append( "    " );
-            buff.append( file.getPath() );
-            buff.append( " line " ).append( file.getLine() );
-            this.getLog().info( buff.toString() );
+        for (CpdFile file : item.getFiles()) {
+            buff.setLength(0);
+            buff.append("    ");
+            buff.append(file.getPath());
+            buff.append(" line ").append(file.getLine());
+            this.getLog().info(buff.toString());
         }
 
-        this.getLog().debug( "CPD " + severity + ": Code Fragment " );
-        this.getLog().debug( item.getCodefragment() );
+        this.getLog().debug("CPD " + severity + ": Code Fragment ");
+        this.getLog().debug(item.getCodefragment());
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected List<Duplication> getErrorDetails( File cpdFile ) throws XmlPullParserException, IOException
-    {
-        try ( InputStream in = new FileInputStream( cpdFile ) )
-        {
+    protected List<Duplication> getErrorDetails(File cpdFile) throws XmlPullParserException, IOException {
+        try (InputStream in = new FileInputStream(cpdFile)) {
             CpdXpp3Reader reader = new CpdXpp3Reader();
-            CpdErrorDetail details = reader.read( in, false );
+            CpdErrorDetail details = reader.read(in, false);
             return details.getDuplications();
         }
     }
 
     @Override
-    protected int getPriority( Duplication errorDetail )
-    {
+    protected int getPriority(Duplication errorDetail) {
         return 0;
     }
 
     @Override
-    protected ViolationDetails<Duplication> newViolationDetailsInstance()
-    {
+    protected ViolationDetails<Duplication> newViolationDetailsInstance() {
         return new ViolationDetails<>();
     }
 
     @Override
-    public boolean isFailOnViolation()
-    {
+    public boolean isFailOnViolation() {
         return failOnViolation;
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java b/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java
index 0f7d4df..20bc52d 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.FileReader;
 import java.io.IOException;
@@ -27,14 +26,13 @@
 import java.util.List;
 import java.util.Set;
 
+import net.sourceforge.pmd.cpd.Mark;
+import net.sourceforge.pmd.cpd.Match;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.pmd.model.CpdFile;
 import org.apache.maven.plugins.pmd.model.Duplication;
 
-import net.sourceforge.pmd.cpd.Mark;
-import net.sourceforge.pmd.cpd.Match;
-
 /**
  * This class contains utility methods to load property files which define which files
  * should be excluded from the CPD duplication results.
@@ -42,71 +40,57 @@
  *
  * @author Andreas Dangel
  */
-public class ExcludeDuplicationsFromFile implements ExcludeFromFile<Duplication>
-{
+public class ExcludeDuplicationsFromFile implements ExcludeFromFile<Duplication> {
 
     private final List<Set<String>> exclusionList = new ArrayList<>();
 
     @Override
-    public boolean isExcludedFromFailure( final Duplication errorDetail )
-    {
+    public boolean isExcludedFromFailure(final Duplication errorDetail) {
         final Set<String> uniquePaths = new HashSet<>();
-        for ( final CpdFile cpdFile : errorDetail.getFiles() )
-        {
-            uniquePaths.add( cpdFile.getPath() );
+        for (final CpdFile cpdFile : errorDetail.getFiles()) {
+            uniquePaths.add(cpdFile.getPath());
         }
-        return isExcludedFromFailure( uniquePaths );
+        return isExcludedFromFailure(uniquePaths);
     }
 
     /**
      * Checks whether the given {@link Match} is excluded.
      * Note: The exclusion must have been loaded before via {@link #loadExcludeFromFailuresData(String)}.
-     * 
+     *
      * @param errorDetail the duplication to check
      * @return <code>true</code> if the given duplication should be excluded, <code>false</code> otherwise.
      */
-    public boolean isExcludedFromFailure( final Match errorDetail )
-    {
+    public boolean isExcludedFromFailure(final Match errorDetail) {
         final Set<String> uniquePaths = new HashSet<>();
-        for ( Mark mark : errorDetail.getMarkSet() )
-        {
-            uniquePaths.add( mark.getFilename() );
+        for (Mark mark : errorDetail.getMarkSet()) {
+            uniquePaths.add(mark.getFilename());
         }
-        return isExcludedFromFailure( uniquePaths );
+        return isExcludedFromFailure(uniquePaths);
     }
 
-    private boolean isExcludedFromFailure( Set<String> uniquePaths )
-    {
-        for ( final Set<String> singleExclusionGroup : exclusionList )
-        {
-            if ( uniquePaths.size() == singleExclusionGroup.size()
-                && duplicationExcludedByGroup( uniquePaths, singleExclusionGroup ) )
-            {
+    private boolean isExcludedFromFailure(Set<String> uniquePaths) {
+        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 ) )
-            {
+    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 ) )
-            {
+    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;
             }
         }
@@ -114,44 +98,33 @@
     }
 
     @Override
-    public void loadExcludeFromFailuresData( final String excludeFromFailureFile )
-            throws MojoExecutionException
-    {
-        if ( StringUtils.isEmpty( excludeFromFailureFile ) )
-        {
+    public void loadExcludeFromFailuresData(final String excludeFromFailureFile) throws MojoExecutionException {
+        if (StringUtils.isEmpty(excludeFromFailureFile)) {
             return;
         }
 
-        try ( LineNumberReader reader = new LineNumberReader( new FileReader( excludeFromFailureFile ) ) )
-        {
+        try (LineNumberReader reader = new LineNumberReader(new FileReader(excludeFromFailureFile))) {
             String line;
-            while ( ( line = reader.readLine() ) != null )
-            {
-                if ( !line.startsWith( "#" ) )
-                {
-                    exclusionList.add( createSetFromExclusionLine( 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 );
+        } catch (final IOException e) {
+            throw new MojoExecutionException("Cannot load file " + excludeFromFailureFile, e);
         }
     }
 
-    private Set<String> createSetFromExclusionLine( final String line )
-    {
+    private Set<String> createSetFromExclusionLine(final String line) {
         final Set<String> result = new HashSet<>();
-        for ( final String className : line.split( "," ) )
-        {
-            result.add( className.trim() );
+        for (final String className : line.split(",")) {
+            result.add(className.trim());
         }
         return result;
     }
 
     @Override
-    public int countExclusions()
-    {
+    public int countExclusions() {
         return exclusionList.size();
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/ExcludeFromFile.java b/src/main/java/org/apache/maven/plugins/pmd/ExcludeFromFile.java
index c9bd0b8..48d1039 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/ExcludeFromFile.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/ExcludeFromFile.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import org.apache.maven.plugin.MojoExecutionException;
 
@@ -26,15 +25,14 @@
  * or {@link org.apache.maven.plugins.pmd.model.Duplication}.
  * @author Andreas Dangel
  */
-public interface ExcludeFromFile<D>
-{
+public interface ExcludeFromFile<D> {
     /**
      * Loads the exclude definitions from the given file.
      *
      * @param excludeFromFailureFile the path to the properties file
      * @throws MojoExecutionException if the properties file couldn't be loaded
      */
-    void loadExcludeFromFailuresData( String excludeFromFailureFile ) throws MojoExecutionException;
+    void loadExcludeFromFailuresData(String excludeFromFailureFile) throws MojoExecutionException;
 
     /**
      * Determines how many exclusions are considered.
@@ -49,6 +47,5 @@
      * @param errorDetail the violation to check
      * @return <code>true</code> if the violation should be excluded, <code>false</code> otherwise.
      */
-    boolean isExcludedFromFailure( D errorDetail );
-
+    boolean isExcludedFromFailure(D errorDetail);
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/ExcludeViolationsFromFile.java b/src/main/java/org/apache/maven/plugins/pmd/ExcludeViolationsFromFile.java
index a0e9681..13981b3 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/ExcludeViolationsFromFile.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/ExcludeViolationsFromFile.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -29,12 +28,11 @@
 import java.util.Properties;
 import java.util.Set;
 
+import net.sourceforge.pmd.RuleViolation;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.pmd.model.Violation;
 
-import net.sourceforge.pmd.RuleViolation;
-
 /**
  * This class contains utility for loading property files, which define which PMD violations
  * from which classes should be ignored and not cause a failure.
@@ -42,52 +40,41 @@
  *
  * @author Andreas Dangel
  */
-public class ExcludeViolationsFromFile implements ExcludeFromFile<Violation>
-{
+public class ExcludeViolationsFromFile implements ExcludeFromFile<Violation> {
     private Map<String, Set<String>> excludeFromFailureClasses = new HashMap<>();
 
     @Override
-    public void loadExcludeFromFailuresData( final String excludeFromFailureFile )
-        throws MojoExecutionException
-    {
-        if ( StringUtils.isEmpty( excludeFromFailureFile ) )
-        {
+    public void loadExcludeFromFailuresData(final String excludeFromFailureFile) throws MojoExecutionException {
+        if (StringUtils.isEmpty(excludeFromFailureFile)) {
             return;
         }
 
-        File file = new File( excludeFromFailureFile );
-        if ( !file.exists() )
-        {
+        File file = new File(excludeFromFailureFile);
+        if (!file.exists()) {
             return;
         }
         final Properties props = new Properties();
-        try ( FileInputStream fileInputStream = new FileInputStream( new File( excludeFromFailureFile ) ) )
-        {
-            props.load( fileInputStream );
+        try (FileInputStream fileInputStream = new FileInputStream(new File(excludeFromFailureFile))) {
+            props.load(fileInputStream);
+        } catch (final IOException e) {
+            throw new MojoExecutionException("Cannot load properties file " + excludeFromFailureFile, e);
         }
-        catch ( final IOException e )
-        {
-            throw new MojoExecutionException( "Cannot load properties file " + excludeFromFailureFile, e );
-        }
-        for ( final Entry<Object, Object> propEntry : props.entrySet() )
-        {
+        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() );
+            final String[] excludedRules = propEntry.getValue().toString().split(",");
+            for (final String excludedRule : excludedRules) {
+                excludedRuleSet.add(excludedRule.trim());
             }
-            excludeFromFailureClasses.put( className, excludedRuleSet );
+            excludeFromFailureClasses.put(className, excludedRuleSet);
         }
     }
 
     @Override
-    public boolean isExcludedFromFailure( final Violation errorDetail )
-    {
-        final String className = extractClassName( errorDetail.getViolationPackage(), errorDetail.getViolationClass(),
-                errorDetail.getFileName() );
-        return isExcludedFromFailure( className, errorDetail.getRule() );
+    public boolean isExcludedFromFailure(final Violation errorDetail) {
+        final String className = extractClassName(
+                errorDetail.getViolationPackage(), errorDetail.getViolationClass(), errorDetail.getFileName());
+        return isExcludedFromFailure(className, errorDetail.getRule());
     }
 
     /**
@@ -97,51 +84,41 @@
      * @param errorDetail the violation to check
      * @return <code>true</code> if the violation should be excluded, <code>false</code> otherwise.
      */
-    public boolean isExcludedFromFailure( final RuleViolation errorDetail )
-    {
-        final String className = extractClassName( errorDetail.getPackageName(), errorDetail.getClassName(),
-                errorDetail.getFilename() );
-        return isExcludedFromFailure( className, errorDetail.getRule().getName() );
+    public boolean isExcludedFromFailure(final RuleViolation errorDetail) {
+        final String className =
+                extractClassName(errorDetail.getPackageName(), errorDetail.getClassName(), errorDetail.getFilename());
+        return isExcludedFromFailure(className, errorDetail.getRule().getName());
     }
 
     @Override
-    public int countExclusions()
-    {
+    public int countExclusions() {
         int result = 0;
-        for ( Set<String> rules : excludeFromFailureClasses.values() )
-        {
+        for (Set<String> rules : excludeFromFailureClasses.values()) {
             result += rules.size();
         }
         return result;
     }
 
-    private boolean isExcludedFromFailure( String className, String ruleName )
-    {
-        final Set<String> excludedRuleSet = excludeFromFailureClasses.get( className );
-        return excludedRuleSet != null && excludedRuleSet.contains( ruleName );
+    private boolean isExcludedFromFailure(String className, String ruleName) {
+        final Set<String> excludedRuleSet = excludeFromFailureClasses.get(className);
+        return excludedRuleSet != null && excludedRuleSet.contains(ruleName);
     }
 
-    private String extractClassName( String packageName, String className, String fullPath )
-    {
+    private String extractClassName(String packageName, String className, String fullPath) {
         // 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( packageName ) && StringUtils.isNotEmpty( className ) )
-        {
+        if (StringUtils.isNotEmpty(packageName) && StringUtils.isNotEmpty(className)) {
             return packageName + "." + className;
-        }
-        else if ( StringUtils.isNotEmpty( packageName ) )
-        {
+        } else if (StringUtils.isNotEmpty(packageName)) {
             String fileName = fullPath;
-            fileName = fileName.substring( fileName.lastIndexOf( File.separatorChar ) + 1 );
-            fileName = fileName.substring( 0, fileName.length() - 5 );
+            fileName = fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1);
+            fileName = fileName.substring(0, fileName.length() - 5);
             return packageName + "." + fileName;
-        }
-        else
-        {
+        } else {
             final String fileName = fullPath;
-            final int javaIdx = fileName.indexOf( File.separator + "java" + File.separator );
-            return fileName.substring( javaIdx >= 0 ? javaIdx + 6 : 0, fileName.length() - 5 ).replace(
-                File.separatorChar, '.' );
+            final int javaIdx = fileName.indexOf(File.separator + "java" + File.separator);
+            return fileName.substring(javaIdx >= 0 ? javaIdx + 6 : 0, fileName.length() - 5)
+                    .replace(File.separatorChar, '.');
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdCollectingRenderer.java b/src/main/java/org/apache/maven/plugins/pmd/PmdCollectingRenderer.java
index d95f54c..1fd8645 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdCollectingRenderer.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdCollectingRenderer.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -26,52 +25,46 @@
 import java.util.List;
 import java.util.Map;
 
-import org.codehaus.plexus.util.StringUtils;
-
 import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.Report.ProcessingError;
 import net.sourceforge.pmd.Report.SuppressedViolation;
 import net.sourceforge.pmd.RuleViolation;
 import net.sourceforge.pmd.renderers.AbstractRenderer;
 import net.sourceforge.pmd.util.datasource.DataSource;
-
+import org.codehaus.plexus.util.StringUtils;
 
 /**
  * A PMD renderer, that collects all violations and processing errors
  * from a pmd execution.
- * 
+ *
  * @author Andreas Dangel
  * @deprecated not used anymore
  */
 @Deprecated
-public class PmdCollectingRenderer extends AbstractRenderer
-{
-    private List<ProcessingError> errors = Collections.synchronizedList( new ArrayList<>() );
-    private List<RuleViolation> violations = Collections.synchronizedList( new ArrayList<>() );
-    private List<SuppressedViolation> suppressed = Collections.synchronizedList( new ArrayList<> () );
+public class PmdCollectingRenderer extends AbstractRenderer {
+    private List<ProcessingError> errors = Collections.synchronizedList(new ArrayList<>());
+    private List<RuleViolation> violations = Collections.synchronizedList(new ArrayList<>());
+    private List<SuppressedViolation> suppressed = Collections.synchronizedList(new ArrayList<>());
 
     /**
      * Collects all reports from all threads.
      */
-    public PmdCollectingRenderer()
-    {
-        super( PmdCollectingRenderer.class.getSimpleName(), "Collects all reports from all threads" );
+    public PmdCollectingRenderer() {
+        super(PmdCollectingRenderer.class.getSimpleName(), "Collects all reports from all threads");
     }
 
     @Override
-    public void renderFileReport( Report report ) throws IOException
-    {
-        violations.addAll( report.getViolations() );
-        errors.addAll( report.getProcessingErrors() );
-        suppressed.addAll( report.getSuppressedViolations() );
+    public void renderFileReport(Report report) throws IOException {
+        violations.addAll(report.getViolations());
+        errors.addAll(report.getProcessingErrors());
+        suppressed.addAll(report.getSuppressedViolations());
     }
 
     /**
      * Checks whether any violations have been found.
      * @return <code>true</code> if at least one violations has been found
      */
-    public boolean hasViolations()
-    {
+    public boolean hasViolations() {
         return !violations.isEmpty();
     }
 
@@ -79,8 +72,7 @@
      * Gets the list of all found violations.
      * @return the violations
      */
-    public List<RuleViolation> getViolations()
-    {
+    public List<RuleViolation> getViolations() {
         return violations;
     }
 
@@ -88,8 +80,7 @@
      * Checks whether any processing errors have been found.
      * @return <code>true</code> if any errors have been found
      */
-    public boolean hasErrors()
-    {
+    public boolean hasErrors() {
         return !errors.isEmpty();
     }
 
@@ -97,8 +88,7 @@
      * Gets all the processing errors.
      * @return the errors
      */
-    public List<ProcessingError> getErrors()
-    {
+    public List<ProcessingError> getErrors() {
         return errors;
     }
 
@@ -107,68 +97,54 @@
      * @param withDetails if <code>true</code> then add the error details additionally (contains e.g. the stacktrace)
      * @return the errors as string
      */
-    public String getErrorsAsString( boolean withDetails )
-    {
-        List<String> errorsAsString = new ArrayList<>( errors.size() );
-        for ( ProcessingError error : errors )
-        {
-            errorsAsString.add( error.getFile() + ": " + error.getMsg() );
-            if ( withDetails )
-            {
-                errorsAsString.add( error.getDetail() );
+    public String getErrorsAsString(boolean withDetails) {
+        List<String> errorsAsString = new ArrayList<>(errors.size());
+        for (ProcessingError error : errors) {
+            errorsAsString.add(error.getFile() + ": " + error.getMsg());
+            if (withDetails) {
+                errorsAsString.add(error.getDetail());
             }
         }
-        return StringUtils.join( errorsAsString.toArray(), System.getProperty( "line.separator" ) );
+        return StringUtils.join(errorsAsString.toArray(), System.getProperty("line.separator"));
     }
 
     /**
      * Create a new single report with all violations for further rendering into other formats than HTML.
      * @return the report
      */
-    public Report asReport()
-    {
+    public Report asReport() {
         Report report = new Report();
-        for ( RuleViolation v : violations )
-        {
-            report.addRuleViolation( v );
+        for (RuleViolation v : violations) {
+            report.addRuleViolation(v);
         }
-        for ( ProcessingError e : errors )
-        {
-            report.addError( e );
+        for (ProcessingError e : errors) {
+            report.addError(e);
         }
         Map<Integer, String> suppressedLines = new HashMap<Integer, String>();
-        for ( SuppressedViolation s : suppressed )
-        {
-            if ( s.suppressedByNOPMD() )
-            {
-                suppressedLines.put( s.getRuleViolation().getBeginLine(), s.getUserMessage() );
+        for (SuppressedViolation s : suppressed) {
+            if (s.suppressedByNOPMD()) {
+                suppressedLines.put(s.getRuleViolation().getBeginLine(), s.getUserMessage());
             }
         }
-        report.suppress( suppressedLines );
-        for ( SuppressedViolation s : suppressed )
-        {
-            report.addRuleViolation( s.getRuleViolation() );
+        report.suppress(suppressedLines);
+        for (SuppressedViolation s : suppressed) {
+            report.addRuleViolation(s.getRuleViolation());
         }
         return report;
     }
 
-
     // stubs need to fulfill the Renderer interface
     @Override
-    public String defaultFileExtension()
-    {
+    public String defaultFileExtension() {
         return null;
     }
+
     @Override
-    public void start() throws IOException
-    {
-    }
+    public void start() throws IOException {}
+
     @Override
-    public void startFileAnalysis( DataSource dataSource )
-    {
-    }
+    public void startFileAnalysis(DataSource dataSource) {}
+
     @Override
-    public void end() throws IOException
-    {
-    }
+    public void end() throws IOException {}
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdFileInfo.java b/src/main/java/org/apache/maven/plugins/pmd/PmdFileInfo.java
index 5c9291a..f690d83 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdFileInfo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdFileInfo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -27,8 +26,7 @@
 /**
  * @version $Id$
  */
-public class PmdFileInfo
-{
+public class PmdFileInfo {
 
     private MavenProject project;
 
@@ -36,34 +34,25 @@
 
     private String xref;
 
-    public PmdFileInfo( MavenProject project, File dir, String x )
-        throws IOException
-    {
+    public PmdFileInfo(MavenProject project, File dir, String x) throws IOException {
         this.project = project;
-        if ( dir.isAbsolute() )
-        {
+        if (dir.isAbsolute()) {
             this.sourceDir = dir.getCanonicalFile();
-        }
-        else
-        {
-            this.sourceDir = new File( project.getBasedir(), dir.getPath() ).getCanonicalFile();
+        } else {
+            this.sourceDir = new File(project.getBasedir(), dir.getPath()).getCanonicalFile();
         }
         this.xref = x;
     }
 
-    public String getXrefLocation()
-    {
+    public String getXrefLocation() {
         return xref;
     }
 
-    public File getSourceDirectory()
-    {
+    public File getSourceDirectory() {
         return sourceDir;
     }
 
-    public MavenProject getProject()
-    {
+    public MavenProject getProject() {
         return project;
     }
-
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
index c8e5f58..c3f1065 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -27,6 +26,7 @@
 import java.util.Locale;
 import java.util.ResourceBundle;
 
+import net.sourceforge.pmd.renderers.Renderer;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -52,8 +52,6 @@
 import org.codehaus.plexus.resource.loader.ResourceNotFoundException;
 import org.codehaus.plexus.util.StringUtils;
 
-import net.sourceforge.pmd.renderers.Renderer;
-
 /**
  * Creates a PMD site report based on the rulesets and configuration set in the plugin.
  * It can also generate a pmd output file aside from the site report in any of the following formats: xml, csv or txt.
@@ -62,10 +60,8 @@
  * @version $Id$
  * @since 2.0
  */
-@Mojo( name = "pmd", threadSafe = true, requiresDependencyResolution = ResolutionScope.TEST )
-public class PmdReport
-    extends AbstractPmdReport
-{
+@Mojo(name = "pmd", threadSafe = true, requiresDependencyResolution = ResolutionScope.TEST)
+public class PmdReport extends AbstractPmdReport {
     /**
      * The target JDK to analyze based on. Should match the source used in the compiler plugin. Valid values
      * with the default PMD version are
@@ -81,7 +77,7 @@
      *   <b>Note:</b> this parameter is only used if the language parameter is set to <code>java</code>.
      * </p>
      */
-    @Parameter( property = "targetJdk", defaultValue = "${maven.compiler.source}" )
+    @Parameter(property = "targetJdk", defaultValue = "${maven.compiler.source}")
     private String targetJdk;
 
     /**
@@ -90,7 +86,7 @@
      *
      * @since 3.0
      */
-    @Parameter( defaultValue = "java" )
+    @Parameter(defaultValue = "java")
     private String language;
 
     /**
@@ -98,7 +94,7 @@
      *
      * @since 2.1
      */
-    @Parameter( property = "minimumPriority", defaultValue = "5" )
+    @Parameter(property = "minimumPriority", defaultValue = "5")
     private int minimumPriority = 5;
 
     /**
@@ -106,7 +102,7 @@
      *
      * @since 2.1
      */
-    @Parameter( property = "pmd.skip", defaultValue = "false" )
+    @Parameter(property = "pmd.skip", defaultValue = "false")
     private boolean skip;
 
     /**
@@ -117,7 +113,7 @@
      * (<code>/rulesets/java/maven-pmd-plugin-default.xml</code>).
      */
     @Parameter
-    String[] rulesets = new String[] { "/rulesets/java/maven-pmd-plugin-default.xml" };
+    String[] rulesets = new String[] {"/rulesets/java/maven-pmd-plugin-default.xml"};
 
     /**
      * Controls whether the project's compile/test classpath should be passed to PMD to enable its type resolution
@@ -125,7 +121,7 @@
      *
      * @since 3.0
      */
-    @Parameter( property = "pmd.typeResolution", defaultValue = "true" )
+    @Parameter(property = "pmd.typeResolution", defaultValue = "true")
     private boolean typeResolution;
 
     /**
@@ -133,7 +129,7 @@
      *
      * @since 3.1
      */
-    @Parameter( property = "pmd.benchmark", defaultValue = "false" )
+    @Parameter(property = "pmd.benchmark", defaultValue = "false")
     private boolean benchmark;
 
     /**
@@ -141,8 +137,7 @@
      *
      * @since 3.1
      */
-    @Parameter( property = "pmd.benchmarkOutputFilename",
-                    defaultValue = "${project.build.directory}/pmd-benchmark.txt" )
+    @Parameter(property = "pmd.benchmarkOutputFilename", defaultValue = "${project.build.directory}/pmd-benchmark.txt")
     private String benchmarkOutputFilename;
 
     /**
@@ -152,7 +147,7 @@
      *
      * @since 3.4
      */
-    @Parameter( property = "pmd.suppressMarker" )
+    @Parameter(property = "pmd.suppressMarker")
     private String suppressMarker;
 
     /**
@@ -160,7 +155,7 @@
      *
      * @since 3.1
      */
-    @Parameter( property = "pmd.skipPmdError", defaultValue = "true" )
+    @Parameter(property = "pmd.skipPmdError", defaultValue = "true")
     private boolean skipPmdError;
 
     /**
@@ -171,7 +166,7 @@
      *
      * @since 3.8
      */
-    @Parameter( property = "pmd.analysisCache", defaultValue = "false" )
+    @Parameter(property = "pmd.analysisCache", defaultValue = "false")
     private boolean analysisCache;
 
     /**
@@ -183,7 +178,7 @@
      *
      * @since 3.8
      */
-    @Parameter( property = "pmd.analysisCacheLocation", defaultValue = "${project.build.directory}/pmd/pmd.cache" )
+    @Parameter(property = "pmd.analysisCacheLocation", defaultValue = "${project.build.directory}/pmd/pmd.cache")
     private String analysisCacheLocation;
 
     /**
@@ -195,7 +190,7 @@
      *
      * @since 3.9.0
      */
-    @Parameter( property = "pmd.renderProcessingErrors", defaultValue = "true" )
+    @Parameter(property = "pmd.renderProcessingErrors", defaultValue = "true")
     private boolean renderProcessingErrors = true;
 
     /**
@@ -203,7 +198,7 @@
      *
      * @since 3.10.0
      */
-    @Parameter( property = "pmd.renderRuleViolationPriority", defaultValue = "true" )
+    @Parameter(property = "pmd.renderRuleViolationPriority", defaultValue = "true")
     private boolean renderRuleViolationPriority = true;
 
     /**
@@ -212,7 +207,7 @@
      *
      * @since 3.12.0
      */
-    @Parameter( property = "pmd.renderViolationsByPriority", defaultValue = "true" )
+    @Parameter(property = "pmd.renderViolationsByPriority", defaultValue = "true")
     private boolean renderViolationsByPriority = true;
 
     /**
@@ -220,7 +215,7 @@
      *
      * @since 3.17.0
      */
-    @Parameter( property = "pmd.renderSuppressedViolations", defaultValue = "true" )
+    @Parameter(property = "pmd.renderSuppressedViolations", defaultValue = "true")
     private boolean renderSuppressedViolations = true;
 
     /**
@@ -229,7 +224,7 @@
      *
      * @since 3.13.0
      */
-    @Parameter( property = "pmd.rulesetsTargetDirectory", defaultValue = "${project.build.directory}/pmd/rulesets" )
+    @Parameter(property = "pmd.rulesetsTargetDirectory", defaultValue = "${project.build.directory}/pmd/rulesets")
     private File rulesetsTargetDirectory;
 
     /**
@@ -253,18 +248,16 @@
      * {@inheritDoc}
      */
     @Override
-    public String getName( Locale locale )
-    {
-        return getBundle( locale ).getString( "report.pmd.name" );
+    public String getName(Locale locale) {
+        return getBundle(locale).getString("report.pmd.name");
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public String getDescription( Locale locale )
-    {
-        return getBundle( locale ).getString( "report.pmd.description" );
+    public String getDescription(Locale locale) {
+        return getBundle(locale).getString("report.pmd.description");
     }
 
     /**
@@ -274,121 +267,98 @@
      * @param rulesets the PMD rulesets to be used.
      * @see #rulesets
      */
-    public void setRulesets( String[] rulesets )
-    {
-        this.rulesets = Arrays.copyOf( rulesets, rulesets.length );
+    public void setRulesets(String[] rulesets) {
+        this.rulesets = Arrays.copyOf(rulesets, rulesets.length);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void executeReport( Locale locale )
-        throws MavenReportException
-    {
+    public void executeReport(Locale locale) throws MavenReportException {
         ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
-        try
-        {
-            Thread.currentThread().setContextClassLoader( this.getClass().getClassLoader() );
+        try {
+            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 
-            generateMavenSiteReport( locale );
-        }
-        finally
-        {
-            Thread.currentThread().setContextClassLoader( origLoader );
+            generateMavenSiteReport(locale);
+        } finally {
+            Thread.currentThread().setContextClassLoader(origLoader);
         }
     }
 
     @Override
-    public boolean canGenerateReport()
-    {
-        if ( skip )
-        {
-            getLog().info( "Skipping PMD execution" );
+    public boolean canGenerateReport() {
+        if (skip) {
+            getLog().info("Skipping PMD execution");
             return false;
         }
 
         boolean result = super.canGenerateReport();
-        if ( result )
-        {
-            try
-            {
+        if (result) {
+            try {
                 executePmd();
-                if ( skipEmptyReport )
-                {
+                if (skipEmptyReport) {
                     result = pmdResult.hasViolations();
-                    if ( !result )
-                    {
-                        getLog().debug( "Skipping report since skipEmptyReport is true and "
-                                            + "there are no PMD violations." );
+                    if (!result) {
+                        getLog().debug("Skipping report since skipEmptyReport is true and "
+                                + "there are no PMD violations.");
                     }
                 }
-            }
-            catch ( MavenReportException e )
-            {
-                throw new RuntimeException( e );
+            } catch (MavenReportException e) {
+                throw new RuntimeException(e);
             }
         }
         return result;
     }
 
-    private void executePmd()
-        throws MavenReportException
-    {
-        if ( pmdResult != null )
-        {
+    private void executePmd() throws MavenReportException {
+        if (pmdResult != null) {
             // PMD has already been run
-            getLog().debug( "PMD has already been run - skipping redundant execution." );
+            getLog().debug("PMD has already been run - skipping redundant execution.");
             return;
         }
 
-        try
-        {
+        try {
             filesToProcess = getFilesToProcess();
 
-            if ( filesToProcess.isEmpty() && !"java".equals( language ) )
-            {
-                getLog().warn( "No files found to process. Did you add your additional source folders like javascript?"
-                                   + " (see also build-helper-maven-plugin)" );
+            if (filesToProcess.isEmpty() && !"java".equals(language)) {
+                getLog().warn("No files found to process. Did you add your additional source folders like javascript?"
+                        + " (see also build-helper-maven-plugin)");
             }
+        } catch (IOException e) {
+            throw new MavenReportException("Can't get file list", e);
         }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( "Can't get file list", e );
-        }
-
 
         PmdRequest request = new PmdRequest();
-        request.setLanguageAndVersion( language, targetJdk );
-        request.setRulesets( resolveRulesets() );
-        request.setAuxClasspath( typeResolution ? determineAuxClasspath() : null );
-        request.setSourceEncoding( getInputEncoding() );
-        request.addFiles( filesToProcess.keySet() );
-        request.setMinimumPriority( minimumPriority );
-        request.setSuppressMarker( suppressMarker );
-        request.setBenchmarkOutputLocation( benchmark ? benchmarkOutputFilename : null );
-        request.setAnalysisCacheLocation( analysisCache ? analysisCacheLocation : null );
-        request.setExcludeFromFailureFile( excludeFromFailureFile );
+        request.setLanguageAndVersion(language, targetJdk);
+        request.setRulesets(resolveRulesets());
+        request.setAuxClasspath(typeResolution ? determineAuxClasspath() : null);
+        request.setSourceEncoding(getInputEncoding());
+        request.addFiles(filesToProcess.keySet());
+        request.setMinimumPriority(minimumPriority);
+        request.setSuppressMarker(suppressMarker);
+        request.setBenchmarkOutputLocation(benchmark ? benchmarkOutputFilename : null);
+        request.setAnalysisCacheLocation(analysisCache ? analysisCacheLocation : null);
+        request.setExcludeFromFailureFile(excludeFromFailureFile);
 
-        request.setTargetDirectory( targetDirectory.getAbsolutePath() );
-        request.setOutputEncoding( getOutputEncoding() );
-        request.setFormat( format );
-        request.setShowPmdLog( showPmdLog );
-        request.setSkipPmdError( skipPmdError );
-        request.setIncludeXmlInSite( includeXmlInSite );
-        request.setReportOutputDirectory( getReportOutputDirectory().getAbsolutePath() );
-        request.setLogLevel( determineCurrentRootLogLevel() );
+        request.setTargetDirectory(targetDirectory.getAbsolutePath());
+        request.setOutputEncoding(getOutputEncoding());
+        request.setFormat(format);
+        request.setShowPmdLog(showPmdLog);
+        request.setSkipPmdError(skipPmdError);
+        request.setIncludeXmlInSite(includeXmlInSite);
+        request.setReportOutputDirectory(getReportOutputDirectory().getAbsolutePath());
+        request.setLogLevel(determineCurrentRootLogLevel());
 
         Toolchain tc = getToolchain();
-        if ( tc != null )
-        {
-            getLog().info( "Toolchain in maven-pmd-plugin: " + tc );
-            String javaExecutable = tc.findTool( "java" ); //NOI18N
-            request.setJavaExecutable( javaExecutable );
+        if (tc != null) {
+            getLog().info("Toolchain in maven-pmd-plugin: " + tc);
+            String javaExecutable = tc.findTool("java"); // NOI18N
+            request.setJavaExecutable(javaExecutable);
         }
 
-        getLog().info( "PMD version: " + AbstractPmdReport.getPmdVersion() );
-        pmdResult = PmdExecutor.execute( request );
+        getLog().info("PMD version: " + AbstractPmdReport.getPmdVersion());
+        pmdResult = PmdExecutor.execute(request);
     }
 
     /**
@@ -397,99 +367,81 @@
      * @return comma separated list of absolute file paths of ruleset files
      * @throws MavenReportException if a ruleset could not be found
      */
-    private List<String> resolveRulesets() throws MavenReportException
-    {
+    private List<String> resolveRulesets() throws MavenReportException {
         // configure ResourceManager - will search for urls (URLResourceLoader) and files in various directories:
         // in the directory of the current project's pom file - note: extensions might replace the pom file on the fly
-        locator.addSearchPath( FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath() );
+        locator.addSearchPath(
+                FileResourceLoader.ID, project.getFile().getParentFile().getAbsolutePath());
         // in the current project's directory
-        locator.addSearchPath( FileResourceLoader.ID, project.getBasedir().getAbsolutePath() );
+        locator.addSearchPath(FileResourceLoader.ID, project.getBasedir().getAbsolutePath());
         // in the base directory - that's the directory of the initial pom requested to build,
         // e.g. the root of a multi module build
-        locator.addSearchPath( FileResourceLoader.ID, session.getRequest().getBaseDirectory() );
-        locator.setOutputDirectory( rulesetsTargetDirectory );
+        locator.addSearchPath(FileResourceLoader.ID, session.getRequest().getBaseDirectory());
+        locator.setOutputDirectory(rulesetsTargetDirectory);
 
         String[] sets = new String[rulesets.length];
-        try
-        {
-            for ( int idx = 0; idx < rulesets.length; idx++ )
-            {
+        try {
+            for (int idx = 0; idx < rulesets.length; idx++) {
                 String set = rulesets[idx];
-                getLog().debug( "Preparing ruleset: " + set );
-                String rulesetFilename = determineRulesetFilename( set );
-                File ruleset = locator.getResourceAsFile( rulesetFilename, getLocationTemp( set ) );
-                if ( null == ruleset )
-                {
-                    throw new MavenReportException( "Could not resolve " + set );
+                getLog().debug("Preparing ruleset: " + set);
+                String rulesetFilename = determineRulesetFilename(set);
+                File ruleset = locator.getResourceAsFile(rulesetFilename, getLocationTemp(set));
+                if (null == ruleset) {
+                    throw new MavenReportException("Could not resolve " + set);
                 }
                 sets[idx] = ruleset.getAbsolutePath();
             }
+        } catch (ResourceNotFoundException | FileResourceCreationException e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
-        catch ( ResourceNotFoundException | FileResourceCreationException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
-        }
-        return Arrays.asList( sets );
+        return Arrays.asList(sets);
     }
 
-    private String determineRulesetFilename( String ruleset )
-    {
+    private String determineRulesetFilename(String ruleset) {
         String result = ruleset.trim();
-        String lowercase = result.toLowerCase( Locale.ROOT );
-        if ( lowercase.startsWith( "http://" ) || lowercase.startsWith( "https://" ) || lowercase.endsWith( ".xml" ) )
-        {
+        String lowercase = result.toLowerCase(Locale.ROOT);
+        if (lowercase.startsWith("http://") || lowercase.startsWith("https://") || lowercase.endsWith(".xml")) {
             return result;
         }
 
         // assume last part is a single rule, e.g. myruleset.xml/SingleRule
-        if ( result.indexOf( '/' ) > -1 )
-        {
-            String rulesetFilename = result.substring( 0, result.lastIndexOf( '/' ) );
-            if ( rulesetFilename.toLowerCase( Locale.ROOT ).endsWith( ".xml" ) )
-            {
+        if (result.indexOf('/') > -1) {
+            String rulesetFilename = result.substring(0, result.lastIndexOf('/'));
+            if (rulesetFilename.toLowerCase(Locale.ROOT).endsWith(".xml")) {
                 return rulesetFilename;
             }
         }
         // maybe a built-in ruleset name, e.g. java-design -> rulesets/java/design.xml
-        int dashIndex = lowercase.indexOf( '-' );
-        if ( dashIndex > -1 && lowercase.indexOf( '-', dashIndex + 1 ) == -1 )
-        {
-            String language = result.substring( 0, dashIndex );
-            String rulesetName = result.substring( dashIndex + 1 );
+        int dashIndex = lowercase.indexOf('-');
+        if (dashIndex > -1 && lowercase.indexOf('-', dashIndex + 1) == -1) {
+            String language = result.substring(0, dashIndex);
+            String rulesetName = result.substring(dashIndex + 1);
             return "rulesets/" + language + "/" + rulesetName + ".xml";
         }
         // fallback - no change of the given ruleset specifier
         return result;
     }
 
-    private void generateMavenSiteReport( Locale locale )
-        throws MavenReportException
-    {
+    private void generateMavenSiteReport(Locale locale) throws MavenReportException {
         Sink sink = getSink();
-        PmdReportGenerator doxiaRenderer = new PmdReportGenerator( getLog(), sink, getBundle( locale ),
-                isAggregator() );
-        doxiaRenderer.setRenderRuleViolationPriority( renderRuleViolationPriority );
-        doxiaRenderer.setRenderViolationsByPriority( renderViolationsByPriority );
-        doxiaRenderer.setFiles( filesToProcess );
-        doxiaRenderer.setViolations( pmdResult.getViolations() );
-        if ( renderSuppressedViolations )
-        {
-            doxiaRenderer.setSuppressedViolations( pmdResult.getSuppressedViolations() );
+        PmdReportGenerator doxiaRenderer = new PmdReportGenerator(getLog(), sink, getBundle(locale), isAggregator());
+        doxiaRenderer.setRenderRuleViolationPriority(renderRuleViolationPriority);
+        doxiaRenderer.setRenderViolationsByPriority(renderViolationsByPriority);
+        doxiaRenderer.setFiles(filesToProcess);
+        doxiaRenderer.setViolations(pmdResult.getViolations());
+        if (renderSuppressedViolations) {
+            doxiaRenderer.setSuppressedViolations(pmdResult.getSuppressedViolations());
         }
-        if ( renderProcessingErrors )
-        {
-            doxiaRenderer.setProcessingErrors( pmdResult.getErrors() );
+        if (renderProcessingErrors) {
+            doxiaRenderer.setProcessingErrors(pmdResult.getErrors());
         }
 
-        try
-        {
+        try {
             doxiaRenderer.beginDocument();
             doxiaRenderer.render();
             doxiaRenderer.endDocument();
-        }
-        catch ( IOException e )
-        {
-            getLog().warn( "Failure creating the report: " + e.getLocalizedMessage(), e );
+        } catch (IOException e) {
+            getLog().warn("Failure creating the report: " + e.getLocalizedMessage(), e);
         }
     }
 
@@ -499,111 +451,95 @@
      * @param name the name of the file whose location is to be resolved
      * @return a String that contains the absolute file name of the file
      */
-    protected String getLocationTemp( String name )
-    {
+    protected String getLocationTemp(String name) {
         String loc = name;
-        if ( loc.indexOf( '/' ) != -1 )
-        {
-            loc = loc.substring( loc.lastIndexOf( '/' ) + 1 );
+        if (loc.indexOf('/') != -1) {
+            loc = loc.substring(loc.lastIndexOf('/') + 1);
         }
-        if ( loc.indexOf( '\\' ) != -1 )
-        {
-            loc = loc.substring( loc.lastIndexOf( '\\' ) + 1 );
+        if (loc.indexOf('\\') != -1) {
+            loc = loc.substring(loc.lastIndexOf('\\') + 1);
         }
 
         // MPMD-127 in the case that the rules are defined externally on a url
         // we need to replace some special url characters that cannot be
         // used in filenames on disk or produce ackward filenames.
         // replace all occurrences of the following characters: ? : & = %
-        loc = loc.replaceAll( "[\\?\\:\\&\\=\\%]", "_" );
+        loc = loc.replaceAll("[\\?\\:\\&\\=\\%]", "_");
 
-        if ( !loc.endsWith( ".xml" ) )
-        {
+        if (!loc.endsWith(".xml")) {
             loc = loc + ".xml";
         }
 
-        getLog().debug( "Before: " + name + " After: " + loc );
+        getLog().debug("Before: " + name + " After: " + loc);
         return loc;
     }
 
-    private String determineAuxClasspath() throws MavenReportException
-    {
-        try
-        {
+    private String determineAuxClasspath() throws MavenReportException {
+        try {
             List<String> classpath = new ArrayList<>();
-            if ( isAggregator() )
-            {
+            if (isAggregator()) {
                 List<String> dependencies = new ArrayList<>();
 
                 // collect exclusions for projects within the reactor
                 // if module a depends on module b and both are in the reactor
                 // then we don't want to resolve the dependency as an artifact.
                 List<String> exclusionPatterns = new ArrayList<>();
-                for ( MavenProject localProject : getAggregatedProjects() )
-                {
-                    exclusionPatterns.add( localProject.getGroupId() + ":" + localProject.getArtifactId() );
+                for (MavenProject localProject : getAggregatedProjects()) {
+                    exclusionPatterns.add(localProject.getGroupId() + ":" + localProject.getArtifactId());
                 }
-                TransformableFilter filter = new AndFilter( Arrays.asList(
-                        new ExclusionsFilter( exclusionPatterns ),
-                        includeTests ? ScopeFilter.including( "compile", "provided", "test" )
-                                     : ScopeFilter.including( "compile", "provided" )
-                ) );
+                TransformableFilter filter = new AndFilter(Arrays.asList(
+                        new ExclusionsFilter(exclusionPatterns),
+                        includeTests
+                                ? ScopeFilter.including("compile", "provided", "test")
+                                : ScopeFilter.including("compile", "provided")));
 
-                for ( MavenProject localProject : getAggregatedProjects() )
-                {
-                    ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(
-                            session.getProjectBuildingRequest() );
+                for (MavenProject localProject : getAggregatedProjects()) {
+                    ProjectBuildingRequest buildingRequest =
+                            new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
                     // use any additional configured repo as well
-                    buildingRequest.getRemoteRepositories().addAll( localProject.getRemoteArtifactRepositories() );
+                    buildingRequest.getRemoteRepositories().addAll(localProject.getRemoteArtifactRepositories());
 
                     Iterable<ArtifactResult> resolvedDependencies = dependencyResolver.resolveDependencies(
-                            buildingRequest, localProject.getDependencies(), null, filter );
+                            buildingRequest, localProject.getDependencies(), null, filter);
 
-                    for ( ArtifactResult resolvedArtifact : resolvedDependencies )
-                    {
-                        dependencies.add( resolvedArtifact.getArtifact().getFile().toString() );
+                    for (ArtifactResult resolvedArtifact : resolvedDependencies) {
+                        dependencies.add(
+                                resolvedArtifact.getArtifact().getFile().toString());
                     }
 
-                    List<String> projectClasspath = includeTests ? localProject.getTestClasspathElements()
+                    List<String> projectClasspath = includeTests
+                            ? localProject.getTestClasspathElements()
                             : localProject.getCompileClasspathElements();
 
                     // Add the project's target folder first
-                    classpath.addAll( projectClasspath );
-                    if ( !localProject.isExecutionRoot() )
-                    {
-                        for ( String path : projectClasspath )
-                        {
-                            File pathFile = new File( path );
+                    classpath.addAll(projectClasspath);
+                    if (!localProject.isExecutionRoot()) {
+                        for (String path : projectClasspath) {
+                            File pathFile = new File(path);
                             String[] children = pathFile.list();
 
-                            if ( !pathFile.exists() || ( children != null && children.length == 0 ) )
-                            {
-                                getLog().warn( "The project " + localProject.getArtifactId()
-                                    + " does not seem to be compiled. PMD results might be inaccurate." );
+                            if (!pathFile.exists() || (children != null && children.length == 0)) {
+                                getLog().warn("The project " + localProject.getArtifactId()
+                                        + " does not seem to be compiled. PMD results might be inaccurate.");
                             }
                         }
                     }
-
                 }
 
                 // Add the dependencies as last entries
-                classpath.addAll( dependencies );
+                classpath.addAll(dependencies);
 
-                getLog().debug( "Using aggregated aux classpath: " + classpath );
-            }
-            else
-            {
-                classpath.addAll( includeTests ? project.getTestClasspathElements()
-                                               : project.getCompileClasspathElements() );
+                getLog().debug("Using aggregated aux classpath: " + classpath);
+            } else {
+                classpath.addAll(
+                        includeTests ? project.getTestClasspathElements() : project.getCompileClasspathElements());
 
-                getLog().debug( "Using aux classpath: " + classpath );
+                getLog().debug("Using aux classpath: " + classpath);
             }
-            String path = StringUtils.join( classpath.iterator(), File.pathSeparator );
+            String path = StringUtils.join(classpath.iterator(), File.pathSeparator);
             return path;
-        }
-        catch ( Exception e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+        } catch (Exception e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 
@@ -611,14 +547,12 @@
      * {@inheritDoc}
      */
     @Override
-    public String getOutputName()
-    {
+    public String getOutputName() {
         return "pmd";
     }
 
-    private static ResourceBundle getBundle( Locale locale )
-    {
-        return ResourceBundle.getBundle( "pmd-report", locale, PmdReport.class.getClassLoader() );
+    private static ResourceBundle getBundle(Locale locale) {
+        return ResourceBundle.getBundle("pmd-report", locale, PmdReport.class.getClassLoader());
     }
 
     /**
@@ -629,8 +563,7 @@
      * @deprecated Use {@link PmdExecutor#createRenderer(String, String)} instead.
      */
     @Deprecated
-    public final Renderer createRenderer() throws MavenReportException
-    {
-        return PmdExecutor.createRenderer( format, getOutputEncoding() );
+    public final Renderer createRenderer() throws MavenReportException {
+        return PmdExecutor.createRenderer(format, getOutputEncoding());
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java b/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
index 623b7c9..bb836c9 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReportGenerator.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -32,6 +31,7 @@
 import java.util.ResourceBundle;
 import java.util.Set;
 
+import net.sourceforge.pmd.RulePriority;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugins.pmd.model.ProcessingError;
@@ -39,16 +39,13 @@
 import org.apache.maven.plugins.pmd.model.Violation;
 import org.codehaus.plexus.util.StringUtils;
 
-import net.sourceforge.pmd.RulePriority;
-
 /**
  * Render the PMD violations into Doxia events.
  *
  * @author Brett Porter
  * @version $Id$
  */
-public class PmdReportGenerator
-{
+public class PmdReportGenerator {
     private Log log;
 
     private Sink sink;
@@ -73,41 +70,34 @@
 
     // private List<Metric> metrics = new ArrayList<Metric>();
 
-    public PmdReportGenerator( Log log, Sink sink, ResourceBundle bundle, boolean aggregate )
-    {
+    public PmdReportGenerator(Log log, Sink sink, ResourceBundle bundle, boolean aggregate) {
         this.log = log;
         this.sink = sink;
         this.bundle = bundle;
         this.aggregate = aggregate;
     }
 
-    private String getTitle()
-    {
-        return bundle.getString( "report.pmd.title" );
+    private String getTitle() {
+        return bundle.getString("report.pmd.title");
     }
 
-    public void setViolations( Collection<Violation> violations )
-    {
-        this.violations = new HashSet<>( violations );
+    public void setViolations(Collection<Violation> violations) {
+        this.violations = new HashSet<>(violations);
     }
 
-    public List<Violation> getViolations()
-    {
-        return new ArrayList<>( violations );
+    public List<Violation> getViolations() {
+        return new ArrayList<>(violations);
     }
 
-    public void setSuppressedViolations( Collection<SuppressedViolation> suppressedViolations )
-    {
-        this.suppressedViolations = new ArrayList<>( suppressedViolations );
+    public void setSuppressedViolations(Collection<SuppressedViolation> suppressedViolations) {
+        this.suppressedViolations = new ArrayList<>(suppressedViolations);
     }
 
-    public void setProcessingErrors( Collection<ProcessingError> errors )
-    {
-        this.processingErrors = new ArrayList<>( errors );
+    public void setProcessingErrors(Collection<ProcessingError> errors) {
+        this.processingErrors = new ArrayList<>(errors);
     }
 
-    public List<ProcessingError> getProcessingErrors()
-    {
+    public List<ProcessingError> getProcessingErrors() {
         return processingErrors;
     }
 
@@ -121,121 +111,107 @@
     // this.metrics = metrics;
     // }
 
-    private String shortenFilename( String filename, PmdFileInfo fileInfo )
-    {
+    private String shortenFilename(String filename, PmdFileInfo fileInfo) {
         String result = filename;
-        if ( fileInfo != null && fileInfo.getSourceDirectory() != null )
-        {
-            result = StringUtils.substring( result, fileInfo.getSourceDirectory().getAbsolutePath().length() + 1 );
+        if (fileInfo != null && fileInfo.getSourceDirectory() != null) {
+            result = StringUtils.substring(
+                    result, fileInfo.getSourceDirectory().getAbsolutePath().length() + 1);
         }
-        return StringUtils.replace( result, "\\", "/" );
+        return StringUtils.replace(result, "\\", "/");
     }
 
-    private String makeFileSectionName( String filename, PmdFileInfo fileInfo )
-    {
-        if ( aggregate && fileInfo != null && fileInfo.getProject() != null )
-        {
+    private String makeFileSectionName(String filename, PmdFileInfo fileInfo) {
+        if (aggregate && fileInfo != null && fileInfo.getProject() != null) {
             return fileInfo.getProject().getName() + " - " + filename;
         }
         return filename;
     }
 
-    private PmdFileInfo determineFileInfo( String filename )
-        throws IOException
-    {
-        File canonicalFilename = new File( filename ).getCanonicalFile();
-        PmdFileInfo fileInfo = files.get( canonicalFilename );
-        if ( fileInfo == null )
-        {
-            log.warn( "Couldn't determine PmdFileInfo for file " + filename + " (canonical: " + canonicalFilename
-                + "). XRef links won't be available." );
+    private PmdFileInfo determineFileInfo(String filename) throws IOException {
+        File canonicalFilename = new File(filename).getCanonicalFile();
+        PmdFileInfo fileInfo = files.get(canonicalFilename);
+        if (fileInfo == null) {
+            log.warn("Couldn't determine PmdFileInfo for file " + filename + " (canonical: " + canonicalFilename
+                    + "). XRef links won't be available.");
         }
 
         return fileInfo;
     }
 
-    private void startFileSection( int level, String currentFilename, PmdFileInfo fileInfo )
-    {
-        sink.section( level, null );
-        sink.sectionTitle( level, null );
+    private void startFileSection(int level, String currentFilename, PmdFileInfo fileInfo) {
+        sink.section(level, null);
+        sink.sectionTitle(level, null);
 
         // prepare the filename
-        this.currentFilename = shortenFilename( currentFilename, fileInfo );
+        this.currentFilename = shortenFilename(currentFilename, fileInfo);
 
-        sink.text( makeFileSectionName( this.currentFilename, fileInfo ) );
-        sink.sectionTitle_( level );
+        sink.text(makeFileSectionName(this.currentFilename, fileInfo));
+        sink.sectionTitle_(level);
 
         sink.table();
-        sink.tableRows( null, false );
+        sink.tableRows(null, false);
         sink.tableRow();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.column.rule" ) );
+        sink.text(bundle.getString("report.pmd.column.rule"));
         sink.tableHeaderCell_();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.column.violation" ) );
+        sink.text(bundle.getString("report.pmd.column.violation"));
         sink.tableHeaderCell_();
-        if ( this.renderRuleViolationPriority )
-        {
+        if (this.renderRuleViolationPriority) {
             sink.tableHeaderCell();
-            sink.text( bundle.getString( "report.pmd.column.priority" ) );
+            sink.text(bundle.getString("report.pmd.column.priority"));
             sink.tableHeaderCell_();
         }
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.column.line" ) );
+        sink.text(bundle.getString("report.pmd.column.line"));
         sink.tableHeaderCell_();
         sink.tableRow_();
     }
 
-    private void endFileSection( int level )
-    {
+    private void endFileSection(int level) {
         sink.tableRows_();
         sink.table_();
-        sink.section_( level );
+        sink.section_(level);
     }
 
-    private void addRuleName( Violation ruleViolation )
-    {
-        boolean hasUrl = StringUtils.isNotBlank( ruleViolation.getExternalInfoUrl() );
+    private void addRuleName(Violation ruleViolation) {
+        boolean hasUrl = StringUtils.isNotBlank(ruleViolation.getExternalInfoUrl());
 
-        if ( hasUrl )
-        {
-            sink.link( ruleViolation.getExternalInfoUrl() );
+        if (hasUrl) {
+            sink.link(ruleViolation.getExternalInfoUrl());
         }
 
-        sink.text( ruleViolation.getRule() );
+        sink.text(ruleViolation.getRule());
 
-        if ( hasUrl )
-        {
+        if (hasUrl) {
             sink.link_();
         }
     }
 
-    private void processSingleRuleViolation( Violation ruleViolation, PmdFileInfo fileInfo )
-    {
+    private void processSingleRuleViolation(Violation ruleViolation, PmdFileInfo fileInfo) {
         sink.tableRow();
         sink.tableCell();
-        addRuleName( ruleViolation );
+        addRuleName(ruleViolation);
         sink.tableCell_();
         sink.tableCell();
-        sink.text( ruleViolation.getText() );
+        sink.text(ruleViolation.getText());
         sink.tableCell_();
 
-        if ( this.renderRuleViolationPriority )
-        {
+        if (this.renderRuleViolationPriority) {
             sink.tableCell();
-            sink.text( String.valueOf( RulePriority.valueOf( ruleViolation.getPriority() ).getPriority() ) );
+            sink.text(String.valueOf(
+                    RulePriority.valueOf(ruleViolation.getPriority()).getPriority()));
             sink.tableCell_();
         }
 
         sink.tableCell();
 
         int beginLine = ruleViolation.getBeginline();
-        outputLineLink( beginLine, fileInfo );
+        outputLineLink(beginLine, fileInfo);
         int endLine = ruleViolation.getEndline();
-        if ( endLine != beginLine )
-        {
-            sink.text( "&#x2013;" ); // \u2013 is a medium long dash character
-            outputLineLink( endLine, fileInfo );
+        if (endLine != beginLine) {
+            sink.text("&#x2013;"); // \u2013 is a medium long dash character
+            outputLineLink(endLine, fileInfo);
         }
 
         sink.tableCell_();
@@ -245,26 +221,22 @@
     // PMD might run the analysis multi-threaded, so the violations might be reported
     // out of order. We sort them here by filename and line number before writing them to
     // the report.
-    private void renderViolations()
-        throws IOException
-    {
+    private void renderViolations() throws IOException {
         sink.section1();
         sink.sectionTitle1();
-        sink.text( bundle.getString( "report.pmd.files" ) );
+        sink.text(bundle.getString("report.pmd.files"));
         sink.sectionTitle1_();
 
         // TODO files summary
 
-        List<Violation> violations2 = new ArrayList<>( violations );
-        renderViolationsTable( 2, violations2 );
+        List<Violation> violations2 = new ArrayList<>(violations);
+        renderViolationsTable(2, violations2);
 
         sink.section1_();
     }
 
-    private void renderViolationsByPriority() throws IOException
-    {
-        if ( !renderViolationsByPriority )
-        {
+    private void renderViolationsByPriority() throws IOException {
+        if (!renderViolationsByPriority) {
             return;
         }
 
@@ -273,44 +245,39 @@
 
         sink.section1();
         sink.sectionTitle1();
-        sink.text( bundle.getString( "report.pmd.violationsByPriority" ) );
+        sink.text(bundle.getString("report.pmd.violationsByPriority"));
         sink.sectionTitle1_();
 
         Map<RulePriority, List<Violation>> violationsByPriority = new HashMap<>();
-        for ( Violation violation : violations )
-        {
-            RulePriority priority = RulePriority.valueOf( violation.getPriority() );
-            List<Violation> violationSegment = violationsByPriority.get( priority );
-            if ( violationSegment == null )
-            {
+        for (Violation violation : violations) {
+            RulePriority priority = RulePriority.valueOf(violation.getPriority());
+            List<Violation> violationSegment = violationsByPriority.get(priority);
+            if (violationSegment == null) {
                 violationSegment = new ArrayList<>();
-                violationsByPriority.put( priority, violationSegment );
+                violationsByPriority.put(priority, violationSegment);
             }
-            violationSegment.add( violation );
+            violationSegment.add(violation);
         }
 
-        for ( RulePriority priority : RulePriority.values() )
-        {
-            List<Violation> violationsWithPriority = violationsByPriority.get( priority );
-            if ( violationsWithPriority == null || violationsWithPriority.isEmpty() )
-            {
+        for (RulePriority priority : RulePriority.values()) {
+            List<Violation> violationsWithPriority = violationsByPriority.get(priority);
+            if (violationsWithPriority == null || violationsWithPriority.isEmpty()) {
                 continue;
             }
 
             sink.section2();
             sink.sectionTitle2();
-            sink.text( bundle.getString( "report.pmd.priority" ) + " " + priority.getPriority() );
+            sink.text(bundle.getString("report.pmd.priority") + " " + priority.getPriority());
             sink.sectionTitle2_();
 
-            renderViolationsTable( 3, violationsWithPriority );
+            renderViolationsTable(3, violationsWithPriority);
 
             sink.section2_();
         }
 
-        if ( violations.isEmpty() )
-        {
+        if (violations.isEmpty()) {
             sink.paragraph();
-            sink.text( bundle.getString( "report.pmd.noProblems" ) );
+            sink.text(bundle.getString("report.pmd.noProblems"));
             sink.paragraph_();
         }
 
@@ -319,70 +286,55 @@
         this.renderRuleViolationPriority = oldPriorityColumn;
     }
 
-    private void renderViolationsTable( int level, List<Violation> violationSegment )
-    throws IOException
-    {
-        Collections.sort( violationSegment, new Comparator<Violation>()
-        {
+    private void renderViolationsTable(int level, List<Violation> violationSegment) throws IOException {
+        Collections.sort(violationSegment, new Comparator<Violation>() {
             /** {@inheritDoc} */
-            public int compare( Violation o1, Violation o2 )
-            {
-                int filenames = o1.getFileName().compareTo( o2.getFileName() );
-                if ( filenames == 0 )
-                {
+            public int compare(Violation o1, Violation o2) {
+                int filenames = o1.getFileName().compareTo(o2.getFileName());
+                if (filenames == 0) {
                     return o1.getBeginline() - o2.getBeginline();
-                }
-                else
-                {
+                } else {
                     return filenames;
                 }
             }
-        } );
+        });
 
         boolean fileSectionStarted = false;
         String previousFilename = null;
-        for ( Violation ruleViolation : violationSegment )
-        {
+        for (Violation ruleViolation : violationSegment) {
             String currentFn = ruleViolation.getFileName();
-            PmdFileInfo fileInfo = determineFileInfo( currentFn );
+            PmdFileInfo fileInfo = determineFileInfo(currentFn);
 
-            if ( !currentFn.equalsIgnoreCase( previousFilename ) && fileSectionStarted )
-            {
-                endFileSection( level );
+            if (!currentFn.equalsIgnoreCase(previousFilename) && fileSectionStarted) {
+                endFileSection(level);
                 fileSectionStarted = false;
             }
-            if ( !fileSectionStarted )
-            {
-                startFileSection( level, currentFn, fileInfo );
+            if (!fileSectionStarted) {
+                startFileSection(level, currentFn, fileInfo);
                 fileSectionStarted = true;
             }
 
-            processSingleRuleViolation( ruleViolation, fileInfo );
+            processSingleRuleViolation(ruleViolation, fileInfo);
 
             previousFilename = currentFn;
         }
 
-        if ( fileSectionStarted )
-        {
-            endFileSection( level );
+        if (fileSectionStarted) {
+            endFileSection(level);
         }
     }
 
-    private void outputLineLink( int line, PmdFileInfo fileInfo )
-    {
+    private void outputLineLink(int line, PmdFileInfo fileInfo) {
         String xrefLocation = null;
-        if ( fileInfo != null )
-        {
+        if (fileInfo != null) {
             xrefLocation = fileInfo.getXrefLocation();
         }
 
-        if ( xrefLocation != null )
-        {
-            sink.link( xrefLocation + "/" + currentFilename.replaceAll( "\\.java$", ".html" ) + "#L" + line );
+        if (xrefLocation != null) {
+            sink.link(xrefLocation + "/" + currentFilename.replaceAll("\\.java$", ".html") + "#L" + line);
         }
-        sink.text( String.valueOf( line ) );
-        if ( xrefLocation != null )
-        {
+        sink.text(String.valueOf(line));
+        if (xrefLocation != null) {
             sink.link_();
         }
     }
@@ -390,62 +342,57 @@
     // PMD might run the analysis multi-threaded, so the suppressed violations might be reported
     // out of order. We sort them here by filename before writing them to
     // the report.
-    private void renderSuppressedViolations()
-        throws IOException
-    {
+    private void renderSuppressedViolations() throws IOException {
         sink.section1();
         sink.sectionTitle1();
-        sink.text( bundle.getString( "report.pmd.suppressedViolations.title" ) );
+        sink.text(bundle.getString("report.pmd.suppressedViolations.title"));
         sink.sectionTitle1_();
 
-        Collections.sort( suppressedViolations, new Comparator<SuppressedViolation>()
-        {
+        Collections.sort(suppressedViolations, new Comparator<SuppressedViolation>() {
             @Override
-            public int compare( SuppressedViolation o1, SuppressedViolation o2 )
-            {
-                return o1.getFilename().compareTo( o2.getFilename() );
+            public int compare(SuppressedViolation o1, SuppressedViolation o2) {
+                return o1.getFilename().compareTo(o2.getFilename());
             }
-        } );
+        });
 
         sink.table();
-        sink.tableRows( null, false );
+        sink.tableRows(null, false);
         sink.tableRow();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.suppressedViolations.column.filename" ) );
+        sink.text(bundle.getString("report.pmd.suppressedViolations.column.filename"));
         sink.tableHeaderCell_();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.suppressedViolations.column.ruleMessage" ) );
+        sink.text(bundle.getString("report.pmd.suppressedViolations.column.ruleMessage"));
         sink.tableHeaderCell_();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.suppressedViolations.column.suppressionType" ) );
+        sink.text(bundle.getString("report.pmd.suppressedViolations.column.suppressionType"));
         sink.tableHeaderCell_();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.suppressedViolations.column.userMessage" ) );
+        sink.text(bundle.getString("report.pmd.suppressedViolations.column.userMessage"));
         sink.tableHeaderCell_();
         sink.tableRow_();
 
-        for ( SuppressedViolation suppressedViolation : suppressedViolations )
-        {
+        for (SuppressedViolation suppressedViolation : suppressedViolations) {
             String filename = suppressedViolation.getFilename();
-            PmdFileInfo fileInfo = determineFileInfo( filename );
-            filename = shortenFilename( filename, fileInfo );
+            PmdFileInfo fileInfo = determineFileInfo(filename);
+            filename = shortenFilename(filename, fileInfo);
 
             sink.tableRow();
 
             sink.tableCell();
-            sink.text( filename );
+            sink.text(filename);
             sink.tableCell_();
 
             sink.tableCell();
-            sink.text( suppressedViolation.getRuleMessage() );
+            sink.text(suppressedViolation.getRuleMessage());
             sink.tableCell_();
 
             sink.tableCell();
-            sink.text( suppressedViolation.getSuppressionType() );
+            sink.text(suppressedViolation.getSuppressionType());
             sink.tableCell_();
 
             sink.tableCell();
-            sink.text( suppressedViolation.getUserMessage() );
+            sink.text(suppressedViolation.getUserMessage());
             sink.tableCell_();
 
             sink.tableRow_();
@@ -456,38 +403,34 @@
         sink.section1_();
     }
 
-    private void processProcessingErrors() throws IOException
-    {
+    private void processProcessingErrors() throws IOException {
         // sort the problem by filename first, since PMD is executed multi-threaded
         // and might reports the results unsorted
-        Collections.sort( processingErrors, new Comparator<ProcessingError>()
-        {
+        Collections.sort(processingErrors, new Comparator<ProcessingError>() {
             @Override
-            public int compare( ProcessingError e1, ProcessingError e2 )
-            {
-                return e1.getFilename().compareTo( e2.getFilename() );
+            public int compare(ProcessingError e1, ProcessingError e2) {
+                return e1.getFilename().compareTo(e2.getFilename());
             }
-        } );
+        });
 
         sink.section1();
         sink.sectionTitle1();
-        sink.text( bundle.getString( "report.pmd.processingErrors.title" ) );
+        sink.text(bundle.getString("report.pmd.processingErrors.title"));
         sink.sectionTitle1_();
 
         sink.table();
-        sink.tableRows( null, false );
+        sink.tableRows(null, false);
         sink.tableRow();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.processingErrors.column.filename" ) );
+        sink.text(bundle.getString("report.pmd.processingErrors.column.filename"));
         sink.tableHeaderCell_();
         sink.tableHeaderCell();
-        sink.text( bundle.getString( "report.pmd.processingErrors.column.problem" ) );
+        sink.text(bundle.getString("report.pmd.processingErrors.column.problem"));
         sink.tableHeaderCell_();
         sink.tableRow_();
 
-        for ( ProcessingError error : processingErrors )
-        {
-            processSingleProcessingError( error );
+        for (ProcessingError error : processingErrors) {
+            processSingleProcessingError(error);
         }
 
         sink.tableRows_();
@@ -496,30 +439,28 @@
         sink.section1_();
     }
 
-    private void processSingleProcessingError( ProcessingError error ) throws IOException
-    {
+    private void processSingleProcessingError(ProcessingError error) throws IOException {
         String filename = error.getFilename();
-        PmdFileInfo fileInfo = determineFileInfo( filename );
-        filename = makeFileSectionName( shortenFilename( filename, fileInfo ), fileInfo );
+        PmdFileInfo fileInfo = determineFileInfo(filename);
+        filename = makeFileSectionName(shortenFilename(filename, fileInfo), fileInfo);
 
         sink.tableRow();
         sink.tableCell();
-        sink.text( filename );
+        sink.text(filename);
         sink.tableCell_();
         sink.tableCell();
-        sink.text( error.getMsg() );
-        sink.verbatim( null );
-        sink.rawText( error.getDetail() );
+        sink.text(error.getMsg());
+        sink.verbatim(null);
+        sink.rawText(error.getDetail());
         sink.verbatim_();
         sink.tableCell_();
         sink.tableRow_();
     }
 
-    public void beginDocument()
-    {
+    public void beginDocument() {
         sink.head();
         sink.title();
-        sink.text( getTitle() );
+        sink.text(getTitle());
         sink.title_();
         sink.head_();
 
@@ -527,15 +468,15 @@
 
         sink.section1();
         sink.sectionTitle1();
-        sink.text( getTitle() );
+        sink.text(getTitle());
         sink.sectionTitle1_();
 
         sink.paragraph();
-        sink.text( bundle.getString( "report.pmd.pmdlink" ) + " " );
-        sink.link( "https://pmd.github.io" );
-        sink.text( "PMD" );
+        sink.text(bundle.getString("report.pmd.pmdlink") + " ");
+        sink.link("https://pmd.github.io");
+        sink.text("PMD");
         sink.link_();
-        sink.text( " " + AbstractPmdReport.getPmdVersion() + "." );
+        sink.text(" " + AbstractPmdReport.getPmdVersion() + ".");
         sink.paragraph_();
 
         sink.section1_();
@@ -557,36 +498,27 @@
      * sink.section1_(); }
      */
 
-    public void render()
-        throws IOException
-    {
-        if ( !violations.isEmpty() )
-        {
+    public void render() throws IOException {
+        if (!violations.isEmpty()) {
             renderViolationsByPriority();
 
             renderViolations();
-        }
-        else
-        {
+        } else {
             sink.paragraph();
-            sink.text( bundle.getString( "report.pmd.noProblems" ) );
+            sink.text(bundle.getString("report.pmd.noProblems"));
             sink.paragraph_();
         }
 
-        if ( !suppressedViolations.isEmpty() )
-        {
+        if (!suppressedViolations.isEmpty()) {
             renderSuppressedViolations();
         }
 
-        if ( !processingErrors.isEmpty() )
-        {
+        if (!processingErrors.isEmpty()) {
             processProcessingErrors();
         }
     }
 
-    public void endDocument()
-        throws IOException
-    {
+    public void endDocument() throws IOException {
         // The Metrics report useless with the current PMD metrics impl.
         // For instance, run the coupling ruleset and you will get a boatload
         // of excessive imports metrics, none of which is really any use.
@@ -601,18 +533,15 @@
         sink.close();
     }
 
-    public void setFiles( Map<File, PmdFileInfo> files )
-    {
+    public void setFiles(Map<File, PmdFileInfo> files) {
         this.files = files;
     }
 
-    public void setRenderRuleViolationPriority( boolean renderRuleViolationPriority )
-    {
+    public void setRenderRuleViolationPriority(boolean renderRuleViolationPriority) {
         this.renderRuleViolationPriority = renderRuleViolationPriority;
     }
 
-    public void setRenderViolationsByPriority( boolean renderViolationsByPriority )
-    {
+    public void setRenderViolationsByPriority(boolean renderViolationsByPriority) {
         this.renderViolationsByPriority = renderViolationsByPriority;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java b/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
index 39cb7ef..45d6353 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojo.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -28,14 +27,14 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.pmd.model.PmdErrorDetail;
-import org.apache.maven.plugins.pmd.model.PmdFile;
-import org.apache.maven.plugins.pmd.model.Violation;
-import org.apache.maven.plugins.pmd.model.io.xpp3.PmdXpp3Reader;
 import org.apache.maven.plugins.annotations.Execute;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.pmd.model.PmdErrorDetail;
+import org.apache.maven.plugins.pmd.model.PmdFile;
+import org.apache.maven.plugins.pmd.model.Violation;
+import org.apache.maven.plugins.pmd.model.io.xpp3.PmdXpp3Reader;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
@@ -45,17 +44,14 @@
  * @version $Id$
  * @since 2.0
  */
-@Mojo( name = "check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true )
-@Execute( goal = "pmd" )
-public class PmdViolationCheckMojo
-    extends AbstractPmdViolationCheckMojo<Violation>
-{
+@Mojo(name = "check", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
+@Execute(goal = "pmd")
+public class PmdViolationCheckMojo extends AbstractPmdViolationCheckMojo<Violation> {
     /**
      * Default constructor. Initializes with the correct {@link ExcludeViolationsFromFile}.
      */
-    public PmdViolationCheckMojo()
-    {
-        super( new ExcludeViolationsFromFile() );
+    public PmdViolationCheckMojo() {
+        super(new ExcludeViolationsFromFile());
     }
 
     /**
@@ -70,76 +66,64 @@
      * Setting a value of 1 will treat all violations as warnings.
      * Only values from 1 to 5 are valid.
      */
-    @Parameter( property = "pmd.failurePriority", defaultValue = "5", required = true )
+    @Parameter(property = "pmd.failurePriority", defaultValue = "5", required = true)
     private int failurePriority = 5;
 
     /**
      * Skip the PMD checks. Most useful on the command line via "-Dpmd.skip=true".
      */
-    @Parameter( property = "pmd.skip", defaultValue = "false" )
+    @Parameter(property = "pmd.skip", defaultValue = "false")
     private boolean skip;
 
     /**
      * {@inheritDoc}
      */
-    public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( skip )
-        {
-            getLog().info( "Skipping PMD execution" );
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (skip) {
+            getLog().info("Skipping PMD execution");
             return;
         }
 
-        executeCheck( "pmd.xml", "violation", "PMD violation", failurePriority );
+        executeCheck("pmd.xml", "violation", "PMD violation", failurePriority);
     }
 
     /**
      * {@inheritDoc}
      */
-    protected void printError( Violation item, String severity )
-    {
+    protected void printError(Violation item, String severity) {
 
-        StringBuilder buff = new StringBuilder( 100 );
-        buff.append( "PMD " ).append( severity ).append( ": " );
-        if ( item.getViolationClass() != null )
-        {
-            if ( item.getViolationPackage() != null )
-            {
-                buff.append( item.getViolationPackage() );
-                buff.append( "." );
+        StringBuilder buff = new StringBuilder(100);
+        buff.append("PMD ").append(severity).append(": ");
+        if (item.getViolationClass() != null) {
+            if (item.getViolationPackage() != null) {
+                buff.append(item.getViolationPackage());
+                buff.append(".");
             }
-            buff.append( item.getViolationClass() );
+            buff.append(item.getViolationClass());
+        } else {
+            buff.append(item.getFileName());
         }
-        else
-        {
-            buff.append( item.getFileName() );
-        }
-        buff.append( ":" );
-        buff.append( item.getBeginline() );
-        buff.append( " Rule:" ).append( item.getRule() );
-        buff.append( " Priority:" ).append( item.getPriority() );
-        buff.append( " " ).append( item.getText() ).append( "." );
+        buff.append(":");
+        buff.append(item.getBeginline());
+        buff.append(" Rule:").append(item.getRule());
+        buff.append(" Priority:").append(item.getPriority());
+        buff.append(" ").append(item.getText()).append(".");
 
-        this.getLog().info( buff.toString() );
+        this.getLog().info(buff.toString());
     }
 
     @Override
-    protected List<Violation> getErrorDetails( File pmdFile ) throws XmlPullParserException, IOException
-    {
-        try ( InputStream in = new FileInputStream( pmdFile ) )
-        {
+    protected List<Violation> getErrorDetails(File pmdFile) throws XmlPullParserException, IOException {
+        try (InputStream in = new FileInputStream(pmdFile)) {
             PmdXpp3Reader reader = new PmdXpp3Reader();
-            PmdErrorDetail details = reader.read( in, false );
+            PmdErrorDetail details = reader.read(in, false);
             List<Violation> violations = new ArrayList<>();
-            for ( PmdFile file : details.getFiles() )
-            {
+            for (PmdFile file : details.getFiles()) {
                 String fullPath = file.getName();
 
-                for ( Violation violation : file.getViolations() )
-                {
-                    violation.setFileName( getFilename( fullPath, violation.getViolationPackage() ) );
-                    violations.add( violation );
+                for (Violation violation : file.getViolations()) {
+                    violation.setFileName(getFilename(fullPath, violation.getViolationPackage()));
+                    violations.add(violation);
                 }
             }
             return violations;
@@ -147,34 +131,29 @@
     }
 
     @Override
-    protected int getPriority( Violation errorDetail )
-    {
+    protected int getPriority(Violation errorDetail) {
         return errorDetail.getPriority();
     }
 
     @Override
-    protected ViolationDetails<Violation> newViolationDetailsInstance()
-    {
+    protected ViolationDetails<Violation> newViolationDetailsInstance() {
         return new ViolationDetails<>();
     }
 
-    private String getFilename( String fullpath, String pkg )
-    {
-        int index = fullpath.lastIndexOf( File.separatorChar );
+    private String getFilename(String fullpath, String pkg) {
+        int index = fullpath.lastIndexOf(File.separatorChar);
 
-        while ( StringUtils.isNotEmpty( pkg ) )
-        {
-            index = fullpath.substring( 0, index ).lastIndexOf( File.separatorChar );
+        while (StringUtils.isNotEmpty(pkg)) {
+            index = fullpath.substring(0, index).lastIndexOf(File.separatorChar);
 
-            int dot = pkg.indexOf( '.' );
+            int dot = pkg.indexOf('.');
 
-            if ( dot < 0 )
-            {
+            if (dot < 0) {
                 break;
             }
-            pkg = pkg.substring( dot + 1 );
+            pkg = pkg.substring(dot + 1);
         }
 
-        return fullpath.substring( index + 1 );
+        return fullpath.substring(index + 1);
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/ViolationDetails.java b/src/main/java/org/apache/maven/plugins/pmd/ViolationDetails.java
index 98e1ce7..b19b1bb 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/ViolationDetails.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/ViolationDetails.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,8 +29,7 @@
  * @author Robert Scholte
  * @since 2.7
  */
-public class ViolationDetails<D>
-{
+public class ViolationDetails<D> {
     private List<D> warningDetails = new ArrayList<>();
 
     private List<D> failureDetails = new ArrayList<>();
@@ -39,32 +37,28 @@
     /**
      * @return the warningDetails, never {@code null}
      */
-    public List<D> getWarningDetails()
-    {
+    public List<D> getWarningDetails() {
         return warningDetails;
     }
 
     /**
      * @param warningDetails the warningDetails to set
      */
-    public void setWarningDetails( List<D> warningDetails )
-    {
+    public void setWarningDetails(List<D> warningDetails) {
         this.warningDetails = warningDetails;
     }
 
     /**
      * @return the failureDetails, never {@code null}
      */
-    public List<D> getFailureDetails()
-    {
+    public List<D> getFailureDetails() {
         return failureDetails;
     }
 
     /**
      * @param failureDetails the failureDetails to set
      */
-    public void setFailureDetails( List<D> failureDetails )
-    {
+    public void setFailureDetails(List<D> failureDetails) {
         this.failureDetails = failureDetails;
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdExecutor.java b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdExecutor.java
index 998c8e3..43ba3c0 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdExecutor.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdExecutor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -32,13 +31,6 @@
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.plexus.util.FileUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import net.sourceforge.pmd.cpd.CPD;
 import net.sourceforge.pmd.cpd.CPDConfiguration;
 import net.sourceforge.pmd.cpd.CSVRenderer;
@@ -51,81 +43,70 @@
 import net.sourceforge.pmd.cpd.SimpleRenderer;
 import net.sourceforge.pmd.cpd.XMLRenderer;
 import net.sourceforge.pmd.cpd.renderer.CPDRenderer;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Executes CPD with the configuration provided via {@link CpdRequest}.
  */
-public class CpdExecutor extends Executor
-{
-    private static final Logger LOG = LoggerFactory.getLogger( CpdExecutor.class );
+public class CpdExecutor extends Executor {
+    private static final Logger LOG = LoggerFactory.getLogger(CpdExecutor.class);
 
-    public static CpdResult execute( CpdRequest request ) throws MavenReportException
-    {
-        if ( request.getJavaExecutable() != null )
-        {
-            return fork( request );
+    public static CpdResult execute(CpdRequest request) throws MavenReportException {
+        if (request.getJavaExecutable() != null) {
+            return fork(request);
         }
 
         ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
-        try
-        {
-            Thread.currentThread().setContextClassLoader( CpdExecutor.class.getClassLoader() );
-            CpdExecutor cpdExecutor = new CpdExecutor( request );
+        try {
+            Thread.currentThread().setContextClassLoader(CpdExecutor.class.getClassLoader());
+            CpdExecutor cpdExecutor = new CpdExecutor(request);
             return cpdExecutor.run();
-        }
-        finally
-        {
-            Thread.currentThread().setContextClassLoader( origLoader );
+        } finally {
+            Thread.currentThread().setContextClassLoader(origLoader);
         }
     }
 
-    private static CpdResult fork( CpdRequest request )
-            throws MavenReportException
-    {
-        File basePmdDir = new File ( request.getTargetDirectory(), "pmd" );
+    private static CpdResult fork(CpdRequest request) throws MavenReportException {
+        File basePmdDir = new File(request.getTargetDirectory(), "pmd");
         basePmdDir.mkdirs();
-        File cpdRequestFile = new File( basePmdDir, "cpdrequest.bin" );
-        try ( ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( cpdRequestFile ) ) )
-        {
-            out.writeObject( request );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+        File cpdRequestFile = new File(basePmdDir, "cpdrequest.bin");
+        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(cpdRequestFile))) {
+            out.writeObject(request);
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
 
         String classpath = buildClasspath();
         ProcessBuilder pb = new ProcessBuilder();
         // note: using env variable instead of -cp cli arg to avoid length limitations under Windows
-        pb.environment().put( "CLASSPATH", classpath );
-        pb.command().add( request.getJavaExecutable() );
-        pb.command().add( CpdExecutor.class.getName() );
-        pb.command().add( cpdRequestFile.getAbsolutePath() );
+        pb.environment().put("CLASSPATH", classpath);
+        pb.command().add(request.getJavaExecutable());
+        pb.command().add(CpdExecutor.class.getName());
+        pb.command().add(cpdRequestFile.getAbsolutePath());
 
-        LOG.debug( "Executing: CLASSPATH={}, command={}", classpath, pb.command() );
-        try
-        {
+        LOG.debug("Executing: CLASSPATH={}, command={}", classpath, pb.command());
+        try {
             final Process p = pb.start();
             // Note: can't use pb.inheritIO(), since System.out/System.err has been modified after process start
             // and inheritIO would only inherit file handles, not the changed streams.
-            ProcessStreamHandler.start( p.getInputStream(), System.out );
-            ProcessStreamHandler.start( p.getErrorStream(), System.err );
+            ProcessStreamHandler.start(p.getInputStream(), System.out);
+            ProcessStreamHandler.start(p.getErrorStream(), System.err);
             int exit = p.waitFor();
-            LOG.debug( "CpdExecutor exit code: {}", exit );
-            if ( exit != 0 )
-            {
-                throw new MavenReportException( "CpdExecutor exited with exit code " + exit );
+            LOG.debug("CpdExecutor exit code: {}", exit);
+            if (exit != 0) {
+                throw new MavenReportException("CpdExecutor exited with exit code " + exit);
             }
-            return new CpdResult( new File( request.getTargetDirectory(), "cpd.xml" ), request.getOutputEncoding() );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
-        }
-        catch ( InterruptedException e )
-        {
+            return new CpdResult(new File(request.getTargetDirectory(), "cpd.xml"), request.getOutputEncoding());
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
+        } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
-            throw new MavenReportException( e.getMessage(), e );
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 
@@ -140,22 +121,18 @@
      *
      * @param args
      */
-    public static void main( String[] args )
-    {
-        File requestFile = new File( args[0] );
-        try ( ObjectInputStream in = new ObjectInputStream( new FileInputStream( requestFile ) ) )
-        {
+    public static void main(String[] args) {
+        File requestFile = new File(args[0]);
+        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(requestFile))) {
             CpdRequest request = (CpdRequest) in.readObject();
-            CpdExecutor cpdExecutor = new CpdExecutor( request );
-            cpdExecutor.setupLogLevel( request.getLogLevel() );
+            CpdExecutor cpdExecutor = new CpdExecutor(request);
+            cpdExecutor.setupLogLevel(request.getLogLevel());
             cpdExecutor.run();
-            System.exit( 0 );
+            System.exit(0);
+        } catch (IOException | ClassNotFoundException | MavenReportException e) {
+            LOG.error(e.getMessage(), e);
         }
-        catch ( IOException | ClassNotFoundException | MavenReportException e )
-        {
-            LOG.error( e.getMessage(), e );
-        }
-        System.exit( 1 );
+        System.exit(1);
     }
 
     private final CpdRequest request;
@@ -163,124 +140,94 @@
     /** Helper to exclude duplications from the result. */
     private final ExcludeDuplicationsFromFile excludeDuplicationsFromFile = new ExcludeDuplicationsFromFile();
 
-    public CpdExecutor( CpdRequest request )
-    {
-        this.request = Objects.requireNonNull( request );
+    public CpdExecutor(CpdRequest request) {
+        this.request = Objects.requireNonNull(request);
     }
 
-    private CpdResult run() throws MavenReportException
-    {
-        setupPmdLogging( request.isShowPmdLog(), request.getLogLevel() );
+    private CpdResult run() throws MavenReportException {
+        setupPmdLogging(request.isShowPmdLog(), request.getLogLevel());
 
-        try
-        {
-            excludeDuplicationsFromFile.loadExcludeFromFailuresData( request.getExcludeFromFailureFile() );
-        }
-        catch ( MojoExecutionException e )
-        {
-            throw new MavenReportException( "Error loading exclusions", e );
+        try {
+            excludeDuplicationsFromFile.loadExcludeFromFailuresData(request.getExcludeFromFailureFile());
+        } catch (MojoExecutionException e) {
+            throw new MavenReportException("Error loading exclusions", e);
         }
 
         CPDConfiguration cpdConfiguration = new CPDConfiguration();
-        cpdConfiguration.setMinimumTileSize( request.getMinimumTokens() );
-        
+        cpdConfiguration.setMinimumTileSize(request.getMinimumTokens());
+
         Language cpdLanguage;
-        if ( "java".equals ( request.getLanguage() ) || null == request.getLanguage() )
-        {
-            cpdLanguage = new JavaLanguage( request.getLanguageProperties() );
-        }
-        else if ( "javascript".equals( request.getLanguage() ) )
-        {
+        if ("java".equals(request.getLanguage()) || null == request.getLanguage()) {
+            cpdLanguage = new JavaLanguage(request.getLanguageProperties());
+        } else if ("javascript".equals(request.getLanguage())) {
             cpdLanguage = new EcmascriptLanguage();
-        }
-        else if ( "jsp".equals( request.getLanguage() ) )
-        {
+        } else if ("jsp".equals(request.getLanguage())) {
             cpdLanguage = new JSPLanguage();
-        }
-        else
-        {
-            cpdLanguage = LanguageFactory.createLanguage( request.getLanguage(), request.getLanguageProperties() );
-        }
-        
-        cpdConfiguration.setLanguage( cpdLanguage );
-        cpdConfiguration.setSourceEncoding( request.getSourceEncoding() );
-
-        CPD cpd = new CPD( cpdConfiguration );
-        try
-        {
-            cpd.add( request.getFiles() );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+        } else {
+            cpdLanguage = LanguageFactory.createLanguage(request.getLanguage(), request.getLanguageProperties());
         }
 
-        LOG.debug( "Executing CPD..." );
+        cpdConfiguration.setLanguage(cpdLanguage);
+        cpdConfiguration.setSourceEncoding(request.getSourceEncoding());
+
+        CPD cpd = new CPD(cpdConfiguration);
+        try {
+            cpd.add(request.getFiles());
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
+        }
+
+        LOG.debug("Executing CPD...");
         cpd.go();
-        LOG.debug( "CPD finished." );
+        LOG.debug("CPD finished.");
 
         // always create XML format. we need to output it even if the file list is empty or we have no duplications
         // so the "check" goals can check for violations
-        writeXmlReport( cpd );
+        writeXmlReport(cpd);
 
         // html format is handled by maven site report, xml format has already been rendered
         String format = request.getFormat();
-        if ( !"html".equals( format ) && !"xml".equals( format ) )
-        {
-            writeFormattedReport( cpd );
+        if (!"html".equals(format) && !"xml".equals(format)) {
+            writeFormattedReport(cpd);
         }
 
-        return new CpdResult( new File( request.getTargetDirectory(), "cpd.xml" ), request.getOutputEncoding() );
+        return new CpdResult(new File(request.getTargetDirectory(), "cpd.xml"), request.getOutputEncoding());
     }
 
-    private void writeXmlReport( CPD cpd ) throws MavenReportException
-    {
-        File targetFile = writeReport( cpd, new XMLRenderer( request.getOutputEncoding() ), "xml" );
-        if ( request.isIncludeXmlInSite() )
-        {
-            File siteDir = new File( request.getReportOutputDirectory() );
+    private void writeXmlReport(CPD cpd) throws MavenReportException {
+        File targetFile = writeReport(cpd, new XMLRenderer(request.getOutputEncoding()), "xml");
+        if (request.isIncludeXmlInSite()) {
+            File siteDir = new File(request.getReportOutputDirectory());
             siteDir.mkdirs();
-            try
-            {
-                FileUtils.copyFile( targetFile, new File( siteDir, "cpd.xml" ) );
-            }
-            catch ( IOException e )
-            {
-                throw new MavenReportException( e.getMessage(), e );
+            try {
+                FileUtils.copyFile(targetFile, new File(siteDir, "cpd.xml"));
+            } catch (IOException e) {
+                throw new MavenReportException(e.getMessage(), e);
             }
         }
     }
 
-    private File writeReport( CPD cpd, CPDRenderer r, String extension ) throws MavenReportException
-    {
-        if ( r == null )
-        {
+    private File writeReport(CPD cpd, CPDRenderer r, String extension) throws MavenReportException {
+        if (r == null) {
             return null;
         }
 
-        File targetDir = new File( request.getTargetDirectory() );
+        File targetDir = new File(request.getTargetDirectory());
         targetDir.mkdirs();
-        File targetFile = new File( targetDir, "cpd." + extension );
-        try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ),
-                request.getOutputEncoding() ) )
-        {
-            r.render( filterMatches( cpd.getMatches() ), writer );
+        File targetFile = new File(targetDir, "cpd." + extension);
+        try (Writer writer = new OutputStreamWriter(new FileOutputStream(targetFile), request.getOutputEncoding())) {
+            r.render(filterMatches(cpd.getMatches()), writer);
             writer.flush();
-        }
-        catch ( IOException ioe )
-        {
-            throw new MavenReportException( ioe.getMessage(), ioe );
+        } catch (IOException ioe) {
+            throw new MavenReportException(ioe.getMessage(), ioe);
         }
         return targetFile;
     }
 
-    private void writeFormattedReport( CPD cpd )
-            throws MavenReportException
-        {
-            CPDRenderer r = createRenderer( request.getFormat(), request.getOutputEncoding() );
-            writeReport( cpd, r, request.getFormat() );
-
-        }
+    private void writeFormattedReport(CPD cpd) throws MavenReportException {
+        CPDRenderer r = createRenderer(request.getFormat(), request.getOutputEncoding());
+        writeReport(cpd, r, request.getFormat());
+    }
 
     /**
      * Create and return the correct renderer for the output type.
@@ -288,60 +235,44 @@
      * @return the renderer based on the configured output
      * @throws org.apache.maven.reporting.MavenReportException if no renderer found for the output type
      */
-    public static CPDRenderer createRenderer( String format, String outputEncoding )
-        throws MavenReportException
-    {
+    public static CPDRenderer createRenderer(String format, String outputEncoding) throws MavenReportException {
         CPDRenderer renderer = null;
-        if ( "xml".equals( format ) )
-        {
-            renderer = new XMLRenderer( outputEncoding );
-        }
-        else if ( "csv".equals( format ) )
-        {
+        if ("xml".equals(format)) {
+            renderer = new XMLRenderer(outputEncoding);
+        } else if ("csv".equals(format)) {
             renderer = new CSVRenderer();
-        }
-        else if ( "txt".equals( format ) )
-        {
+        } else if ("txt".equals(format)) {
             renderer = new SimpleRenderer();
-        }
-        else if ( !"".equals( format ) && !"none".equals( format ) )
-        {
-            try
-            {
-                renderer = (CPDRenderer) Class.forName( format ).getConstructor().newInstance();
-            }
-            catch ( Exception e )
-            {
-                throw new MavenReportException( "Can't find CPD custom format " + format + ": "
-                    + e.getClass().getName(), e );
+        } else if (!"".equals(format) && !"none".equals(format)) {
+            try {
+                renderer = (CPDRenderer) Class.forName(format).getConstructor().newInstance();
+            } catch (Exception e) {
+                throw new MavenReportException(
+                        "Can't find CPD custom format " + format + ": "
+                                + e.getClass().getName(),
+                        e);
             }
         }
 
         return renderer;
     }
 
-    private Iterator<Match> filterMatches( Iterator<Match> matches )
-    {
-        LOG.debug( "Filtering duplications. Using " + excludeDuplicationsFromFile.countExclusions()
-            + " configured exclusions." );
+    private Iterator<Match> filterMatches(Iterator<Match> matches) {
+        LOG.debug("Filtering duplications. Using " + excludeDuplicationsFromFile.countExclusions()
+                + " configured exclusions.");
 
         List<Match> filteredMatches = new ArrayList<>();
         int excludedDuplications = 0;
-        while ( matches.hasNext() )
-        {
+        while (matches.hasNext()) {
             Match match = matches.next();
-            if ( excludeDuplicationsFromFile.isExcludedFromFailure( match ) )
-            {
+            if (excludeDuplicationsFromFile.isExcludedFromFailure(match)) {
                 excludedDuplications++;
-            }
-            else
-            {
-                filteredMatches.add( match );
+            } else {
+                filteredMatches.add(match);
             }
         }
 
-        LOG.debug( "Excluded " + excludedDuplications + " duplications." );
+        LOG.debug("Excluded " + excludedDuplications + " duplications.");
         return filteredMatches.iterator();
     }
-
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdRequest.java b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdRequest.java
index 51c333a..ebbff04 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdRequest.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdRequest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.io.Serializable;
@@ -29,13 +28,12 @@
 /**
  * Data object to store all configuration options needed to execute CPD
  * as a separate process.
- * 
+ *
  * <p>This class is intended to be serialized and read back.
- * 
+ *
  * <p>Some properties might be optional and can be <code>null</code>.
  */
-public class CpdRequest implements Serializable
-{
+public class CpdRequest implements Serializable {
     private static final long serialVersionUID = -7585852992660240668L;
 
     private String javaExecutable;
@@ -56,143 +54,115 @@
     private boolean includeXmlInSite;
     private String reportOutputDirectory;
 
-    public void setJavaExecutable( String javaExecutable )
-    {
+    public void setJavaExecutable(String javaExecutable) {
         this.javaExecutable = javaExecutable;
     }
 
-    public void setMinimumTokens( int minimumTokens )
-    {
+    public void setMinimumTokens(int minimumTokens) {
         this.minimumTokens = minimumTokens;
     }
 
-    public void setLanguage( String language )
-    {
+    public void setLanguage(String language) {
         this.language = language;
     }
 
-    public void setLanguageProperties( Properties languageProperties )
-    {
+    public void setLanguageProperties(Properties languageProperties) {
         this.languageProperties = languageProperties;
     }
 
-    public void setSourceEncoding( String sourceEncoding )
-    {
+    public void setSourceEncoding(String sourceEncoding) {
         this.sourceEncoding = sourceEncoding;
     }
 
-    public void addFiles( Collection<File> files )
-    {
-        this.files.addAll( files );
+    public void addFiles(Collection<File> files) {
+        this.files.addAll(files);
     }
 
-    public void setExcludeFromFailureFile( String excludeFromFailureFile )
-    {
+    public void setExcludeFromFailureFile(String excludeFromFailureFile) {
         this.excludeFromFailureFile = excludeFromFailureFile;
     }
 
-    public void setTargetDirectory( String targetDirectory )
-    {
+    public void setTargetDirectory(String targetDirectory) {
         this.targetDirectory = targetDirectory;
     }
 
-    public void setOutputEncoding( String outputEncoding )
-    {
+    public void setOutputEncoding(String outputEncoding) {
         this.outputEncoding = outputEncoding;
     }
 
-    public void setFormat( String format )
-    {
+    public void setFormat(String format) {
         this.format = format;
     }
 
-    public void setIncludeXmlInSite( boolean includeXmlInSite )
-    {
+    public void setIncludeXmlInSite(boolean includeXmlInSite) {
         this.includeXmlInSite = includeXmlInSite;
     }
 
-    public void setReportOutputDirectory( String reportOutputDirectory )
-    {
+    public void setReportOutputDirectory(String reportOutputDirectory) {
         this.reportOutputDirectory = reportOutputDirectory;
     }
 
-    public void setShowPmdLog( boolean showPmdLog )
-    {
+    public void setShowPmdLog(boolean showPmdLog) {
         this.showPmdLog = showPmdLog;
     }
 
-    public void setLogLevel( String logLevel )
-    {
+    public void setLogLevel(String logLevel) {
         this.logLevel = logLevel;
     }
 
-    public String getJavaExecutable()
-    {
+    public String getJavaExecutable() {
         return javaExecutable;
     }
 
-    public int getMinimumTokens()
-    {
+    public int getMinimumTokens() {
         return minimumTokens;
     }
 
-    public String getLanguage()
-    {
+    public String getLanguage() {
         return language;
     }
 
-    public Properties getLanguageProperties()
-    {
+    public Properties getLanguageProperties() {
         return languageProperties;
     }
 
-    public String getSourceEncoding()
-    {
+    public String getSourceEncoding() {
         return sourceEncoding;
     }
 
-    public List<File> getFiles()
-    {
+    public List<File> getFiles() {
         return files;
     }
 
-    public String getExcludeFromFailureFile()
-    {
+    public String getExcludeFromFailureFile() {
         return excludeFromFailureFile;
     }
 
-    public String getTargetDirectory()
-    {
+    public String getTargetDirectory() {
         return targetDirectory;
     }
 
-    public String getOutputEncoding()
-    {
+    public String getOutputEncoding() {
         return outputEncoding;
     }
 
-    public String getFormat()
-    {
+    public String getFormat() {
         return format;
     }
 
-    public boolean isIncludeXmlInSite()
-    {
+    public boolean isIncludeXmlInSite() {
         return includeXmlInSite;
     }
 
-    public String getReportOutputDirectory()
-    {
+    public String getReportOutputDirectory() {
         return reportOutputDirectory;
     }
 
-    public boolean isShowPmdLog()
-    {
+    public boolean isShowPmdLog() {
         return showPmdLog;
     }
 
-    public String getLogLevel()
-    {
+    public String getLogLevel() {
         return logLevel;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdResult.java b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdResult.java
index 6ea18ce..283d135 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdResult.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdResult.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -34,36 +33,28 @@
 /**
  * Provides access to the result of the CPD analysis.
  */
-public class CpdResult
-{
+public class CpdResult {
     private final List<Duplication> duplications = new ArrayList<>();
 
-    public CpdResult( File report, String encoding ) throws MavenReportException
-    {
-        loadResult( report, encoding );
+    public CpdResult(File report, String encoding) throws MavenReportException {
+        loadResult(report, encoding);
     }
 
-    public List<Duplication> getDuplications()
-    {
+    public List<Duplication> getDuplications() {
         return duplications;
     }
 
-    public boolean hasDuplications()
-    {
+    public boolean hasDuplications() {
         return !duplications.isEmpty();
     }
 
-    private void loadResult( File report, String encoding ) throws MavenReportException
-    {
-        try ( Reader reader1 = new InputStreamReader( new FileInputStream( report ), encoding ) )
-        {
+    private void loadResult(File report, String encoding) throws MavenReportException {
+        try (Reader reader1 = new InputStreamReader(new FileInputStream(report), encoding)) {
             CpdXpp3Reader reader = new CpdXpp3Reader();
-            CpdErrorDetail details = reader.read( reader1, false );
-            duplications.addAll( details.getDuplications() );
-        }
-        catch ( Exception e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+            CpdErrorDetail details = reader.read(reader1, false);
+            duplications.addAll(details.getDuplications());
+        } catch (Exception e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/Executor.java b/src/main/java/org/apache/maven/plugins/pmd/exec/Executor.java
index 3b3679c..d8f902c 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/Executor.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/Executor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -42,9 +41,8 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.bridge.SLF4JBridgeHandler;
 
-abstract class Executor
-{
-    private static final Logger LOG = LoggerFactory.getLogger( Executor.class );
+abstract class Executor {
+    private static final Logger LOG = LoggerFactory.getLogger(Executor.class);
 
     /**
      * This holds a strong reference in case we configured the logger to
@@ -53,137 +51,106 @@
      */
     private java.util.logging.Logger julLogger;
 
-    protected void setupPmdLogging( boolean showPmdLog, String logLevel )
-    {
-        if ( !showPmdLog )
-        {
+    protected void setupPmdLogging(boolean showPmdLog, String logLevel) {
+        if (!showPmdLog) {
             return;
         }
 
-        java.util.logging.Logger logger = java.util.logging.Logger.getLogger( "net.sourceforge.pmd" );
+        java.util.logging.Logger logger = java.util.logging.Logger.getLogger("net.sourceforge.pmd");
 
         boolean slf4jBridgeAlreadyAdded = false;
-        for ( Handler handler : logger.getHandlers() )
-        {
-            if ( handler instanceof SLF4JBridgeHandler )
-            {
+        for (Handler handler : logger.getHandlers()) {
+            if (handler instanceof SLF4JBridgeHandler) {
                 slf4jBridgeAlreadyAdded = true;
                 break;
             }
         }
 
-        if ( slf4jBridgeAlreadyAdded )
-        {
+        if (slf4jBridgeAlreadyAdded) {
             return;
         }
 
         SLF4JBridgeHandler handler = new SLF4JBridgeHandler();
         SimpleFormatter formatter = new SimpleFormatter();
-        handler.setFormatter( formatter );
-        logger.setUseParentHandlers( false );
-        logger.addHandler( handler );
-        handler.setLevel( Level.ALL );
-        logger.setLevel( Level.ALL );
+        handler.setFormatter(formatter);
+        logger.setUseParentHandlers(false);
+        logger.addHandler(handler);
+        handler.setLevel(Level.ALL);
+        logger.setLevel(Level.ALL);
         julLogger = logger;
-        julLogger.fine( "Configured jul-to-slf4j bridge for " + logger.getName() );
+        julLogger.fine("Configured jul-to-slf4j bridge for " + logger.getName());
     }
 
-    protected void setupLogLevel( String logLevel )
-    {
+    protected void setupLogLevel(String logLevel) {
         ILoggerFactory slf4jLoggerFactory = LoggerFactory.getILoggerFactory();
-        Slf4jConfiguration slf4jConfiguration = Slf4jConfigurationFactory
-                .getConfiguration( slf4jLoggerFactory );
-        if ( "debug".equals( logLevel ) )
-        {
-            slf4jConfiguration
-                    .setRootLoggerLevel( Slf4jConfiguration.Level.DEBUG );
-        }
-        else if ( "info".equals( logLevel ) )
-        {
-            slf4jConfiguration
-                    .setRootLoggerLevel( Slf4jConfiguration.Level.INFO );
-        }
-        else
-        {
-            slf4jConfiguration
-                    .setRootLoggerLevel( Slf4jConfiguration.Level.ERROR );
+        Slf4jConfiguration slf4jConfiguration = Slf4jConfigurationFactory.getConfiguration(slf4jLoggerFactory);
+        if ("debug".equals(logLevel)) {
+            slf4jConfiguration.setRootLoggerLevel(Slf4jConfiguration.Level.DEBUG);
+        } else if ("info".equals(logLevel)) {
+            slf4jConfiguration.setRootLoggerLevel(Slf4jConfiguration.Level.INFO);
+        } else {
+            slf4jConfiguration.setRootLoggerLevel(Slf4jConfiguration.Level.ERROR);
         }
         slf4jConfiguration.activate();
     }
 
-    protected static String buildClasspath()
-    {
+    protected static String buildClasspath() {
         StringBuilder classpath = new StringBuilder();
 
         // plugin classpath needs to come first
         ClassLoader pluginClassloader = Executor.class.getClassLoader();
-        buildClasspath( classpath, pluginClassloader );
+        buildClasspath(classpath, pluginClassloader);
 
         ClassLoader coreClassloader = ConsoleLogger.class.getClassLoader();
-        buildClasspath( classpath, coreClassloader );
+        buildClasspath(classpath, coreClassloader);
 
         return classpath.toString();
     }
 
-    static void buildClasspath( StringBuilder classpath, ClassLoader cl )
-    {
-        if ( cl instanceof URLClassLoader )
-        {
-            for ( URL url : ( (URLClassLoader) cl ).getURLs() )
-            {
-                if ( "file".equalsIgnoreCase( url.getProtocol() ) )
-                {
-                    try
-                    {
-                        String filename = URLDecoder.decode( url.getPath(), StandardCharsets.UTF_8.name() );
-                        classpath.append( new File( filename ).getPath() ).append( File.pathSeparatorChar );
-                    }
-                    catch ( UnsupportedEncodingException e )
-                    {
-                        LOG.warn( "Ignoring " + url + " in classpath due to UnsupportedEncodingException", e );
+    static void buildClasspath(StringBuilder classpath, ClassLoader cl) {
+        if (cl instanceof URLClassLoader) {
+            for (URL url : ((URLClassLoader) cl).getURLs()) {
+                if ("file".equalsIgnoreCase(url.getProtocol())) {
+                    try {
+                        String filename = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.name());
+                        classpath.append(new File(filename).getPath()).append(File.pathSeparatorChar);
+                    } catch (UnsupportedEncodingException e) {
+                        LOG.warn("Ignoring " + url + " in classpath due to UnsupportedEncodingException", e);
                     }
                 }
             }
         }
     }
 
-    protected static class ProcessStreamHandler implements Runnable
-    {
+    protected static class ProcessStreamHandler implements Runnable {
         private static final int BUFFER_SIZE = 8192;
 
         private final BufferedInputStream in;
         private final BufferedOutputStream out;
 
-        public static void start( InputStream in, OutputStream out )
-        {
-            Thread t = new Thread( new ProcessStreamHandler( in, out ) );
+        public static void start(InputStream in, OutputStream out) {
+            Thread t = new Thread(new ProcessStreamHandler(in, out));
             t.start();
         }
 
-        private ProcessStreamHandler( InputStream in, OutputStream out )
-        {
-            this.in = new BufferedInputStream( in );
-            this.out = new BufferedOutputStream( out );
+        private ProcessStreamHandler(InputStream in, OutputStream out) {
+            this.in = new BufferedInputStream(in);
+            this.out = new BufferedOutputStream(out);
         }
 
         @Override
-        public void run()
-        {
+        public void run() {
             byte[] buffer = new byte[BUFFER_SIZE];
-            try
-            {
-                int count = in.read( buffer );
-                while ( count != -1 )
-                {
-                    out.write( buffer, 0, count );
+            try {
+                int count = in.read(buffer);
+                while (count != -1) {
+                    out.write(buffer, 0, count);
                     out.flush();
-                    count = in.read( buffer );
+                    count = in.read(buffer);
                 }
                 out.flush();
-            }
-            catch ( IOException e )
-            {
-                LOG.error( e.getMessage(), e );
+            } catch (IOException e) {
+                LOG.error(e.getMessage(), e);
             }
         }
     }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdExecutor.java b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdExecutor.java
index cc25c80..8e96bf4 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdExecutor.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdExecutor.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.Closeable;
 import java.io.File;
@@ -32,15 +31,8 @@
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.pmd.ExcludeViolationsFromFile;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.plexus.util.FileUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.sourceforge.pmd.PmdAnalysis;
 import net.sourceforge.pmd.PMDConfiguration;
+import net.sourceforge.pmd.PmdAnalysis;
 import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.RulePriority;
 import net.sourceforge.pmd.RuleSetLoadException;
@@ -59,82 +51,71 @@
 import net.sourceforge.pmd.renderers.TextRenderer;
 import net.sourceforge.pmd.renderers.XMLRenderer;
 import net.sourceforge.pmd.util.Predicate;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.pmd.ExcludeViolationsFromFile;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Executes PMD with the configuration provided via {@link PmdRequest}.
  */
-public class PmdExecutor extends Executor
-{
-    private static final Logger LOG = LoggerFactory.getLogger( PmdExecutor.class );
+public class PmdExecutor extends Executor {
+    private static final Logger LOG = LoggerFactory.getLogger(PmdExecutor.class);
 
-    public static PmdResult execute( PmdRequest request ) throws MavenReportException
-    {
-        if ( request.getJavaExecutable() != null )
-        {
-            return fork( request );
+    public static PmdResult execute(PmdRequest request) throws MavenReportException {
+        if (request.getJavaExecutable() != null) {
+            return fork(request);
         }
 
         // make sure the class loaders are correct and call this in the same JVM
         ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
-        try
-        {
-            Thread.currentThread().setContextClassLoader( PmdExecutor.class.getClassLoader() );
-            PmdExecutor executor = new PmdExecutor( request );
+        try {
+            Thread.currentThread().setContextClassLoader(PmdExecutor.class.getClassLoader());
+            PmdExecutor executor = new PmdExecutor(request);
             return executor.run();
-        }
-        finally
-        {
-            Thread.currentThread().setContextClassLoader( origLoader );
+        } finally {
+            Thread.currentThread().setContextClassLoader(origLoader);
         }
     }
 
-    private static PmdResult fork( PmdRequest request )
-            throws MavenReportException
-    {
-        File basePmdDir = new File ( request.getTargetDirectory(), "pmd" );
+    private static PmdResult fork(PmdRequest request) throws MavenReportException {
+        File basePmdDir = new File(request.getTargetDirectory(), "pmd");
         basePmdDir.mkdirs();
-        File pmdRequestFile = new File( basePmdDir, "pmdrequest.bin" );
-        try ( ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( pmdRequestFile ) ) )
-        {
-            out.writeObject( request );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+        File pmdRequestFile = new File(basePmdDir, "pmdrequest.bin");
+        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(pmdRequestFile))) {
+            out.writeObject(request);
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
 
         String classpath = buildClasspath();
         ProcessBuilder pb = new ProcessBuilder();
         // note: using env variable instead of -cp cli arg to avoid length limitations under Windows
-        pb.environment().put( "CLASSPATH", classpath );
-        pb.command().add( request.getJavaExecutable() );
-        pb.command().add( PmdExecutor.class.getName() );
-        pb.command().add( pmdRequestFile.getAbsolutePath() );
+        pb.environment().put("CLASSPATH", classpath);
+        pb.command().add(request.getJavaExecutable());
+        pb.command().add(PmdExecutor.class.getName());
+        pb.command().add(pmdRequestFile.getAbsolutePath());
 
-        LOG.debug( "Executing: CLASSPATH={}, command={}", classpath, pb.command() );
-        try
-        {
+        LOG.debug("Executing: CLASSPATH={}, command={}", classpath, pb.command());
+        try {
             final Process p = pb.start();
             // Note: can't use pb.inheritIO(), since System.out/System.err has been modified after process start
             // and inheritIO would only inherit file handles, not the changed streams.
-            ProcessStreamHandler.start( p.getInputStream(), System.out );
-            ProcessStreamHandler.start( p.getErrorStream(), System.err );
+            ProcessStreamHandler.start(p.getInputStream(), System.out);
+            ProcessStreamHandler.start(p.getErrorStream(), System.err);
             int exit = p.waitFor();
-            LOG.debug( "PmdExecutor exit code: {}", exit );
-            if ( exit != 0 )
-            {
-                throw new MavenReportException( "PmdExecutor exited with exit code " + exit );
+            LOG.debug("PmdExecutor exit code: {}", exit);
+            if (exit != 0) {
+                throw new MavenReportException("PmdExecutor exited with exit code " + exit);
             }
-            return new PmdResult( new File( request.getTargetDirectory(), "pmd.xml" ), request.getOutputEncoding() );
-        }
-        catch ( IOException e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
-        }
-        catch ( InterruptedException e )
-        {
+            return new PmdResult(new File(request.getTargetDirectory(), "pmd.xml"), request.getOutputEncoding());
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
+        } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
-            throw new MavenReportException( e.getMessage(), e );
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 
@@ -149,162 +130,128 @@
      *
      * @param args
      */
-    public static void main( String[] args )
-    {
-        File requestFile = new File( args[0] );
-        try ( ObjectInputStream in = new ObjectInputStream( new FileInputStream( requestFile ) ) )
-        {
+    public static void main(String[] args) {
+        File requestFile = new File(args[0]);
+        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(requestFile))) {
             PmdRequest request = (PmdRequest) in.readObject();
-            PmdExecutor pmdExecutor = new PmdExecutor( request );
-            pmdExecutor.setupLogLevel( request.getLogLevel() );
+            PmdExecutor pmdExecutor = new PmdExecutor(request);
+            pmdExecutor.setupLogLevel(request.getLogLevel());
             pmdExecutor.run();
-            System.exit( 0 );
+            System.exit(0);
+        } catch (IOException | ClassNotFoundException | MavenReportException e) {
+            LOG.error(e.getMessage(), e);
         }
-        catch ( IOException | ClassNotFoundException | MavenReportException e )
-        {
-            LOG.error( e.getMessage(), e );
-        }
-        System.exit( 1 );
+        System.exit(1);
     }
 
     private final PmdRequest request;
 
-    public PmdExecutor( PmdRequest request )
-    {
-        this.request = Objects.requireNonNull( request );
+    public PmdExecutor(PmdRequest request) {
+        this.request = Objects.requireNonNull(request);
     }
 
-    private PmdResult run() throws MavenReportException
-    {
-        setupPmdLogging( request.isShowPmdLog(), request.getLogLevel() );
+    private PmdResult run() throws MavenReportException {
+        setupPmdLogging(request.isShowPmdLog(), request.getLogLevel());
 
         PMDConfiguration configuration = new PMDConfiguration();
         LanguageVersion languageVersion = null;
-        Language language = LanguageRegistry
-                .findLanguageByTerseName( request.getLanguage() != null ? request.getLanguage() : "java" );
-        if ( language == null )
-        {
-            throw new MavenReportException( "Unsupported language: " + request.getLanguage() );
+        Language language = LanguageRegistry.findLanguageByTerseName(
+                request.getLanguage() != null ? request.getLanguage() : "java");
+        if (language == null) {
+            throw new MavenReportException("Unsupported language: " + request.getLanguage());
         }
-        if ( request.getLanguageVersion() != null )
-        {
-            languageVersion = language.getVersion( request.getLanguageVersion() );
-            if ( languageVersion == null )
-            {
-                throw new MavenReportException( "Unsupported targetJdk value '" + request.getLanguageVersion() + "'." );
+        if (request.getLanguageVersion() != null) {
+            languageVersion = language.getVersion(request.getLanguageVersion());
+            if (languageVersion == null) {
+                throw new MavenReportException("Unsupported targetJdk value '" + request.getLanguageVersion() + "'.");
             }
-        }
-        else
-        {
+        } else {
             languageVersion = language.getDefaultVersion();
         }
-        LOG.debug( "Using language " + languageVersion );
-        configuration.setDefaultLanguageVersion( languageVersion );
+        LOG.debug("Using language " + languageVersion);
+        configuration.setDefaultLanguageVersion(languageVersion);
 
-        if ( request.getSourceEncoding() != null )
-        {
-            configuration.setSourceEncoding( request.getSourceEncoding() );
+        if (request.getSourceEncoding() != null) {
+            configuration.setSourceEncoding(request.getSourceEncoding());
         }
 
-        configuration.prependAuxClasspath( request.getAuxClasspath() );
+        configuration.prependAuxClasspath(request.getAuxClasspath());
 
-        if ( request.getSuppressMarker() != null )
-        {
-            configuration.setSuppressMarker( request.getSuppressMarker() );
+        if (request.getSuppressMarker() != null) {
+            configuration.setSuppressMarker(request.getSuppressMarker());
         }
-        if ( request.getAnalysisCacheLocation() != null )
-        {
-            configuration.setAnalysisCacheLocation( request.getAnalysisCacheLocation() );
-            LOG.debug( "Using analysis cache location: " + request.getAnalysisCacheLocation() );
-        }
-        else
-        {
-            configuration.setIgnoreIncrementalAnalysis( true );
+        if (request.getAnalysisCacheLocation() != null) {
+            configuration.setAnalysisCacheLocation(request.getAnalysisCacheLocation());
+            LOG.debug("Using analysis cache location: " + request.getAnalysisCacheLocation());
+        } else {
+            configuration.setIgnoreIncrementalAnalysis(true);
         }
 
-        configuration.setRuleSets( request.getRulesets() );
-        configuration.setMinimumPriority( RulePriority.valueOf( request.getMinimumPriority() ) );
-        if ( request.getBenchmarkOutputLocation() != null )
-        {
-            configuration.setBenchmark( true );
+        configuration.setRuleSets(request.getRulesets());
+        configuration.setMinimumPriority(RulePriority.valueOf(request.getMinimumPriority()));
+        if (request.getBenchmarkOutputLocation() != null) {
+            configuration.setBenchmark(true);
         }
         List<File> files = request.getFiles();
 
         Report report = null;
 
-        if ( request.getRulesets().isEmpty() )
-        {
-            LOG.debug( "Skipping PMD execution as no rulesets are defined." );
-        }
-        else
-        {
-            if ( request.getBenchmarkOutputLocation() != null )
-            {
+        if (request.getRulesets().isEmpty()) {
+            LOG.debug("Skipping PMD execution as no rulesets are defined.");
+        } else {
+            if (request.getBenchmarkOutputLocation() != null) {
                 TimeTracker.startGlobalTracking();
             }
 
-            try
-            {
-                report = processFilesWithPMD( configuration, files );
-            }
-            finally
-            {
-                if ( request.getAuxClasspath() != null )
-                {
+            try {
+                report = processFilesWithPMD(configuration, files);
+            } finally {
+                if (request.getAuxClasspath() != null) {
                     ClassLoader classLoader = configuration.getClassLoader();
-                    if ( classLoader instanceof Closeable )
-                    {
+                    if (classLoader instanceof Closeable) {
                         Closeable closeable = (Closeable) classLoader;
-                        try
-                        {
+                        try {
                             closeable.close();
-                        }
-                        catch ( IOException ex )
-                        {
+                        } catch (IOException ex) {
                             // ignore
                         }
                     }
                 }
-                if ( request.getBenchmarkOutputLocation() != null )
-                {
+                if (request.getBenchmarkOutputLocation() != null) {
                     TimingReport timingReport = TimeTracker.stopGlobalTracking();
-                    writeBenchmarkReport( timingReport, request.getBenchmarkOutputLocation(),
-                            request.getOutputEncoding() );
+                    writeBenchmarkReport(
+                            timingReport, request.getBenchmarkOutputLocation(), request.getOutputEncoding());
                 }
             }
         }
 
-        if ( report != null && !report.getProcessingErrors().isEmpty() )
-        {
+        if (report != null && !report.getProcessingErrors().isEmpty()) {
             List<Report.ProcessingError> errors = report.getProcessingErrors();
-            if ( !request.isSkipPmdError() )
-            {
-                LOG.error( "PMD processing errors:" );
-                LOG.error( getErrorsAsString( errors, request.isDebugEnabled() ) );
-                throw new MavenReportException( "Found " + errors.size()
-                        + " PMD processing errors" );
+            if (!request.isSkipPmdError()) {
+                LOG.error("PMD processing errors:");
+                LOG.error(getErrorsAsString(errors, request.isDebugEnabled()));
+                throw new MavenReportException("Found " + errors.size() + " PMD processing errors");
             }
-            LOG.warn( "There are {} PMD processing errors:", errors.size() );
-            LOG.warn( getErrorsAsString( errors, request.isDebugEnabled() ) );
+            LOG.warn("There are {} PMD processing errors:", errors.size());
+            LOG.warn(getErrorsAsString(errors, request.isDebugEnabled()));
         }
 
-        report = removeExcludedViolations( report );
+        report = removeExcludedViolations(report);
         // always write XML report, as this might be needed by the check mojo
         // 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
-        writeXmlReport( report );
+        writeXmlReport(report);
 
         // write any other format except for xml and html. xml has just been produced.
         // html format is produced by the maven site formatter. Excluding html here
         // avoids using PMD's own html formatter, which doesn't fit into the maven site
         // considering the html/css styling
         String format = request.getFormat();
-        if ( !"html".equals( format ) && !"xml".equals( format ) )
-        {
-            writeFormattedReport( report );
+        if (!"html".equals(format) && !"xml".equals(format)) {
+            writeFormattedReport(report);
         }
 
-        return new PmdResult( new File( request.getTargetDirectory(), "pmd.xml" ), request.getOutputEncoding() );
+        return new PmdResult(new File(request.getTargetDirectory(), "pmd.xml"), request.getOutputEncoding());
     }
 
     /**
@@ -312,68 +259,52 @@
      * @param withDetails if <code>true</code> then add the error details additionally (contains e.g. the stacktrace)
      * @return the errors as string
      */
-    private String getErrorsAsString( List<Report.ProcessingError> errors, boolean withDetails )
-    {
-        List<String> errorsAsString = new ArrayList<>( errors.size() );
-        for ( Report.ProcessingError error : errors )
-        {
-            errorsAsString.add( error.getFile() + ": " + error.getMsg() );
-            if ( withDetails )
-            {
-                errorsAsString.add( error.getDetail() );
+    private String getErrorsAsString(List<Report.ProcessingError> errors, boolean withDetails) {
+        List<String> errorsAsString = new ArrayList<>(errors.size());
+        for (Report.ProcessingError error : errors) {
+            errorsAsString.add(error.getFile() + ": " + error.getMsg());
+            if (withDetails) {
+                errorsAsString.add(error.getDetail());
             }
         }
-        return String.join( System.lineSeparator(), errorsAsString );
+        return String.join(System.lineSeparator(), errorsAsString);
     }
 
-    private void writeBenchmarkReport( TimingReport timingReport, String benchmarkOutputLocation, String encoding )
-    {
-        try ( Writer writer = new OutputStreamWriter( new FileOutputStream( benchmarkOutputLocation ), encoding ) )
-        {
+    private void writeBenchmarkReport(TimingReport timingReport, String benchmarkOutputLocation, String encoding) {
+        try (Writer writer = new OutputStreamWriter(new FileOutputStream(benchmarkOutputLocation), encoding)) {
             final TimingReportRenderer renderer = new TextTimingReportRenderer();
-            renderer.render( timingReport, writer );
-        }
-        catch ( IOException e )
-        {
-            LOG.error( "Unable to generate benchmark file: {}", benchmarkOutputLocation, e );
+            renderer.render(timingReport, writer);
+        } catch (IOException e) {
+            LOG.error("Unable to generate benchmark file: {}", benchmarkOutputLocation, e);
         }
     }
 
-    private Report processFilesWithPMD( PMDConfiguration pmdConfiguration, List<File> files )
-            throws MavenReportException
-    {
+    private Report processFilesWithPMD(PMDConfiguration pmdConfiguration, List<File> files)
+            throws MavenReportException {
         Report report = null;
-        RuleSetLoader rulesetLoader = RuleSetLoader.fromPmdConfig( pmdConfiguration )
-                .warnDeprecated( true );
-        try
-        {
+        RuleSetLoader rulesetLoader =
+                RuleSetLoader.fromPmdConfig(pmdConfiguration).warnDeprecated(true);
+        try {
             // load the ruleset once to log out any deprecated rules as warnings
-            rulesetLoader.loadFromResources( pmdConfiguration.getRuleSetPaths() );
-        }
-        catch ( RuleSetLoadException e1 )
-        {
-            throw new MavenReportException( "The ruleset could not be loaded", e1 );
+            rulesetLoader.loadFromResources(pmdConfiguration.getRuleSetPaths());
+        } catch (RuleSetLoadException e1) {
+            throw new MavenReportException("The ruleset could not be loaded", e1);
         }
 
-        try ( PmdAnalysis pmdAnalysis = PmdAnalysis.create( pmdConfiguration ) )
-        {
-            for ( File file : files )
-            {
-                pmdAnalysis.files().addFile( file.toPath() );
+        try (PmdAnalysis pmdAnalysis = PmdAnalysis.create(pmdConfiguration)) {
+            for (File file : files) {
+                pmdAnalysis.files().addFile(file.toPath());
             }
-            LOG.debug( "Executing PMD..." );
+            LOG.debug("Executing PMD...");
             report = pmdAnalysis.performAnalysisAndCollectReport();
-            LOG.debug( "PMD finished. Found {} violations.", report.getViolations().size() );
-        }
-        catch ( Exception e )
-        {
+            LOG.debug(
+                    "PMD finished. Found {} violations.", report.getViolations().size());
+        } catch (Exception e) {
             String message = "Failure executing PMD: " + e.getLocalizedMessage();
-            if ( !request.isSkipPmdError() )
-            {
-                throw new MavenReportException( message, e );
+            if (!request.isSkipPmdError()) {
+                throw new MavenReportException(message, e);
             }
-            LOG.warn( message, e );
-
+            LOG.warn(message, e);
         }
         return report;
     }
@@ -385,51 +316,39 @@
      * @param report
      * @throws MavenReportException
      */
-    private void writeXmlReport( Report report ) throws MavenReportException
-    {
-        File targetFile = writeReport( report, new XMLRenderer( request.getOutputEncoding() ) );
-        if ( request.isIncludeXmlInSite() )
-        {
-            File siteDir = new File( request.getReportOutputDirectory() );
+    private void writeXmlReport(Report report) throws MavenReportException {
+        File targetFile = writeReport(report, new XMLRenderer(request.getOutputEncoding()));
+        if (request.isIncludeXmlInSite()) {
+            File siteDir = new File(request.getReportOutputDirectory());
             siteDir.mkdirs();
-            try
-            {
-                FileUtils.copyFile( targetFile, new File( siteDir, "pmd.xml" ) );
-            }
-            catch ( IOException e )
-            {
-                throw new MavenReportException( e.getMessage(), e );
+            try {
+                FileUtils.copyFile(targetFile, new File(siteDir, "pmd.xml"));
+            } catch (IOException e) {
+                throw new MavenReportException(e.getMessage(), e);
             }
         }
     }
 
-    private File writeReport( Report report, Renderer r ) throws MavenReportException
-    {
-        if ( r == null )
-        {
+    private File writeReport(Report report, Renderer r) throws MavenReportException {
+        if (r == null) {
             return null;
         }
 
-        File targetDir = new File( request.getTargetDirectory() );
+        File targetDir = new File(request.getTargetDirectory());
         targetDir.mkdirs();
         String extension = r.defaultFileExtension();
-        File targetFile = new File( targetDir, "pmd." + extension );
-        LOG.debug( "Target PMD output file: {}", targetFile  );
-        try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ),
-                request.getOutputEncoding() ) )
-        {
-            r.setWriter( writer );
+        File targetFile = new File(targetDir, "pmd." + extension);
+        LOG.debug("Target PMD output file: {}", targetFile);
+        try (Writer writer = new OutputStreamWriter(new FileOutputStream(targetFile), request.getOutputEncoding())) {
+            r.setWriter(writer);
             r.start();
-            if ( report != null )
-            {
-                r.renderFileReport( report );
+            if (report != null) {
+                r.renderFileReport(report);
             }
             r.end();
             r.flush();
-        }
-        catch ( IOException ioe )
-        {
-            throw new MavenReportException( ioe.getMessage(), ioe );
+        } catch (IOException ioe) {
+            throw new MavenReportException(ioe.getMessage(), ioe);
         }
 
         return targetFile;
@@ -441,11 +360,9 @@
      * @param report
      * @throws MavenReportException
      */
-    private void writeFormattedReport( Report report )
-            throws MavenReportException
-    {
-        Renderer renderer = createRenderer( request.getFormat(), request.getOutputEncoding() );
-        writeReport( report, renderer );
+    private void writeFormattedReport(Report report) throws MavenReportException {
+        Renderer renderer = createRenderer(request.getFormat(), request.getOutputEncoding());
+        writeReport(report, renderer);
     }
 
     /**
@@ -455,76 +372,57 @@
      * @throws org.apache.maven.reporting.MavenReportException
      *             if no renderer found for the output type
      */
-    public static Renderer createRenderer( String format, String outputEncoding ) throws MavenReportException
-    {
-        LOG.debug( "Renderer requested: {}", format );
+    public static Renderer createRenderer(String format, String outputEncoding) throws MavenReportException {
+        LOG.debug("Renderer requested: {}", format);
         Renderer result = null;
-        if ( "xml".equals( format ) )
-        {
-            result = new XMLRenderer( outputEncoding );
-        }
-        else if ( "txt".equals( format ) )
-        {
+        if ("xml".equals(format)) {
+            result = new XMLRenderer(outputEncoding);
+        } else if ("txt".equals(format)) {
             result = new TextRenderer();
-        }
-        else if ( "csv".equals( format ) )
-        {
+        } else if ("csv".equals(format)) {
             result = new CSVRenderer();
-        }
-        else if ( "html".equals( format ) )
-        {
+        } else if ("html".equals(format)) {
             result = new HTMLRenderer();
-        }
-        else if ( !"".equals( format ) && !"none".equals( format ) )
-        {
-            try
-            {
-                result = (Renderer) Class.forName( format ).getConstructor().newInstance();
-            }
-            catch ( Exception e )
-            {
+        } else if (!"".equals(format) && !"none".equals(format)) {
+            try {
+                result = (Renderer) Class.forName(format).getConstructor().newInstance();
+            } catch (Exception e) {
                 throw new MavenReportException(
-                        "Can't find PMD custom format " + format + ": " + e.getClass().getName(), e );
+                        "Can't find PMD custom format " + format + ": "
+                                + e.getClass().getName(),
+                        e);
             }
         }
 
         return result;
     }
 
-    private Report removeExcludedViolations( Report report )
-            throws MavenReportException
-    {
-        if ( report == null )
-        {
+    private Report removeExcludedViolations(Report report) throws MavenReportException {
+        if (report == null) {
             return null;
         }
 
         ExcludeViolationsFromFile excludeFromFile = new ExcludeViolationsFromFile();
 
-        try
-        {
-            excludeFromFile.loadExcludeFromFailuresData( request.getExcludeFromFailureFile() );
-        }
-        catch ( MojoExecutionException e )
-        {
-            throw new MavenReportException( "Unable to load exclusions", e );
+        try {
+            excludeFromFile.loadExcludeFromFailuresData(request.getExcludeFromFailureFile());
+        } catch (MojoExecutionException e) {
+            throw new MavenReportException("Unable to load exclusions", e);
         }
 
-        LOG.debug( "Removing excluded violations. Using {} configured exclusions.",
-                excludeFromFile.countExclusions() );
+        LOG.debug("Removing excluded violations. Using {} configured exclusions.", excludeFromFile.countExclusions());
         int violationsBefore = report.getViolations().size();
 
-        Report filtered = report.filterViolations( new Predicate<RuleViolation>()
-        {
+        Report filtered = report.filterViolations(new Predicate<RuleViolation>() {
             @Override
-            public boolean test( RuleViolation ruleViolation )
-            {
-                return !excludeFromFile.isExcludedFromFailure( ruleViolation );
+            public boolean test(RuleViolation ruleViolation) {
+                return !excludeFromFile.isExcludedFromFailure(ruleViolation);
             }
-        } );
+        });
 
-        int numberOfExcludedViolations = violationsBefore - filtered.getViolations().size();
-        LOG.debug( "Excluded {} violations.", numberOfExcludedViolations );
+        int numberOfExcludedViolations =
+                violationsBefore - filtered.getViolations().size();
+        LOG.debug("Excluded {} violations.", numberOfExcludedViolations);
         return filtered;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdRequest.java b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdRequest.java
index 0c3a5e9..d1a8099 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdRequest.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdRequest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.io.Serializable;
@@ -28,13 +27,12 @@
 /**
  * Data object to store all configuration options needed to execute PMD
  * as a separate process.
- * 
+ *
  * <p>This class is intended to be serialized and read back.
- * 
+ *
  * <p>Some properties might be optional and can be <code>null</code>.
  */
-public class PmdRequest implements Serializable
-{
+public class PmdRequest implements Serializable {
     private static final long serialVersionUID = -6324416880563476455L;
 
     private String javaExecutable;
@@ -67,223 +65,172 @@
      * @param language the language
      * @param targetJdk the language version, optional, can be <code>null</code>
      */
-    public void setLanguageAndVersion( String language, String targetJdk )
-    {
-        if ( "java".equals( language ) || null == language )
-        {
+    public void setLanguageAndVersion(String language, String targetJdk) {
+        if ("java".equals(language) || null == language) {
             this.language = "java";
             this.languageVersion = targetJdk;
-        }
-        else if ( "javascript".equals( language ) || "ecmascript".equals( language ) )
-        {
+        } else if ("javascript".equals(language) || "ecmascript".equals(language)) {
             this.language = "ecmascript";
-        }
-        else if ( "jsp".equals( language ) )
-        {
+        } else if ("jsp".equals(language)) {
             this.language = "jsp";
-        }
-        else
-        {
+        } else {
             this.language = language;
         }
     }
 
-    public void setJavaExecutable( String javaExecutable )
-    {
+    public void setJavaExecutable(String javaExecutable) {
         this.javaExecutable = javaExecutable;
     }
 
-    public void setMinimumPriority( int minimumPriority )
-    {
+    public void setMinimumPriority(int minimumPriority) {
         this.minimumPriority = minimumPriority;
     }
 
-    public void setAuxClasspath( String auxClasspath )
-    {
+    public void setAuxClasspath(String auxClasspath) {
         this.auxClasspath = auxClasspath;
     }
 
-    public void setSuppressMarker( String suppressMarker )
-    {
+    public void setSuppressMarker(String suppressMarker) {
         this.suppressMarker = suppressMarker;
     }
 
-    public void setAnalysisCacheLocation( String analysisCacheLocation )
-    {
+    public void setAnalysisCacheLocation(String analysisCacheLocation) {
         this.analysisCacheLocation = analysisCacheLocation;
     }
 
-    public void setRulesets( List<String> rulesets )
-    {
+    public void setRulesets(List<String> rulesets) {
         this.rulesets = rulesets;
     }
 
-    public void setSourceEncoding( String sourceEncoding )
-    {
+    public void setSourceEncoding(String sourceEncoding) {
         this.sourceEncoding = sourceEncoding;
     }
 
-    public void addFiles( Collection<File> files )
-    {
-        this.files.addAll( files );
+    public void addFiles(Collection<File> files) {
+        this.files.addAll(files);
     }
 
-    public void setBenchmarkOutputLocation( String benchmarkOutputLocation )
-    {
+    public void setBenchmarkOutputLocation(String benchmarkOutputLocation) {
         this.benchmarkOutputLocation = benchmarkOutputLocation;
     }
 
-    public void setTargetDirectory( String targetDirectory )
-    {
+    public void setTargetDirectory(String targetDirectory) {
         this.targetDirectory = targetDirectory;
     }
 
-    public void setOutputEncoding( String outputEncoding )
-    {
+    public void setOutputEncoding(String outputEncoding) {
         this.outputEncoding = outputEncoding;
     }
 
-    public void setFormat( String format )
-    {
+    public void setFormat(String format) {
         this.format = format;
     }
 
-    public void setShowPmdLog( boolean showPmdLog )
-    {
+    public void setShowPmdLog(boolean showPmdLog) {
         this.showPmdLog = showPmdLog;
     }
 
-    public void setLogLevel( String logLevel )
-    {
+    public void setLogLevel(String logLevel) {
         this.logLevel = logLevel;
     }
 
-    public void setSkipPmdError( boolean skipPmdError )
-    {
+    public void setSkipPmdError(boolean skipPmdError) {
         this.skipPmdError = skipPmdError;
     }
 
-    public void setIncludeXmlInSite( boolean includeXmlInSite )
-    {
+    public void setIncludeXmlInSite(boolean includeXmlInSite) {
         this.includeXmlInSite = includeXmlInSite;
     }
 
-    public void setReportOutputDirectory( String reportOutputDirectory )
-    {
+    public void setReportOutputDirectory(String reportOutputDirectory) {
         this.reportOutputDirectory = reportOutputDirectory;
     }
 
-    public void setExcludeFromFailureFile( String excludeFromFailureFile )
-    {
+    public void setExcludeFromFailureFile(String excludeFromFailureFile) {
         this.excludeFromFailureFile = excludeFromFailureFile;
     }
 
-
-
-
-
-    public String getJavaExecutable()
-    {
+    public String getJavaExecutable() {
         return javaExecutable;
     }
 
-    public String getLanguage()
-    {
+    public String getLanguage() {
         return language;
     }
 
-    public String getLanguageVersion()
-    {
+    public String getLanguageVersion() {
         return languageVersion;
     }
 
-    public int getMinimumPriority()
-    {
+    public int getMinimumPriority() {
         return minimumPriority;
     }
 
-    public String getAuxClasspath()
-    {
+    public String getAuxClasspath() {
         return auxClasspath;
     }
 
-    public String getSuppressMarker()
-    {
+    public String getSuppressMarker() {
         return suppressMarker;
     }
 
-    public String getAnalysisCacheLocation()
-    {
+    public String getAnalysisCacheLocation() {
         return analysisCacheLocation;
     }
 
-    public List<String> getRulesets()
-    {
+    public List<String> getRulesets() {
         return rulesets;
     }
 
-    public String getSourceEncoding()
-    {
+    public String getSourceEncoding() {
         return sourceEncoding;
     }
 
-    public List<File> getFiles()
-    {
+    public List<File> getFiles() {
         return files;
     }
 
-    public String getBenchmarkOutputLocation()
-    {
+    public String getBenchmarkOutputLocation() {
         return benchmarkOutputLocation;
     }
 
-    public String getTargetDirectory()
-    {
+    public String getTargetDirectory() {
         return targetDirectory;
     }
 
-    public String getOutputEncoding()
-    {
+    public String getOutputEncoding() {
         return outputEncoding;
     }
 
-    public String getFormat()
-    {
+    public String getFormat() {
         return format;
     }
 
-    public boolean isShowPmdLog()
-    {
+    public boolean isShowPmdLog() {
         return showPmdLog;
     }
 
-    public String getLogLevel()
-    {
+    public String getLogLevel() {
         return logLevel;
     }
 
-    public boolean isDebugEnabled()
-    {
-        return "debug".equals( logLevel );
+    public boolean isDebugEnabled() {
+        return "debug".equals(logLevel);
     }
 
-    public boolean isSkipPmdError()
-    {
+    public boolean isSkipPmdError() {
         return skipPmdError;
     }
 
-    public boolean isIncludeXmlInSite()
-    {
+    public boolean isIncludeXmlInSite() {
         return includeXmlInSite;
     }
 
-    public String getReportOutputDirectory()
-    {
+    public String getReportOutputDirectory() {
         return reportOutputDirectory;
     }
 
-    public String getExcludeFromFailureFile()
-    {
+    public String getExcludeFromFailureFile() {
         return excludeFromFailureFile;
     }
 }
diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdResult.java b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdResult.java
index 667b849..15cbe58 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/PmdResult.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/PmdResult.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -40,103 +39,81 @@
 /**
  * Provides access to the result of the pmd analysis.
  */
-public class PmdResult
-{
+public class PmdResult {
     private final List<ProcessingError> processingErrors = new ArrayList<>();
     private final List<Violation> violations = new ArrayList<>();
     private final List<SuppressedViolation> suppressedViolations = new ArrayList<>();
 
     public static final PmdResult EMPTY = new PmdResult();
 
-    private PmdResult()
-    {
+    private PmdResult() {}
+
+    public PmdResult(File pmdFile, String encoding) throws MavenReportException {
+        loadResult(pmdFile, encoding);
     }
 
-    public PmdResult( File pmdFile, String encoding ) throws MavenReportException
-    {
-        loadResult( pmdFile, encoding );
-    }
-
-    public boolean hasViolations()
-    {
+    public boolean hasViolations() {
         return !violations.isEmpty();
     }
 
-    private void loadResult( File pmdFile, String encoding ) throws MavenReportException
-    {
-        try ( Reader reader1 = new BomFilter( encoding, new InputStreamReader(
-                new FileInputStream( pmdFile ), encoding ) ) )
-        {
+    private void loadResult(File pmdFile, String encoding) throws MavenReportException {
+        try (Reader reader1 = new BomFilter(encoding, new InputStreamReader(new FileInputStream(pmdFile), encoding))) {
             PmdXpp3Reader reader = new PmdXpp3Reader();
-            PmdErrorDetail details = reader.read( reader1, false );
-            processingErrors.addAll( details.getErrors() );
-            suppressedViolations.addAll( details.getSuppressedViolations() );
+            PmdErrorDetail details = reader.read(reader1, false);
+            processingErrors.addAll(details.getErrors());
+            suppressedViolations.addAll(details.getSuppressedViolations());
 
-            for ( PmdFile file : details.getFiles() )
-            {
+            for (PmdFile file : details.getFiles()) {
                 String filename = file.getName();
-                for ( Violation violation : file.getViolations() )
-                {
-                    violation.setFileName( filename );
-                    violations.add( violation );
+                for (Violation violation : file.getViolations()) {
+                    violation.setFileName(filename);
+                    violations.add(violation);
                 }
             }
-        }
-        catch ( Exception e )
-        {
-            throw new MavenReportException( e.getMessage(), e );
+        } catch (Exception e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
     }
 
     // Note: This seems to be a bug in PMD's XMLRenderer. The BOM is rendered multiple times.
     // once at the beginning of the file, which is Ok, but also in the middle of the file.
     // This filter just skips all BOMs if the encoding is not UTF-8
-    private static class BomFilter extends FilterReader
-    {
+    private static class BomFilter extends FilterReader {
         private static final char BOM = '\uFEFF';
         private final boolean filter;
 
-        BomFilter( String encoding, Reader in )
-        {
-            super( in );
-            filter = !"UTF-8".equalsIgnoreCase( encoding );
+        BomFilter(String encoding, Reader in) {
+            super(in);
+            filter = !"UTF-8".equalsIgnoreCase(encoding);
         }
 
         @Override
-        public int read() throws IOException
-        {
+        public int read() throws IOException {
             int c = super.read();
 
-            if ( !filter )
-            {
+            if (!filter) {
                 return c;
             }
 
-            while ( c != -1 && c == BOM )
-            {
+            while (c != -1 && c == BOM) {
                 c = super.read();
             }
             return c;
         }
 
         @Override
-        public int read( char[] cbuf, int off, int len ) throws IOException
-        {
-            int count = super.read( cbuf, off, len );
+        public int read(char[] cbuf, int off, int len) throws IOException {
+            int count = super.read(cbuf, off, len);
 
-            if ( !filter )
-            {
+            if (!filter) {
                 return count;
             }
 
-            if ( count != -1 )
-            {
-                for ( int i = off; i < off + count; i++ )
-                {
-                    if ( cbuf[i] == BOM )
-                    {
+            if (count != -1) {
+                for (int i = off; i < off + count; i++) {
+                    if (cbuf[i] == BOM) {
                         // shift the content one char to the left
-                        System.arraycopy( cbuf, i + 1, cbuf, i, off + count - 1 - i );
+                        System.arraycopy(cbuf, i + 1, cbuf, i, off + count - 1 - i);
                         count--;
                     }
                 }
@@ -145,18 +122,15 @@
         }
     }
 
-    public Collection<Violation> getViolations()
-    {
+    public Collection<Violation> getViolations() {
         return violations;
     }
 
-    public Collection<SuppressedViolation> getSuppressedViolations()
-    {
+    public Collection<SuppressedViolation> getSuppressedViolations() {
         return suppressedViolations;
     }
 
-    public Collection<ProcessingError> getErrors()
-    {
+    public Collection<ProcessingError> getErrors() {
         return processingErrors;
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/AbstractPmdReportTestCase.java b/src/test/java/org/apache/maven/plugins/pmd/AbstractPmdReportTestCase.java
index f0d5524..fce2159 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/AbstractPmdReportTestCase.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/AbstractPmdReportTestCase.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -41,9 +40,7 @@
  * @version $Id$
  * @since 2.5
  */
-public abstract class AbstractPmdReportTestCase
-    extends AbstractMojoTestCase
-{
+public abstract class AbstractPmdReportTestCase extends AbstractMojoTestCase {
     private ArtifactStubFactory artifactStubFactory;
 
     /**
@@ -52,13 +49,11 @@
     private MavenProject testMavenProject;
 
     @Override
-    protected void setUp()
-        throws Exception
-    {
+    protected void setUp() throws Exception {
         super.setUp();
-        CapturingPrintStream.init( true );
+        CapturingPrintStream.init(true);
 
-        artifactStubFactory = new DependencyArtifactStubFactory( getTestFile( "target" ), true, false );
+        artifactStubFactory = new DependencyArtifactStubFactory(getTestFile("target"), true, false);
         artifactStubFactory.getWorkingDir().mkdirs();
     }
 
@@ -67,8 +62,7 @@
      *
      * @return the maven project
      */
-    protected MavenProject getTestMavenProject()
-    {
+    protected MavenProject getTestMavenProject() {
         return testMavenProject;
     }
 
@@ -79,15 +73,13 @@
      * @return the generated report as file
      * @throws IOException if the return file doesnt exist
      */
-    protected File getGeneratedReport( String name )
-        throws IOException
-    {
-        String outputDirectory = getBasedir() + "/target/test/unit/" + getTestMavenProject().getArtifactId();
+    protected File getGeneratedReport(String name) throws IOException {
+        String outputDirectory =
+                getBasedir() + "/target/test/unit/" + getTestMavenProject().getArtifactId();
 
-        File report = new File( outputDirectory, name );
-        if ( !report.exists() )
-        {
-            throw new IOException( "File not found. Attempted: " + report );
+        File report = new File(outputDirectory, name);
+        if (!report.exists()) {
+            throw new IOException("File not found. Attempted: " + report);
         }
 
         return report;
@@ -101,58 +93,51 @@
      * @return the generated HTML file
      * @throws Exception if any
      */
-    protected File generateReport( String goal, String pluginXml )
-        throws Exception
-    {
-        File pluginXmlFile = new File( getBasedir(), "src/test/resources/unit/" + pluginXml );
-        AbstractPmdReport mojo  = createReportMojo( goal, pluginXmlFile );
-        return generateReport( mojo, pluginXmlFile );
+    protected File generateReport(String goal, String pluginXml) throws Exception {
+        File pluginXmlFile = new File(getBasedir(), "src/test/resources/unit/" + pluginXml);
+        AbstractPmdReport mojo = createReportMojo(goal, pluginXmlFile);
+        return generateReport(mojo, pluginXmlFile);
     }
 
-    protected AbstractPmdReport createReportMojo( String goal, File pluginXmlFile )
-        throws Exception
-    {
-        AbstractPmdReport mojo = (AbstractPmdReport) lookupMojo( goal, pluginXmlFile );
-        assertNotNull( "Mojo not found.", mojo );
+    protected AbstractPmdReport createReportMojo(String goal, File pluginXmlFile) throws Exception {
+        AbstractPmdReport mojo = (AbstractPmdReport) lookupMojo(goal, pluginXmlFile);
+        assertNotNull("Mojo not found.", mojo);
 
-        LegacySupport legacySupport = lookup( LegacySupport.class );
-        legacySupport.setSession( newMavenSession( new MavenProjectStub() ) );
+        LegacySupport legacySupport = lookup(LegacySupport.class);
+        legacySupport.setSession(newMavenSession(new MavenProjectStub()));
         DefaultRepositorySystemSession repoSession =
-            (DefaultRepositorySystemSession) legacySupport.getRepositorySession();
-        repoSession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repoSession, new LocalRepository( artifactStubFactory.getWorkingDir() ) ) );
+                (DefaultRepositorySystemSession) legacySupport.getRepositorySession();
+        repoSession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
+                .newInstance(repoSession, new LocalRepository(artifactStubFactory.getWorkingDir())));
 
-        setVariableValueToObject( mojo, "session", legacySupport.getSession() );
-        setVariableValueToObject( mojo, "remoteRepositories", mojo.getProject().getRemoteArtifactRepositories() );
+        setVariableValueToObject(mojo, "session", legacySupport.getSession());
+        setVariableValueToObject(mojo, "remoteRepositories", mojo.getProject().getRemoteArtifactRepositories());
         return mojo;
     }
 
-    protected File generateReport( AbstractPmdReport mojo, File pluginXmlFile )
-        throws Exception
-    {
+    protected File generateReport(AbstractPmdReport mojo, File pluginXmlFile) throws Exception {
         mojo.execute();
 
-        ProjectBuilder builder = lookup( ProjectBuilder.class );
+        ProjectBuilder builder = lookup(ProjectBuilder.class);
 
         ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest();
-        buildingRequest.setRepositorySession( lookup( LegacySupport.class ).getRepositorySession() );
+        buildingRequest.setRepositorySession(lookup(LegacySupport.class).getRepositorySession());
 
-        testMavenProject = builder.build( pluginXmlFile, buildingRequest ).getProject();
+        testMavenProject = builder.build(pluginXmlFile, buildingRequest).getProject();
 
         File outputDir = mojo.getReportOutputDirectory();
         String filename = mojo.getOutputName() + ".html";
 
-        return new File( outputDir, filename );
+        return new File(outputDir, filename);
     }
 
     /**
      * Read the contents of the specified file object into a string
      */
-    protected String readFile( File pmdTestDir, String fileName ) throws IOException
-    {
-        return new String( Files.readAllBytes( pmdTestDir.toPath().resolve( fileName ) ) );
+    protected String readFile(File pmdTestDir, String fileName) throws IOException {
+        return new String(Files.readAllBytes(pmdTestDir.toPath().resolve(fileName)));
     }
 
-
     /**
      * Checks, whether the string <code>contained</code> is contained in
      * the given <code>text</code> ignoring case.
@@ -161,8 +146,7 @@
      * @param contains the string, the should be searched
      * @return <code>true</code> if the string is contained, otherwise <code>false</code>.
      */
-    public static boolean lowerCaseContains( String text, String contains )
-    {
-        return text.toLowerCase( Locale.ROOT ).contains( contains.toLowerCase( Locale.ROOT ) );
+    public static boolean lowerCaseContains(String text, String contains) {
+        return text.toLowerCase(Locale.ROOT).contains(contains.toLowerCase(Locale.ROOT));
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/CapturingPrintStream.java b/src/test/java/org/apache/maven/plugins/pmd/CapturingPrintStream.java
index 272a302..f22d8fa 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/CapturingPrintStream.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/CapturingPrintStream.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.PrintStream;
 
@@ -30,54 +29,44 @@
     private boolean quiet;
     private StringBuilder buffer = new StringBuilder();
 
-    private CapturingPrintStream( boolean quiet ) {
-        super( System.out, true );
+    private CapturingPrintStream(boolean quiet) {
+        super(System.out, true);
         this.quiet = quiet;
     }
 
     @Override
-    public void println( String x )
-    {
-        if ( !quiet )
-        {
-            super.println( x );
+    public void println(String x) {
+        if (!quiet) {
+            super.println(x);
         }
-        buffer.append( x ).append( System.lineSeparator() );
+        buffer.append(x).append(System.lineSeparator());
     }
 
-    public static void init( boolean quiet )
-    {
+    public static void init(boolean quiet) {
         CapturingPrintStream capture = get();
-        if ( capture != null )
-        {
-            capture.buffer.setLength( 0 );
+        if (capture != null) {
+            capture.buffer.setLength(0);
             capture.quiet = quiet;
-        }
-        else
-        {
-            capture = new CapturingPrintStream( quiet );
-            System.setOut( capture );
+        } else {
+            capture = new CapturingPrintStream(quiet);
+            System.setOut(capture);
             MavenSlf4jSimpleFriend.init();
         }
     }
 
-    public static CapturingPrintStream get()
-    {
-        if ( System.out instanceof CapturingPrintStream )
-        {
+    public static CapturingPrintStream get() {
+        if (System.out instanceof CapturingPrintStream) {
             return (CapturingPrintStream) System.out;
         }
         return null;
     }
 
-    public static String getOutput()
-    {
+    public static String getOutput() {
         CapturingPrintStream stream = get();
-        if ( stream != null )
-        {
+        if (stream != null) {
             stream.flush();
             return stream.buffer.toString();
         }
         return "";
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java b/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java
index efb3d58..ac49a29 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -25,9 +27,6 @@
 import java.io.IOException;
 import java.util.Locale;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
 import org.apache.commons.lang3.StringUtils;
 import org.codehaus.plexus.util.FileUtils;
 import org.w3c.dom.Document;
@@ -36,19 +35,15 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class CpdReportTest
-    extends AbstractPmdReportTestCase
-{
+public class CpdReportTest extends AbstractPmdReportTestCase {
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void setUp()
-        throws Exception
-    {
+    protected void setUp() throws Exception {
         super.setUp();
-        Locale.setDefault( Locale.ENGLISH );
-        FileUtils.deleteDirectory( new File( getBasedir(), "target/test/unit" ) );
+        Locale.setDefault(Locale.ENGLISH);
+        FileUtils.deleteDirectory(new File(getBasedir(), "target/test/unit"));
     }
 
     /**
@@ -56,26 +51,25 @@
      *
      * @throws Exception
      */
-    public void testDefaultConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testDefaultConfiguration() throws Exception {
+        File generatedReport =
+                generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the CPD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check the contents of cpd.html
-        String str = readFile( generatedReport );
-        assertTrue( lowerCaseContains( str, "AppSample.java" ) );
-        assertTrue( lowerCaseContains( str, "App.java" ) );
-        assertTrue( lowerCaseContains( str, "public String dup( String str )" ) );
-        assertTrue( lowerCaseContains( str, "tmp = tmp + str.substring( i, i + 1);" ) );
+        String str = readFile(generatedReport);
+        assertTrue(lowerCaseContains(str, "AppSample.java"));
+        assertTrue(lowerCaseContains(str, "App.java"));
+        assertTrue(lowerCaseContains(str, "public String dup( String str )"));
+        assertTrue(lowerCaseContains(str, "tmp = tmp + str.substring( i, i + 1);"));
 
         // the version should be logged
         String output = CapturingPrintStream.getOutput();
-        assertTrue ( output.contains( "PMD version: " + AbstractPmdReport.getPmdVersion() ) );
+        assertTrue(output.contains("PMD version: " + AbstractPmdReport.getPmdVersion()));
     }
 
     /**
@@ -83,23 +77,21 @@
      *
      * @throws Exception
      */
-    public void testTxtFormat()
-        throws Exception
-    {
-        generateReport( "cpd", "custom-configuration/cpd-txt-format-configuration-plugin-config.xml" );
+    public void testTxtFormat() throws Exception {
+        generateReport("cpd", "custom-configuration/cpd-txt-format-configuration-plugin-config.xml");
 
         // check if the CPD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/cpd.txt" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/cpd.txt");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check the contents of cpd.txt
-        String str = readFile( generatedFile );
+        String str = readFile(generatedFile);
         // Contents that should NOT be in the report
-        assertFalse( lowerCaseContains( str, "public static void main( String[] args )" ) );
+        assertFalse(lowerCaseContains(str, "public static void main( String[] args )"));
         // Contents that should be in the report
-        assertTrue( lowerCaseContains( str, "public void duplicateMethod( int i )" ) );
+        assertTrue(lowerCaseContains(str, "public void duplicateMethod( int i )"));
     }
 
     /**
@@ -107,24 +99,22 @@
      *
      * @throws Exception
      */
-    public void testCustomConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "cpd", "custom-configuration/cpd-custom-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testCustomConfiguration() throws Exception {
+        File generatedReport = generateReport("cpd", "custom-configuration/cpd-custom-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the CPD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/cpd.csv" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/cpd.csv");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
         // Contents that should NOT be in the report
-        assertFalse( lowerCaseContains( str, "/Sample.java" ) );
-        assertFalse( lowerCaseContains( str, "public void duplicateMethod( int i )" ) );
+        assertFalse(lowerCaseContains(str, "/Sample.java"));
+        assertFalse(lowerCaseContains(str, "public void duplicateMethod( int i )"));
         // Contents that should be in the report
-        assertTrue( lowerCaseContains( str, "AnotherSample.java" ) );
-        assertTrue( lowerCaseContains( str, "public static void main( String[] args )" ) );
-        assertTrue( lowerCaseContains( str, "private String unusedMethod(" ) );
+        assertTrue(lowerCaseContains(str, "AnotherSample.java"));
+        assertTrue(lowerCaseContains(str, "public static void main( String[] args )"));
+        assertTrue(lowerCaseContains(str, "private String unusedMethod("));
     }
 
     /**
@@ -132,24 +122,19 @@
      *
      * @throws Exception
      */
-    public void testInvalidFormat()
-        throws Exception
-    {
-        try
-        {
-            File testPom =
-                    new File( getBasedir(), "src/test/resources/unit/invalid-format/cpd-invalid-format-plugin-config.xml" );
-            AbstractPmdReport mojo  = createReportMojo( "cpd", testPom );
-            setVariableValueToObject( mojo, "compileSourceRoots", mojo.getProject().getCompileSourceRoots() );
-            generateReport( mojo, testPom );
+    public void testInvalidFormat() throws Exception {
+        try {
+            File testPom = new File(
+                    getBasedir(), "src/test/resources/unit/invalid-format/cpd-invalid-format-plugin-config.xml");
+            AbstractPmdReport mojo = createReportMojo("cpd", testPom);
+            setVariableValueToObject(
+                    mojo, "compileSourceRoots", mojo.getProject().getCompileSourceRoots());
+            generateReport(mojo, testPom);
 
-            fail( "MavenReportException must be thrown" );
+            fail("MavenReportException must be thrown");
+        } catch (Exception e) {
+            assertTrue(true);
         }
-        catch ( Exception e )
-        {
-            assertTrue( true );
-        }
-
     }
 
     /**
@@ -159,147 +144,123 @@
      * @return a String object that contains the contents of the file
      * @throws java.io.IOException
      */
-    private String readFile( File file )
-        throws IOException
-    {
+    private String readFile(File file) throws IOException {
         String strTmp;
-        StringBuilder str = new StringBuilder( (int) file.length() );
-        try ( BufferedReader in = new BufferedReader( new FileReader( file ) ) )
-        {
-            while ( ( strTmp = in.readLine() ) != null )
-            {
-                str.append( ' ' );
-                str.append( strTmp );
+        StringBuilder str = new StringBuilder((int) file.length());
+        try (BufferedReader in = new BufferedReader(new FileReader(file))) {
+            while ((strTmp = in.readLine()) != null) {
+                str.append(' ');
+                str.append(strTmp);
             }
         }
 
         return str.toString();
     }
 
-    public void testWriteNonHtml()
-        throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
+    public void testWriteNonHtml() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
 
         // check if the CPD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-        Document pmdCpdDocument = builder.parse( generatedFile );
-        assertNotNull( pmdCpdDocument );
+        Document pmdCpdDocument = builder.parse(generatedFile);
+        assertNotNull(pmdCpdDocument);
 
-        String str = readFile( generatedFile );
-        assertTrue( lowerCaseContains( str, "AppSample.java" ) );
-        assertTrue( lowerCaseContains( str, "App.java" ) );
-        assertTrue( lowerCaseContains( str, "public String dup( String str )" ) );
-        assertTrue( lowerCaseContains( str, "tmp = tmp + str.substring( i, i + 1);" ) );
+        String str = readFile(generatedFile);
+        assertTrue(lowerCaseContains(str, "AppSample.java"));
+        assertTrue(lowerCaseContains(str, "App.java"));
+        assertTrue(lowerCaseContains(str, "public String dup( String str )"));
+        assertTrue(lowerCaseContains(str, "tmp = tmp + str.substring( i, i + 1);"));
     }
 
     /**
      * verify the cpd.xml file is included in the site when requested.
      * @throws Exception
      */
-    public void testIncludeXmlInSite()
-            throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-report-include-xml-in-site-plugin-config.xml" );
+    public void testIncludeXmlInSite() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-report-include-xml-in-site-plugin-config.xml");
 
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-        Document pmdCpdDocument = builder.parse( generatedFile );
-        assertNotNull( pmdCpdDocument );
+        Document pmdCpdDocument = builder.parse(generatedFile);
+        assertNotNull(pmdCpdDocument);
 
-        String str = readFile( generatedFile );
-        assertTrue( str.contains( "</pmd-cpd>" ) );
+        String str = readFile(generatedFile);
+        assertTrue(str.contains("</pmd-cpd>"));
 
-        File siteReport = new File( getBasedir(), "target/test/unit/default-configuration/target/site/cpd.xml" );
-        assertTrue( FileUtils.fileExists( siteReport.getAbsolutePath() ) );
-        String siteReportContent = readFile( siteReport );
-        assertTrue( siteReportContent.contains( "</pmd-cpd>" ) );
-        assertEquals( str, siteReportContent );
+        File siteReport = new File(getBasedir(), "target/test/unit/default-configuration/target/site/cpd.xml");
+        assertTrue(FileUtils.fileExists(siteReport.getAbsolutePath()));
+        String siteReportContent = readFile(siteReport);
+        assertTrue(siteReportContent.contains("</pmd-cpd>"));
+        assertEquals(str, siteReportContent);
     }
 
-
-    public void testSkipEmptyReportConfiguration()
-        throws Exception
-    {
+    public void testSkipEmptyReportConfiguration() throws Exception {
         // verify the generated files do not exist because PMD was skipped
-        File generatedReport = generateReport( "cpd", "empty-report/cpd-skip-empty-report-plugin-config.xml" );
-        assertFalse( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport("cpd", "empty-report/cpd-skip-empty-report-plugin-config.xml");
+        assertFalse(FileUtils.fileExists(generatedReport.getAbsolutePath()));
     }
 
-    public void testEmptyReportConfiguration()
-        throws Exception
-    {
+    public void testEmptyReportConfiguration() throws Exception {
         // verify the generated files do exist, even if there are no violations
-        File generatedReport = generateReport( "cpd", "empty-report/cpd-empty-report-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport("cpd", "empty-report/cpd-empty-report-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
-        assertFalse( lowerCaseContains( str, "Hello.java" ) );
-        assertTrue( str.contains( "CPD found no problems in your source code." ) );
+        String str = readFile(generatedReport);
+        assertFalse(lowerCaseContains(str, "Hello.java"));
+        assertTrue(str.contains("CPD found no problems in your source code."));
     }
 
-    public void testCpdEncodingConfiguration()
-        throws Exception
-    {
-        String originalEncoding = System.getProperty( "file.encoding" );
-        try
-        {
-            System.setProperty( "file.encoding", "UTF-16" );
+    public void testCpdEncodingConfiguration() throws Exception {
+        String originalEncoding = System.getProperty("file.encoding");
+        try {
+            System.setProperty("file.encoding", "UTF-16");
 
-            generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
+            generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
 
             // check if the CPD files were generated
-            File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-            assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-            String str = readFile( generatedFile );
-            assertTrue( lowerCaseContains( str, "AppSample.java" ) );
-        }
-        finally
-        {
-            System.setProperty( "file.encoding", originalEncoding );
+            File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+            assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+            String str = readFile(generatedFile);
+            assertTrue(lowerCaseContains(str, "AppSample.java"));
+        } finally {
+            System.setProperty("file.encoding", originalEncoding);
         }
     }
 
-    public void testCpdJavascriptConfiguration()
-        throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-javascript-plugin-config.xml" );
+    public void testCpdJavascriptConfiguration() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-javascript-plugin-config.xml");
 
         // verify  the generated file to exist and violations are reported
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
-        assertTrue( lowerCaseContains( str, "Sample.js" ) );
-        assertTrue( lowerCaseContains( str, "SampleDup.js" ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        String str = readFile(generatedFile);
+        assertTrue(lowerCaseContains(str, "Sample.js"));
+        assertTrue(lowerCaseContains(str, "SampleDup.js"));
     }
 
-    public void testCpdJspConfiguration()
-            throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-jsp-plugin-config.xml" );
+    public void testCpdJspConfiguration() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-jsp-plugin-config.xml");
 
         // verify  the generated file to exist and violations are reported
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
-        assertTrue( lowerCaseContains( str, "sample.jsp" ) );
-        assertTrue( lowerCaseContains( str, "sampleDup.jsp" ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/cpd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        String str = readFile(generatedFile);
+        assertTrue(lowerCaseContains(str, "sample.jsp"));
+        assertTrue(lowerCaseContains(str, "sampleDup.jsp"));
     }
 
-    public void testExclusionsConfiguration()
-            throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml" );
+    public void testExclusionsConfiguration() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-report-cpd-exclusions-configuration-plugin-config.xml");
 
         // 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" ) );
+        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"));
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java b/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
index 31adb8c..5d7db5b 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/CpdViolationCheckMojoTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 
@@ -25,81 +24,65 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class CpdViolationCheckMojoTest
-    extends AbstractPmdReportTestCase
-{
+public class CpdViolationCheckMojoTest extends AbstractPmdReportTestCase {
 
-    public void testDefaultConfiguration()
-        throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
+    public void testDefaultConfiguration() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
 
         // clear the output from previous pmd:cpd execution
-        CapturingPrintStream.init( true );
+        CapturingPrintStream.init(true);
 
-        try
-        {
-            File testPom =
-                new File( getBasedir(),
-                          "src/test/resources/unit/default-configuration/pmd-check-default-configuration-plugin-config.xml" );
-            final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
+        try {
+            File testPom = new File(
+                    getBasedir(),
+                    "src/test/resources/unit/default-configuration/pmd-check-default-configuration-plugin-config.xml");
+            final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo("cpd-check", testPom);
             cpdViolationMojo.execute();
 
-            fail( "MojoFailureException should be thrown." );
-        }
-        catch ( final Exception e )
-        {
+            fail("MojoFailureException should be thrown.");
+        } catch (final Exception e) {
             // the version should be logged
             String output = CapturingPrintStream.getOutput();
-            assertTrue ( output.contains( "PMD version: " + AbstractPmdReport.getPmdVersion() ) );
+            assertTrue(output.contains("PMD version: " + AbstractPmdReport.getPmdVersion()));
 
-            assertTrue( e.getMessage().startsWith( "You have 1 CPD duplication." ) );
+            assertTrue(e.getMessage().startsWith("You have 1 CPD duplication."));
         }
     }
 
-    public void testNotFailOnViolation()
-        throws Exception
-    {
+    public void testNotFailOnViolation() throws Exception {
 
-        generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
+        generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/cpd-check-notfailonviolation-plugin-config.xml" );
-        final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/cpd-check-notfailonviolation-plugin-config.xml");
+        final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo("cpd-check", testPom);
         cpdViolationMojo.execute();
 
-        assertTrue( true );
+        assertTrue(true);
     }
 
-    public void testException()
-        throws Exception
-    {
-        try
-        {
-            final File testPom =
-                new File( getBasedir(),
-                          "src/test/resources/unit/custom-configuration/pmd-check-exception-test-plugin-config.xml" );
-            final CpdViolationCheckMojo mojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
+    public void testException() throws Exception {
+        try {
+            final File testPom = new File(
+                    getBasedir(),
+                    "src/test/resources/unit/custom-configuration/pmd-check-exception-test-plugin-config.xml");
+            final CpdViolationCheckMojo mojo = (CpdViolationCheckMojo) lookupMojo("cpd-check", testPom);
             mojo.execute();
 
-            fail( "MojoFailureException should be thrown." );
-        }
-        catch ( final Exception e )
-        {
-            assertTrue( true );
+            fail("MojoFailureException should be thrown.");
+        } catch (final Exception e) {
+            assertTrue(true);
         }
     }
 
-    public void testExclusionsConfiguration()
-        throws Exception
-    {
-        generateReport( "cpd", "default-configuration/cpd-default-configuration-plugin-config.xml" );
+    public void testExclusionsConfiguration() throws Exception {
+        generateReport("cpd", "default-configuration/cpd-default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml" );
-        final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo( "cpd-check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/cpd-check-cpd-exclusions-configuration-plugin-config.xml");
+        final CpdViolationCheckMojo cpdViolationMojo = (CpdViolationCheckMojo) lookupMojo("cpd-check", testPom);
 
         // this call shouldn't throw an exception, as the classes with duplications have been excluded
         cpdViolationMojo.execute();
diff --git a/src/test/java/org/apache/maven/plugins/pmd/DependencyArtifactStubFactory.java b/src/test/java/org/apache/maven/plugins/pmd/DependencyArtifactStubFactory.java
index 7cd70cd..881286c 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/DependencyArtifactStubFactory.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/DependencyArtifactStubFactory.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- * http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 import java.io.IOException;
@@ -27,42 +26,44 @@
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.plugin.testing.ArtifactStubFactory;
 
-public class DependencyArtifactStubFactory
-    extends ArtifactStubFactory
-{
+public class DependencyArtifactStubFactory extends ArtifactStubFactory {
     private boolean flattenedPath = true;
 
-    public DependencyArtifactStubFactory( File theWorkingDir, boolean theCreateFiles, boolean flattenedPath )
-    {
-        this( theWorkingDir, theCreateFiles );
+    public DependencyArtifactStubFactory(File theWorkingDir, boolean theCreateFiles, boolean flattenedPath) {
+        this(theWorkingDir, theCreateFiles);
         this.flattenedPath = flattenedPath;
     }
 
-    public DependencyArtifactStubFactory( File theWorkingDir, boolean theCreateFiles )
-    {
-        super( theWorkingDir, theCreateFiles );
+    public DependencyArtifactStubFactory(File theWorkingDir, boolean theCreateFiles) {
+        super(theWorkingDir, theCreateFiles);
     }
 
     @Override
-    public Artifact createArtifact( String groupId, String artifactId, VersionRange versionRange, String scope,
-                                    String type, String classifier, boolean optional )
-        throws IOException
-    {
+    public Artifact createArtifact(
+            String groupId,
+            String artifactId,
+            VersionRange versionRange,
+            String scope,
+            String type,
+            String classifier,
+            boolean optional)
+            throws IOException {
         File workingDir = getWorkingDir();
 
-        if ( !flattenedPath )
-        {
+        if (!flattenedPath) {
             // don't use flatten directories, won't happen at runtime
-            String path = groupId.replace( '.', '/' ) + '/' +
-                    artifactId + '/' +
-                    ArtifactUtils.toSnapshotVersion( versionRange.getRecommendedVersion().toString() );
-            setWorkingDir( new File( workingDir, path ) );
+            String path = groupId.replace('.', '/')
+                    + '/'
+                    + artifactId
+                    + '/'
+                    + ArtifactUtils.toSnapshotVersion(
+                            versionRange.getRecommendedVersion().toString());
+            setWorkingDir(new File(workingDir, path));
         }
 
-        Artifact artifact =
-            super.createArtifact( groupId, artifactId, versionRange, scope, type, classifier, optional );
+        Artifact artifact = super.createArtifact(groupId, artifactId, versionRange, scope, type, classifier, optional);
 
-        setWorkingDir( workingDir );
+        setWorkingDir(workingDir);
 
         return artifact;
     }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
index d53ba48..eed633a 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -28,241 +27,241 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
 
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import net.sourceforge.pmd.renderers.Renderer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugins.pmd.exec.PmdExecutor;
 import org.apache.maven.reporting.MavenReportException;
 import org.codehaus.plexus.util.FileUtils;
 
-import net.sourceforge.pmd.renderers.Renderer;
-
-import com.github.tomakehurst.wiremock.WireMockServer;
-import com.github.tomakehurst.wiremock.client.WireMock;
-
 /**
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class PmdReportTest
-    extends AbstractPmdReportTestCase
-{
+public class PmdReportTest extends AbstractPmdReportTestCase {
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void setUp()
-        throws Exception
-    {
+    protected void setUp() throws Exception {
         super.setUp();
-        Locale.setDefault( Locale.ENGLISH );
-        FileUtils.deleteDirectory( new File( getBasedir(), "target/test/unit" ) );
+        Locale.setDefault(Locale.ENGLISH);
+        FileUtils.deleteDirectory(new File(getBasedir(), "target/test/unit"));
     }
 
-    public void testDefaultConfiguration()
-        throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+    public void testDefaultConfiguration() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
-        File generatedReport = generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check if the rulesets, that have been applied, have been copied
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/maven-pmd-plugin-default.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(
+                getBasedir(),
+                "target/test/unit/default-configuration/target/pmd/rulesets/maven-pmd-plugin-default.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check if there's a link to the JXR files
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
-        assertTrue( str.contains( "/xref/def/configuration/App.html#L31" ) );
+        assertTrue(str.contains("/xref/def/configuration/App.html#L31"));
 
-        assertTrue( str.contains( "/xref/def/configuration/AppSample.html#L45" ) );
+        assertTrue(str.contains("/xref/def/configuration/AppSample.html#L45"));
 
         // check if there's a priority column
-        assertTrue( str.contains( "<th>Priority</th>" ) );
+        assertTrue(str.contains("<th>Priority</th>"));
 
         // there should be a rule column
-        assertTrue( str.contains( "<th>Rule</th>" ) );
+        assertTrue(str.contains("<th>Rule</th>"));
         // along with a link to the rule
-        assertTrue( str.contains( "pmd_rules_java_bestpractices.html#unusedprivatefield\">UnusedPrivateField</a>" ) );
+        assertTrue(str.contains("pmd_rules_java_bestpractices.html#unusedprivatefield\">UnusedPrivateField</a>"));
 
         // there should be the section Violations By Priority
-        assertTrue( str.contains( "Violations By Priority</h2>" ) );
-        assertTrue( str.contains( "Priority 3</h3>" ) );
-        assertTrue( str.contains( "Priority 4</h3>" ) );
+        assertTrue(str.contains("Violations By Priority</h2>"));
+        assertTrue(str.contains("Priority 3</h3>"));
+        assertTrue(str.contains("Priority 4</h3>"));
         // the file App.java is mentioned 3 times: in prio 3, in prio 4 and in the files section
-        assertEquals( 3, StringUtils.countMatches( str, "def/configuration/App.java" ) );
+        assertEquals(3, StringUtils.countMatches(str, "def/configuration/App.java"));
 
         // there must be no warnings (like deprecated rules) in the log output
         String output = CapturingPrintStream.getOutput();
-        assertFalse( output.contains( "deprecated Rule name" ) );
-        assertFalse( output.contains( "Discontinue using Rule name" ) );
-        assertFalse( output.contains( "is referenced multiple times" ) );
+        assertFalse(output.contains("deprecated Rule name"));
+        assertFalse(output.contains("Discontinue using Rule name"));
+        assertFalse(output.contains("is referenced multiple times"));
 
         // the version should be logged
-        assertTrue ( output.contains( "PMD version: " + AbstractPmdReport.getPmdVersion() ) );
+        assertTrue(output.contains("PMD version: " + AbstractPmdReport.getPmdVersion()));
     }
 
-    public void testDefaultConfigurationNotRenderRuleViolationPriority()
-            throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+    public void testDefaultConfigurationNotRenderRuleViolationPriority() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-report-not-render-rule-priority-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport =
+                generateReport("pmd", "default-configuration/pmd-report-not-render-rule-priority-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
         // check that there's no priority column
-        assertFalse( str.contains( "<th>Priority</th>" ) );
+        assertFalse(str.contains("<th>Priority</th>"));
     }
 
-    public void testDefaultConfigurationNoRenderViolationsByPriority()
-            throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+    public void testDefaultConfigurationNoRenderViolationsByPriority() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-report-no-render-violations-by-priority.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport =
+                generateReport("pmd", "default-configuration/pmd-report-no-render-violations-by-priority.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
         // there should be no section Violations By Priority
-        assertFalse( str.contains( "Violations By Priority</h2>" ) );
-        assertFalse( str.contains( "Priority 3</h3>" ) );
-        assertFalse( str.contains( "Priority 4</h3>" ) );
+        assertFalse(str.contains("Violations By Priority</h2>"));
+        assertFalse(str.contains("Priority 3</h3>"));
+        assertFalse(str.contains("Priority 4</h3>"));
         // the file App.java is mentioned once: in the files section
-        assertEquals( 1, StringUtils.countMatches( str, "def/configuration/App.java" ) );
+        assertEquals(1, StringUtils.countMatches(str, "def/configuration/App.java"));
     }
 
+    public void testDefaultConfigurationWithAnalysisCache() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/pmd-with-analysis-cache-plugin-config/target/site"));
 
-    public void testDefaultConfigurationWithAnalysisCache()
-            throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/pmd-with-analysis-cache-plugin-config/target/site" ) );
-
-        generateReport( "pmd", "default-configuration/pmd-with-analysis-cache-plugin-config.xml" );
+        generateReport("pmd", "default-configuration/pmd-with-analysis-cache-plugin-config.xml");
 
         // check if the PMD analysis cache file has been generated
-        File cacheFile = new File( getBasedir(), "target/test/unit/pmd-with-analysis-cache-plugin-config/target/pmd/pmd.cache" );
-        assertTrue( FileUtils.fileExists( cacheFile.getAbsolutePath() ) );
+        File cacheFile =
+                new File(getBasedir(), "target/test/unit/pmd-with-analysis-cache-plugin-config/target/pmd/pmd.cache");
+        assertTrue(FileUtils.fileExists(cacheFile.getAbsolutePath()));
     }
 
-    public void testJavascriptConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "default-configuration/javascript-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testJavascriptConfiguration() throws Exception {
+        File generatedReport =
+                generateReport("pmd", "default-configuration/javascript-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // these are the rulesets, that have been applied...
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/codestyle.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/codestyle.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/errorprone.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/errorprone.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
-        assertTrue( str.contains( "Avoid using global variables" ) );
+        String str = readFile(generatedReport);
+        assertTrue(str.contains("Avoid using global variables"));
     }
 
-    public void testFileURL()
-        throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+    public void testFileURL() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml" );
-        PmdReport mojo = (PmdReport) createReportMojo( "pmd", testPom );
+        File testPom = new File(
+                getBasedir(), "src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml");
+        PmdReport mojo = (PmdReport) createReportMojo("pmd", testPom);
 
         // Additional test case for MPMD-174 (https://issues.apache.org/jira/browse/MPMD-174).
         int port = determineFreePort();
-        WireMockServer mockServer = new WireMockServer( port );
+        WireMockServer mockServer = new WireMockServer(port);
         mockServer.start();
 
-        String sonarRuleset =
-            IOUtils.toString( getClass().getClassLoader().getResourceAsStream( "unit/default-configuration/rulesets/sonar-way-ruleset.xml" ),
-                    StandardCharsets.UTF_8 );
+        String sonarRuleset = IOUtils.toString(
+                getClass()
+                        .getClassLoader()
+                        .getResourceAsStream("unit/default-configuration/rulesets/sonar-way-ruleset.xml"),
+                StandardCharsets.UTF_8);
 
-        String sonarMainPageHtml =
-            IOUtils.toString( getClass().getClassLoader().getResourceAsStream( "unit/default-configuration/rulesets/sonar-main-page.html" ),
-                    StandardCharsets.UTF_8 );
+        String sonarMainPageHtml = IOUtils.toString(
+                getClass()
+                        .getClassLoader()
+                        .getResourceAsStream("unit/default-configuration/rulesets/sonar-main-page.html"),
+                StandardCharsets.UTF_8);
 
         final String sonarBaseUrl = "/profiles";
         final String sonarProfileUrl = sonarBaseUrl + "/export?format=pmd&language=java&name=Sonar%2520way";
         final String sonarExportRulesetUrl = "http://localhost:" + mockServer.port() + sonarProfileUrl;
 
-        WireMock.configureFor( "localhost", port );
-        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarBaseUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
-                                                                                                                                               "text/html" ).withBody( sonarMainPageHtml ) ) );
+        WireMock.configureFor("localhost", port);
+        WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(sonarBaseUrl))
+                .willReturn(WireMock.aResponse()
+                        .withStatus(200)
+                        .withHeader("Content-Type", "text/html")
+                        .withBody(sonarMainPageHtml)));
 
-        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) ).willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
-                                                                                                                                                  "text/xml" ).withBody( sonarRuleset ) ) );
+        WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(sonarProfileUrl))
+                .willReturn(WireMock.aResponse()
+                        .withStatus(200)
+                        .withHeader("Content-Type", "text/xml")
+                        .withBody(sonarRuleset)));
 
-        URL url = getClass().getClassLoader().getResource( "rulesets/java/basic.xml" );
-        URL url2 = getClass().getClassLoader().getResource( "rulesets/java/unusedcode.xml" );
-        URL url3 = getClass().getClassLoader().getResource( "rulesets/java/imports.xml" );
-        mojo.setRulesets( new String[] { url.toString(), url2.toString(), url3.toString(), sonarExportRulesetUrl } );
+        URL url = getClass().getClassLoader().getResource("rulesets/java/basic.xml");
+        URL url2 = getClass().getClassLoader().getResource("rulesets/java/unusedcode.xml");
+        URL url3 = getClass().getClassLoader().getResource("rulesets/java/imports.xml");
+        mojo.setRulesets(new String[] {url.toString(), url2.toString(), url3.toString(), sonarExportRulesetUrl});
 
-        File generatedReport = generateReport( mojo, testPom );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport(mojo, testPom);
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // the resolved and extracted rulesets
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/basic.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/imports.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/unusedcode.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/basic.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         generatedFile =
-            new File( getBasedir(),
-                      "target/test/unit/default-configuration/target/pmd/rulesets/export_format_pmd_language_java_name_Sonar_2520way.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/imports.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/unusedcode.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+
+        generatedFile = new File(
+                getBasedir(),
+                "target/test/unit/default-configuration/target/pmd/rulesets/export_format_pmd_language_java_name_Sonar_2520way.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check if there's a link to the JXR files
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
-        assertTrue( str.contains( "/xref/def/configuration/App.html#L31" ) );
+        assertTrue(str.contains("/xref/def/configuration/App.html#L31"));
 
-        assertTrue( str.contains( "/xref/def/configuration/AppSample.html#L45" ) );
+        assertTrue(str.contains("/xref/def/configuration/AppSample.html#L45"));
 
         mockServer.stop();
     }
 
-    private int determineFreePort()
-    {
+    private int determineFreePort() {
         try (ServerSocket socket = new ServerSocket(0)) {
             return socket.getLocalPort();
         } catch (IOException e) {
-            throw new RuntimeException( "Couldn't find a free port.", e );
+            throw new RuntimeException("Couldn't find a free port.", e);
         }
     }
 
@@ -271,35 +270,34 @@
      *
      * @throws Exception
      */
-    public void testCustomConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "custom-configuration/custom-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testCustomConfiguration() throws Exception {
+        File generatedReport = generateReport("pmd", "custom-configuration/custom-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check the generated files
-        File generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/pmd.csv" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/pmd.csv");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/pmd/rulesets/custom.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/pmd/rulesets/custom.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // check if custom ruleset was applied
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
         // codestyle.xml/ControlStatementBraces:
-        assertTrue( lowerCaseContains( str, "This statement should have braces" ) );
+        assertTrue(lowerCaseContains(str, "This statement should have braces"));
 
         // Must be false as codestyle.xml/ControlStatementBraces with checkIfElseStmt=false is used
-        assertFalse( lowerCaseContains( str, "Avoid using if...else statements without curly braces" ) );
+        assertFalse(lowerCaseContains(str, "Avoid using if...else statements without curly braces"));
 
-        assertFalse( "unnecessary constructor should not be triggered because of low priority",
-                    lowerCaseContains( str, "Avoid unnecessary constructors - the compiler will generate these for you" ) );
+        assertFalse(
+                "unnecessary constructor should not be triggered because of low priority",
+                lowerCaseContains(str, "Avoid unnecessary constructors - the compiler will generate these for you"));
 
         // veryLongVariableNameWithViolation is really too long
-        assertTrue( lowerCaseContains( str, "veryLongVariableNameWithViolation" ) );
+        assertTrue(lowerCaseContains(str, "veryLongVariableNameWithViolation"));
         // notSoLongVariableName should not be reported
-        assertFalse( lowerCaseContains( str, "notSoLongVariableName" ) );
+        assertFalse(lowerCaseContains(str, "notSoLongVariableName"));
     }
 
     /**
@@ -307,78 +305,63 @@
      *
      * @throws Exception
      */
-    public void testSkipConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "custom-configuration/skip-plugin-config.xml" );
-        assertFalse( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testSkipConfiguration() throws Exception {
+        File generatedReport = generateReport("pmd", "custom-configuration/skip-plugin-config.xml");
+        assertFalse(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // verify the generated files do not exist because PMD was skipped
-        File generatedFile = new File( getBasedir(), "target/test/unit/skip-configuration/target/pmd.csv" );
-        assertFalse( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/skip-configuration/target/pmd.csv");
+        assertFalse(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/custom-configuration/target/custom.xml" );
-        assertFalse( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(getBasedir(), "target/test/unit/custom-configuration/target/custom.xml");
+        assertFalse(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // the fact, the PMD execution has been skipped, should be logged
         String output = CapturingPrintStream.getOutput();
-        assertTrue ( output.contains( "Skipping PMD execution" ) );
+        assertTrue(output.contains("Skipping PMD execution"));
     }
 
-    public void testSkipEmptyReportConfiguration()
-        throws Exception
-    {
+    public void testSkipEmptyReportConfiguration() throws Exception {
         // verify the generated files do not exist because PMD was skipped
-        File generatedReport = generateReport( "pmd", "empty-report/skip-empty-report-plugin-config.xml" );
-        assertFalse( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport("pmd", "empty-report/skip-empty-report-plugin-config.xml");
+        assertFalse(FileUtils.fileExists(generatedReport.getAbsolutePath()));
     }
 
-    public void testEmptyReportConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "empty-report/empty-report-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testEmptyReportConfiguration() throws Exception {
+        File generatedReport = generateReport("pmd", "empty-report/empty-report-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // verify the generated files do exist, even if there are no violations
-        String str = readFile( generatedReport );
-        assertFalse( lowerCaseContains( str, "Hello.java" ) );
-        assertEquals( 1, StringUtils.countMatches( str, "PMD found no problems in your source code." ) );
+        String str = readFile(generatedReport);
+        assertFalse(lowerCaseContains(str, "Hello.java"));
+        assertEquals(1, StringUtils.countMatches(str, "PMD found no problems in your source code."));
         // no sections files or violations by priority
-        assertFalse( str.contains( "Files</h2>" ) );
-        assertFalse( str.contains( "Violations By Priority</h2>" ) );
+        assertFalse(str.contains("Files</h2>"));
+        assertFalse(str.contains("Violations By Priority</h2>"));
     }
 
-    public void testInvalidFormat()
-        throws Exception
-    {
-        try
-        {
+    public void testInvalidFormat() throws Exception {
+        try {
             File testPom =
-                    new File( getBasedir(), "src/test/resources/unit/invalid-format/invalid-format-plugin-config.xml" );
-            AbstractPmdReport mojo = createReportMojo( "pmd", testPom );
-            setVariableValueToObject( mojo, "compileSourceRoots", mojo.getProject().getCompileSourceRoots() );
-            generateReport( mojo, testPom );
+                    new File(getBasedir(), "src/test/resources/unit/invalid-format/invalid-format-plugin-config.xml");
+            AbstractPmdReport mojo = createReportMojo("pmd", testPom);
+            setVariableValueToObject(
+                    mojo, "compileSourceRoots", mojo.getProject().getCompileSourceRoots());
+            generateReport(mojo, testPom);
 
-            fail( "Must throw MavenReportException." );
-        }
-        catch ( Exception e )
-        {
-            assertTrue( true );
+            fail("Must throw MavenReportException.");
+        } catch (Exception e) {
+            assertTrue(true);
         }
     }
 
-    public void testInvalidTargetJdk()
-        throws Exception
-    {
-        try
-        {
-            generateReport( "pmd", "empty-report/invalid-format/invalid-target-jdk-plugin-config.xml" );
+    public void testInvalidTargetJdk() throws Exception {
+        try {
+            generateReport("pmd", "empty-report/invalid-format/invalid-target-jdk-plugin-config.xml");
 
-            fail( "Must throw MavenReportException." );
-        }
-        catch ( Exception e )
-        {
-            assertTrue( true );
+            fail("Must throw MavenReportException.");
+        } catch (Exception e) {
+            assertTrue(true);
         }
     }
 
@@ -386,22 +369,21 @@
      * verify the pmd.xml file is included in the site when requested.
      * @throws Exception
      */
-    public void testIncludeXmlInSite()
-            throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-report-include-xml-in-site-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testIncludeXmlInSite() throws Exception {
+        File generatedReport =
+                generateReport("pmd", "default-configuration/pmd-report-include-xml-in-site-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // verify the pmd file is included in site
-        File generatedXmlFile = new File( getBasedir(), "target/test/unit/default-configuration/target/site/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedXmlFile.getAbsolutePath() ) );
+        File generatedXmlFile = new File(getBasedir(), "target/test/unit/default-configuration/target/site/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedXmlFile.getAbsolutePath()));
 
-        String pmdXmlTarget = readFile( new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" ) );
-        assertTrue( pmdXmlTarget.contains( "</pmd>" ) );
+        String pmdXmlTarget = readFile(new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml"));
+        assertTrue(pmdXmlTarget.contains("</pmd>"));
 
         // check that pmd.xml file has the closing element
-        String pmdXml = readFile( generatedXmlFile );
-        assertTrue( pmdXml.contains( "</pmd>" ) );
+        String pmdXml = readFile(generatedXmlFile);
+        assertTrue(pmdXml.contains("</pmd>"));
     }
 
     /**
@@ -411,18 +393,14 @@
      * @return a String object that contains the contents of the file
      * @throws java.io.IOException
      */
-    private String readFile( File file )
-        throws IOException
-    {
-        try ( BufferedReader reader = new BufferedReader( new FileReader( file ) ) )
-        {
-            final StringBuilder str = new StringBuilder( (int) file.length() );
+    private String readFile(File file) throws IOException {
+        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
+            final StringBuilder str = new StringBuilder((int) file.length());
 
-            for ( String line = reader.readLine(); line != null; line = reader.readLine() )
-            {
-                str.append( ' ' );
-                str.append( line );
-                str.append( '\n' );
+            for (String line = reader.readLine(); line != null; line = reader.readLine()) {
+                str.append(' ');
+                str.append(line);
+                str.append('\n');
             }
             return str.toString();
         }
@@ -433,19 +411,17 @@
      *
      * @throws Exception
      */
-    public void testLocationTemp()
-        throws Exception
-    {
+    public void testLocationTemp() throws Exception {
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml" );
-        PmdReport mojo = (PmdReport) lookupMojo( "pmd", testPom );
+        File testPom = new File(
+                getBasedir(), "src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml");
+        PmdReport mojo = (PmdReport) lookupMojo("pmd", testPom);
 
-        assertEquals( "locationTemp is not correctly encoding filename",
-                      "export_format_pmd_language_java_name_some_2520name.xml",
-                      mojo.getLocationTemp( "http://nemo.sonarsource.org/sonar/profiles/export?format=pmd&language=java&name=some%2520name" ) );
-
+        assertEquals(
+                "locationTemp is not correctly encoding filename",
+                "export_format_pmd_language_java_name_some_2520name.xml",
+                mojo.getLocationTemp(
+                        "http://nemo.sonarsource.org/sonar/profiles/export?format=pmd&language=java&name=some%2520name"));
     }
 
     /**
@@ -453,259 +429,262 @@
      *
      * @throws Exception
      */
-    public void testSuppressMarkerConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-with-suppressMarker-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testSuppressMarkerConfiguration() throws Exception {
+        File generatedReport = generateReport("pmd", "default-configuration/pmd-with-suppressMarker-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        String str = readFile( generatedFile );
+        String str = readFile(generatedFile);
 
         // check that there is no violation reported for "unusedVar2" - as it is suppressed
-        assertFalse( str.contains( "Avoid unused private fields such as 'unusedVar2'.\n </violation>" ) );
+        assertFalse(str.contains("Avoid unused private fields such as 'unusedVar2'.\n </violation>"));
         // but it appears as suppressed
-        assertTrue( str.contains( "suppressiontype=\"nopmd\" msg=\"Avoid unused private fields such as 'unusedVar2'.\"" ));
+        assertTrue(str.contains("suppressiontype=\"nopmd\" msg=\"Avoid unused private fields such as 'unusedVar2'.\""));
 
         // check if there's a link to the JXR files
-        str = readFile( generatedReport );
+        str = readFile(generatedReport);
 
-        assertTrue( str.contains( "/xref/def/configuration/AppSample.html#L27" ) );
+        assertTrue(str.contains("/xref/def/configuration/AppSample.html#L27"));
         // suppressed violation
-        assertTrue( str.contains( "Avoid unused private fields such as 'unusedVar2'." ) );
+        assertTrue(str.contains("Avoid unused private fields such as 'unusedVar2'."));
     }
 
-    public void testSuppressMarkerConfigurationWithoutRendering()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-with-suppressMarker-no-render-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testSuppressMarkerConfigurationWithoutRendering() throws Exception {
+        File generatedReport =
+                generateReport("pmd", "default-configuration/pmd-with-suppressMarker-no-render-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        String str = readFile( generatedFile );
+        String str = readFile(generatedFile);
 
         // check that there is no violation reported for "unusedVar2" - as it is suppressed
-        assertFalse( str.contains( "Avoid unused private fields such as 'unusedVar2'.\n </violation>" ) );
+        assertFalse(str.contains("Avoid unused private fields such as 'unusedVar2'.\n </violation>"));
         // but it appears as suppressed
-        assertTrue( str.contains( "suppressiontype=\"nopmd\" msg=\"Avoid unused private fields such as 'unusedVar2'.\"" ));
+        assertTrue(str.contains("suppressiontype=\"nopmd\" msg=\"Avoid unused private fields such as 'unusedVar2'.\""));
 
         // check if there's a link to the JXR files
-        str = readFile( generatedReport );
+        str = readFile(generatedReport);
 
-        assertTrue( str.contains( "/xref/def/configuration/AppSample.html#L27" ) );
+        assertTrue(str.contains("/xref/def/configuration/AppSample.html#L27"));
         // suppressed violations are not rendered
-        assertFalse( str.contains( "Avoid unused private fields such as 'unusedVar2'." ) );
+        assertFalse(str.contains("Avoid unused private fields such as 'unusedVar2'."));
     }
 
-    public void testJspConfiguration()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "default-configuration/jsp-configuration-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testJspConfiguration() throws Exception {
+        File generatedReport = generateReport("pmd", "default-configuration/jsp-configuration-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         // check if the PMD files were generated
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         // these are the rulesets, that have been applied...
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/codestyle.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/codestyle.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/design.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/design.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/errorprone.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/errorprone.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/security.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/security.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
         assertTrue(str.contains("JSP file should use UTF-8 encoding"));
         assertTrue(str.contains("Using unsanitized JSP expression can lead to Cross Site Scripting (XSS) attacks"));
         assertTrue(str.contains("Avoid having style information in JSP files."));
     }
 
-    public void testPMDProcessingError()
-        throws Exception
-    {
+    public void testPMDProcessingError() throws Exception {
         try {
-            generateReport( "pmd", "processing-error/pmd-processing-error-plugin-config.xml" );
+            generateReport("pmd", "processing-error/pmd-processing-error-plugin-config.xml");
             fail("Expected exception");
         } catch (RuntimeException e) {
-            assertTrue( e.getMessage().endsWith( "Found 1 PMD processing errors" ) );
+            assertTrue(e.getMessage().endsWith("Found 1 PMD processing errors"));
         }
     }
 
-    public void testPMDProcessingErrorWithDetailsSkipped()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "processing-error/pmd-processing-error-skip-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testPMDProcessingErrorWithDetailsSkipped() throws Exception {
+        File generatedReport = generateReport("pmd", "processing-error/pmd-processing-error-skip-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         String output = CapturingPrintStream.getOutput();
-        assertTrue ( output.contains( "There are 1 PMD processing errors:" ) );
+        assertTrue(output.contains("There are 1 PMD processing errors:"));
 
-        File generatedFile = new File( getBasedir(), "target/test/unit/parse-error/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
-        assertTrue( str.contains( "Error while parsing" ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/parse-error/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        String str = readFile(generatedFile);
+        assertTrue(str.contains("Error while parsing"));
         // The parse exception must be in the XML report
-        assertTrue( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
+        assertTrue(str.contains("ParseException: Encountered \"\" at line 23, column 5."));
 
-        str = readFile( generatedReport );
+        str = readFile(generatedReport);
         // The parse exception must also be in the HTML report
-        assertTrue( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
+        assertTrue(str.contains("ParseException: Encountered \"\" at line 23, column 5."));
     }
 
-    public void testPMDProcessingErrorWithDetailsNoReport()
-        throws Exception
-    {
-        File generatedReport = generateReport( "pmd", "processing-error/pmd-processing-error-no-report-plugin-config.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+    public void testPMDProcessingErrorWithDetailsNoReport() throws Exception {
+        File generatedReport =
+                generateReport("pmd", "processing-error/pmd-processing-error-no-report-plugin-config.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
         String output = CapturingPrintStream.getOutput();
-        assertTrue ( output.contains( "There are 1 PMD processing errors:" ) );
+        assertTrue(output.contains("There are 1 PMD processing errors:"));
 
-        File generatedFile = new File( getBasedir(), "target/test/unit/parse-error/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
-        assertTrue( str.contains( "Error while parsing" ) );
+        File generatedFile = new File(getBasedir(), "target/test/unit/parse-error/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        String str = readFile(generatedFile);
+        assertTrue(str.contains("Error while parsing"));
         // The parse exception must be in the XML report
-        assertTrue( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
+        assertTrue(str.contains("ParseException: Encountered \"\" at line 23, column 5."));
 
-        str = readFile( generatedReport );
+        str = readFile(generatedReport);
         // The parse exception must NOT be in the HTML report, since reportProcessingErrors is false
-        assertFalse( str.contains( "ParseException: Encountered \"\" at line 23, column 5." ) );
+        assertFalse(str.contains("ParseException: Encountered \"\" at line 23, column 5."));
     }
 
-    public void testPMDExcludeRootsShouldExcludeSubdirectories()
-        throws Exception
-    {
-        generateReport( "pmd", "exclude-roots/pmd-exclude-roots-plugin-config.xml" );
+    public void testPMDExcludeRootsShouldExcludeSubdirectories() throws Exception {
+        generateReport("pmd", "exclude-roots/pmd-exclude-roots-plugin-config.xml");
 
-        File generatedFile = new File( getBasedir(), "target/test/unit/exclude-roots/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
+        File generatedFile = new File(getBasedir(), "target/test/unit/exclude-roots/target/pmd.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
+        String str = readFile(generatedFile);
 
-        assertTrue( "Seems like all directories are excluded now", str.contains( "ForLoopShouldBeWhileLoop" ) );
-        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") );
+        assertTrue("Seems like all directories are excluded now", str.contains("ForLoopShouldBeWhileLoop"));
+        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
-    {
-        generateReport( "pmd", "default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml" );
+    public void testViolationExclusion() throws Exception {
+        generateReport("pmd", "default-configuration/pmd-report-pmd-exclusions-configuration-plugin-config.xml");
 
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
-        String str = readFile( generatedFile );
+        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"));
     }
 
-    public void testCustomRenderer() throws MavenReportException
-    {
-        final Renderer renderer = PmdExecutor.createRenderer( "net.sourceforge.pmd.renderers.TextRenderer", "UTF-8" );
+    public void testCustomRenderer() throws MavenReportException {
+        final Renderer renderer = PmdExecutor.createRenderer("net.sourceforge.pmd.renderers.TextRenderer", "UTF-8");
         assertNotNull(renderer);
     }
 
-    public void testCodeClimateRenderer() throws MavenReportException
-    {
-        final Renderer renderer = PmdExecutor.createRenderer( "net.sourceforge.pmd.renderers.CodeClimateRenderer", "UTF-8" );
+    public void testCodeClimateRenderer() throws MavenReportException {
+        final Renderer renderer =
+                PmdExecutor.createRenderer("net.sourceforge.pmd.renderers.CodeClimateRenderer", "UTF-8");
         assertNotNull(renderer);
     }
 
-    public void testPmdReportCustomRulesNoExternalInfoUrl()
-            throws Exception
-    {
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+    public void testPmdReportCustomRulesNoExternalInfoUrl() throws Exception {
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
-        File generatedReport = generateReport( "pmd", "default-configuration/pmd-report-custom-rules.xml" );
-        assertTrue( FileUtils.fileExists( generatedReport.getAbsolutePath() ) );
+        File generatedReport = generateReport("pmd", "default-configuration/pmd-report-custom-rules.xml");
+        assertTrue(FileUtils.fileExists(generatedReport.getAbsolutePath()));
 
-        String str = readFile( generatedReport );
+        String str = readFile(generatedReport);
 
         // custom rule without link
-        assertEquals( 2, StringUtils.countMatches( str, "<td>CustomRule</td>" ) );
+        assertEquals(2, StringUtils.countMatches(str, "<td>CustomRule</td>"));
         // standard rule with link
-        assertEquals( 4, StringUtils.countMatches( str, "\">UnusedPrivateField</a></td>" ) );
+        assertEquals(4, StringUtils.countMatches(str, "\">UnusedPrivateField</a></td>"));
     }
 
-    public void testPmdReportResolveRulesets()
-            throws Exception
-    {
+    public void testPmdReportResolveRulesets() throws Exception {
         int port = determineFreePort();
-        WireMockServer mockServer = new WireMockServer( port );
+        WireMockServer mockServer = new WireMockServer(port);
         mockServer.start();
 
-        String sonarRuleset =
-            IOUtils.toString( getClass().getClassLoader().getResourceAsStream( "unit/default-configuration/rulesets/sonar-way-ruleset.xml" ),
-                    StandardCharsets.UTF_8 );
+        String sonarRuleset = IOUtils.toString(
+                getClass()
+                        .getClassLoader()
+                        .getResourceAsStream("unit/default-configuration/rulesets/sonar-way-ruleset.xml"),
+                StandardCharsets.UTF_8);
 
         final String sonarProfileUrl = "/profiles/export?format=pmd&language=java&name=Sonar%2520way";
         final String sonarExportRulesetUrl = "http://localhost:" + mockServer.port() + sonarProfileUrl;
         final String myRulesetBaseUrl = "/config/my-ruleset.xml";
         final String myRulesetUrl = "http://localhost:" + mockServer.port() + myRulesetBaseUrl;
-        final String notAInternalRulesetBaseUrl = "/projects/OURPROJECT/repos/ourproject-pmd/raw/InProgressRuleset.xml?at=refs%2Fheads%2Fmaster";
+        final String notAInternalRulesetBaseUrl =
+                "/projects/OURPROJECT/repos/ourproject-pmd/raw/InProgressRuleset.xml?at=refs%2Fheads%2Fmaster";
         final String notAInternalRulesetUrl = "http://localhost:" + mockServer.port() + notAInternalRulesetBaseUrl;
 
-        WireMock.configureFor( "localhost", port );
-        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) )
-                .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
-                                                                                "text/xml" ).withBody( sonarRuleset ) ) );
-        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( myRulesetBaseUrl ) )
-                .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
-                                                                                "text/xml" ).withBody( sonarRuleset ) ) );
-        WireMock.stubFor( WireMock.get( WireMock.urlEqualTo( notAInternalRulesetBaseUrl ) )
-                .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
-                                                                                "text/xml" ).withBody( sonarRuleset ) ) );
+        WireMock.configureFor("localhost", port);
+        WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(sonarProfileUrl))
+                .willReturn(WireMock.aResponse()
+                        .withStatus(200)
+                        .withHeader("Content-Type", "text/xml")
+                        .withBody(sonarRuleset)));
+        WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(myRulesetBaseUrl))
+                .willReturn(WireMock.aResponse()
+                        .withStatus(200)
+                        .withHeader("Content-Type", "text/xml")
+                        .withBody(sonarRuleset)));
+        WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(notAInternalRulesetBaseUrl))
+                .willReturn(WireMock.aResponse()
+                        .withStatus(200)
+                        .withHeader("Content-Type", "text/xml")
+                        .withBody(sonarRuleset)));
 
-        FileUtils.copyDirectoryStructure( new File( getBasedir(),
-                                                    "src/test/resources/unit/default-configuration/jxr-files" ),
-                                          new File( getBasedir(), "target/test/unit/default-configuration/target/site" ) );
+        FileUtils.copyDirectoryStructure(
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/jxr-files"),
+                new File(getBasedir(), "target/test/unit/default-configuration/target/site"));
 
         File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml" );
-        PmdReport mojo = (PmdReport) createReportMojo( "pmd", testPom );
+                new File(getBasedir(), "src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml");
+        PmdReport mojo = (PmdReport) createReportMojo("pmd", testPom);
         mojo.rulesets[3] = sonarExportRulesetUrl;
         mojo.rulesets[4] = myRulesetUrl;
         mojo.rulesets[5] = notAInternalRulesetUrl;
-        generateReport( mojo, testPom );
+        generateReport(mojo, testPom);
 
         // these are the rulesets, that have been copied to target/pmd/rulesets
-        File generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/custom-rules.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        File generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/custom-rules.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/bestpractices.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/java-design.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/java-design.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/export_format_pmd_language_java_name_Sonar_2520way.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(
+                getBasedir(),
+                "target/test/unit/default-configuration/target/pmd/rulesets/export_format_pmd_language_java_name_Sonar_2520way.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/my-ruleset.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile =
+                new File(getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/my-ruleset.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
-        generatedFile = new File( getBasedir(), "target/test/unit/default-configuration/target/pmd/rulesets/InProgressRuleset.xml_at_refs_2Fheads_2Fmaster.xml" );
-        assertTrue( FileUtils.fileExists( generatedFile.getAbsolutePath() ) );
+        generatedFile = new File(
+                getBasedir(),
+                "target/test/unit/default-configuration/target/pmd/rulesets/InProgressRuleset.xml_at_refs_2Fheads_2Fmaster.xml");
+        assertTrue(FileUtils.fileExists(generatedFile.getAbsolutePath()));
 
         mockServer.stop();
     }
-
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojoTest.java b/src/test/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojoTest.java
index e97fc8a..b47508b 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/PmdViolationCheckMojoTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd;
 
 import java.io.File;
 
@@ -27,154 +26,119 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class PmdViolationCheckMojoTest
-    extends AbstractPmdReportTestCase
-{
+public class PmdViolationCheckMojoTest extends AbstractPmdReportTestCase {
 
-    public void testDefaultConfiguration()
-        throws Exception
-    {
-        generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
+    public void testDefaultConfiguration() throws Exception {
+        generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
 
         // clear the output from previous pmd:pmd execution
-        CapturingPrintStream.init( true );
+        CapturingPrintStream.init(true);
 
-        try
-        {
-            final File testPom =
-                new File( getBasedir(),
-                          "src/test/resources/unit/default-configuration/pmd-check-default-configuration-plugin-config.xml" );
-            final PmdViolationCheckMojo mojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        try {
+            final File testPom = new File(
+                    getBasedir(),
+                    "src/test/resources/unit/default-configuration/pmd-check-default-configuration-plugin-config.xml");
+            final PmdViolationCheckMojo mojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
             mojo.execute();
 
-            fail( "MojoFailureException should be thrown." );
-        }
-        catch ( final Exception e )
-        {
+            fail("MojoFailureException should be thrown.");
+        } catch (final Exception e) {
             // the version should be logged
             String output = CapturingPrintStream.getOutput();
-            assertTrue ( output.contains( "PMD version: " + AbstractPmdReport.getPmdVersion() ) );
+            assertTrue(output.contains("PMD version: " + AbstractPmdReport.getPmdVersion()));
 
-            assertTrue( e.getMessage().startsWith( "You have 8 PMD violations." ) );
+            assertTrue(e.getMessage().startsWith("You have 8 PMD violations."));
         }
     }
 
-    public void testNotFailOnViolation()
-        throws Exception
-    {
-        generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
+    public void testNotFailOnViolation() throws Exception {
+        generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-check-notfailonviolation-plugin-config.xml" );
-        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-notfailonviolation-plugin-config.xml");
+        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
         pmdViolationMojo.execute();
 
-        assertTrue( true );
+        assertTrue(true);
     }
 
-    public void testMaxAllowedViolations()
-        throws Exception
-    {
-        generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
+    public void testMaxAllowedViolations() throws Exception {
+        generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                "src/test/resources/unit/default-configuration/pmd-check-notfailmaxviolation-plugin-config.xml" );
-        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-notfailmaxviolation-plugin-config.xml");
+        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
         pmdViolationMojo.execute();
 
-        testPom =
-            new File( getBasedir(),
-                "src/test/resources/unit/default-configuration/pmd-check-failmaxviolation-plugin-config.xml" );
-        final PmdViolationCheckMojo pmdViolationMojoFail = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-failmaxviolation-plugin-config.xml");
+        final PmdViolationCheckMojo pmdViolationMojoFail = (PmdViolationCheckMojo) lookupMojo("check", testPom);
 
-        try
-        {
+        try {
             pmdViolationMojoFail.execute();
-            fail( "Exception Expected" );
-        }
-        catch ( final MojoFailureException e )
-        {
+            fail("Exception Expected");
+        } catch (final MojoFailureException e) {
             String message = e.getMessage();
-            if ( message.contains( "You have 5 PMD violations and 3 warnings." ) )
-            {
-                System.out.println( "Caught expected message: " + e.getMessage() );// expected
-            }
-            else
-            {
-                throw new AssertionError( "Expected: '" + message
-                    + "' to contain 'You have 5 PMD violations and 3 warnings.'" );
+            if (message.contains("You have 5 PMD violations and 3 warnings.")) {
+                System.out.println("Caught expected message: " + e.getMessage()); // expected
+            } else {
+                throw new AssertionError(
+                        "Expected: '" + message + "' to contain 'You have 5 PMD violations and 3 warnings.'");
             }
         }
-
     }
 
-    public void testFailurePriority()
-        throws Exception
-    {
-        generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
+    public void testFailurePriority() throws Exception {
+        generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-check-failonpriority-plugin-config.xml" );
-        PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-failonpriority-plugin-config.xml");
+        PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
         pmdViolationMojo.execute();
 
-        testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-check-failandwarnonpriority-plugin-config.xml" );
-        pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
-        try
-        {
+        testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-failandwarnonpriority-plugin-config.xml");
+        pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
+        try {
             pmdViolationMojo.execute();
-            fail( "Exception Expected" );
-        }
-        catch ( final MojoFailureException e )
-        {
+            fail("Exception Expected");
+        } catch (final MojoFailureException e) {
             String message = e.getMessage();
-            if ( message.contains( "You have 5 PMD violations and 3 warnings." ) )
-            {
-                System.out.println( "Caught expected message: " + e.getMessage() );// expected
-            }
-            else
-            {
-                throw new AssertionError( "Expected: '" + message
-                    + "' to contain 'You have 5 PMD violations and 3 warnings.'" );
+            if (message.contains("You have 5 PMD violations and 3 warnings.")) {
+                System.out.println("Caught expected message: " + e.getMessage()); // expected
+            } else {
+                throw new AssertionError(
+                        "Expected: '" + message + "' to contain 'You have 5 PMD violations and 3 warnings.'");
             }
         }
-
     }
 
-    public void testException()
-        throws Exception
-    {
-        try
-        {
-            final File testPom =
-                new File( getBasedir(),
-                          "src/test/resources/unit/custom-configuration/pmd-check-exception-test-plugin-config.xml" );
-            final PmdViolationCheckMojo mojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+    public void testException() throws Exception {
+        try {
+            final File testPom = new File(
+                    getBasedir(),
+                    "src/test/resources/unit/custom-configuration/pmd-check-exception-test-plugin-config.xml");
+            final PmdViolationCheckMojo mojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
             mojo.execute();
 
-            fail( "MojoFailureException should be thrown." );
+            fail("MojoFailureException should be thrown.");
+        } catch (final Exception e) {
+            assertTrue(true);
         }
-        catch ( final Exception e )
-        {
-            assertTrue( true );
-        }
-
     }
 
-    public void testViolationExclusion()
-        throws Exception
-    {
-        generateReport( "pmd", "default-configuration/default-configuration-plugin-config.xml" );
+    public void testViolationExclusion() throws Exception {
+        generateReport("pmd", "default-configuration/default-configuration-plugin-config.xml");
 
-        File testPom =
-            new File( getBasedir(),
-                      "src/test/resources/unit/default-configuration/pmd-check-pmd-exclusions-configuration-plugin-config.xml" );
-        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo( "check", testPom );
+        File testPom = new File(
+                getBasedir(),
+                "src/test/resources/unit/default-configuration/pmd-check-pmd-exclusions-configuration-plugin-config.xml");
+        final PmdViolationCheckMojo pmdViolationMojo = (PmdViolationCheckMojo) lookupMojo("check", testPom);
 
         // this call shouldn't throw an exception, as the classes with violations have been excluded
         pmdViolationMojo.execute();
diff --git a/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java b/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
index d63eecb..fadd719 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/exec/ExecutorTest.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.exec;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,31 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.exec;
 
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 
-import org.apache.commons.lang3.SystemUtils;
-
 import junit.framework.Assert;
 import junit.framework.TestCase;
+import org.apache.commons.lang3.SystemUtils;
 
-public class ExecutorTest extends TestCase
-{
+public class ExecutorTest extends TestCase {
     public void testBuildClasspath() throws MalformedURLException {
         String basename = "home/test/dir with space/mylib.jar";
         String pathname = new File("/", basename).getPath();
-        if ( SystemUtils.IS_OS_WINDOWS )
-        {
-            pathname = new File( File.listRoots()[0], basename ).getPath();
+        if (SystemUtils.IS_OS_WINDOWS) {
+            pathname = new File(File.listRoots()[0], basename).getPath();
         }
-        URL[] urls = new URL[] { new File(pathname).toURI().toURL() };
-        URLClassLoader mockedClassLoader = new URLClassLoader( urls );
+        URL[] urls = new URL[] {new File(pathname).toURI().toURL()};
+        URLClassLoader mockedClassLoader = new URLClassLoader(urls);
 
         StringBuilder classpath = new StringBuilder();
         Executor.buildClasspath(classpath, mockedClassLoader);
-        Assert.assertEquals( pathname + File.pathSeparator, classpath.toString() );
+        Assert.assertEquals(pathname + File.pathSeparator, classpath.toString());
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/CustomConfigurationMavenProjectStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/CustomConfigurationMavenProjectStub.java
index 4fe1d67..93609dc 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/CustomConfigurationMavenProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/CustomConfigurationMavenProjectStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import java.io.File;
 import java.io.FileReader;
@@ -35,85 +34,73 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class CustomConfigurationMavenProjectStub
-    extends PmdProjectStub
-{
+public class CustomConfigurationMavenProjectStub extends PmdProjectStub {
     private Build build;
 
     private List<ReportPlugin> reportPlugins = new ArrayList<>();
 
-    public CustomConfigurationMavenProjectStub()
-    {
+    public CustomConfigurationMavenProjectStub() {
         MavenXpp3Reader pomReader = new MavenXpp3Reader();
         Model model = null;
 
-        try
-        {
-            model =
-                pomReader.read( new FileReader( new File( getBasedir()
-                    + "/src/test/resources/unit/custom-configuration/custom-configuration-plugin-config.xml" ) ) );
-            setModel( model );
-        }
-        catch ( Exception e )
-        {
+        try {
+            model = pomReader.read(new FileReader(new File(getBasedir()
+                    + "/src/test/resources/unit/custom-configuration/custom-configuration-plugin-config.xml")));
+            setModel(model);
+        } catch (Exception e) {
 
         }
 
-        setGroupId( model.getGroupId() );
-        setArtifactId( model.getArtifactId() );
-        setVersion( model.getVersion() );
-        setName( model.getName() );
-        setUrl( model.getUrl() );
-        setPackaging( model.getPackaging() );
+        setGroupId(model.getGroupId());
+        setArtifactId(model.getArtifactId());
+        setVersion(model.getVersion());
+        setName(model.getName());
+        setUrl(model.getUrl());
+        setPackaging(model.getPackaging());
 
         Scm scm = new Scm();
-        scm.setConnection( "scm:svn:http://svn.apache.org/maven/sample/trunk" );
-        setScm( scm );
+        scm.setConnection("scm:svn:http://svn.apache.org/maven/sample/trunk");
+        setScm(scm);
 
         Build build = new Build();
-        build.setFinalName( model.getBuild().getFinalName() );
-        build.setDirectory( getBasedir() + "/target/test/unit/custom-configuration/target" );
-        build.setSourceDirectory( getBasedir() + "/src/test/resources/unit/custom-configuration" );
-        setBuild( build );
+        build.setFinalName(model.getBuild().getFinalName());
+        build.setDirectory(getBasedir() + "/target/test/unit/custom-configuration/target");
+        build.setSourceDirectory(getBasedir() + "/src/test/resources/unit/custom-configuration");
+        setBuild(build);
 
-        setReportPlugins( model.getReporting().getPlugins() );
+        setReportPlugins(model.getReporting().getPlugins());
 
         String basedir = getBasedir().getAbsolutePath();
         List<String> compileSourceRoots = new ArrayList<>();
-        compileSourceRoots.add( basedir + "/src/test/resources/unit/custom-configuration/custom/configuration" );
-        setCompileSourceRoots( compileSourceRoots );
+        compileSourceRoots.add(basedir + "/src/test/resources/unit/custom-configuration/custom/configuration");
+        setCompileSourceRoots(compileSourceRoots);
 
-        Artifact artifact = new PmdPluginArtifactStub( getGroupId(), getArtifactId(), getVersion(), getPackaging() );
-        artifact.setArtifactHandler( new DefaultArtifactHandlerStub() );
-        setArtifact( artifact );
+        Artifact artifact = new PmdPluginArtifactStub(getGroupId(), getArtifactId(), getVersion(), getPackaging());
+        artifact.setArtifactHandler(new DefaultArtifactHandlerStub());
+        setArtifact(artifact);
 
-        setFile( new File( getBasedir().getAbsolutePath() + "/pom.xml" ) );
+        setFile(new File(getBasedir().getAbsolutePath() + "/pom.xml"));
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setBuild( Build build )
-    {
+    public void setBuild(Build build) {
         this.build = build;
     }
 
     /** {@inheritDoc} */
     @Override
-    public Build getBuild()
-    {
+    public Build getBuild() {
         return build;
     }
 
-    public void setReportPlugins( List<ReportPlugin> plugins )
-    {
+    public void setReportPlugins(List<ReportPlugin> plugins) {
         this.reportPlugins = plugins;
     }
 
     /** {@inheritDoc} */
     @Override
-    public List<ReportPlugin> getReportPlugins()
-    {
+    public List<ReportPlugin> getReportPlugins() {
         return reportPlugins;
     }
-
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultArtifactHandlerStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultArtifactHandlerStub.java
index 4e9d7a9..388d4c5 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultArtifactHandlerStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultArtifactHandlerStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 
@@ -25,25 +24,20 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class DefaultArtifactHandlerStub
-    extends DefaultArtifactHandler
-{
+public class DefaultArtifactHandlerStub extends DefaultArtifactHandler {
     private String language;
 
     /** {@inheritDoc} */
     @Override
-    public String getLanguage()
-    {
-        if ( language == null )
-        {
+    public String getLanguage() {
+        if (language == null) {
             language = "java";
         }
 
         return language;
     }
 
-    public void setLanguage( String language )
-    {
+    public void setLanguage(String language) {
         this.language = language;
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultConfigurationMavenProjectStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultConfigurationMavenProjectStub.java
index daac795..b16da8d 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultConfigurationMavenProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/DefaultConfigurationMavenProjectStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import java.io.File;
 import java.io.FileReader;
@@ -35,87 +34,74 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class DefaultConfigurationMavenProjectStub
-    extends PmdProjectStub
-{
+public class DefaultConfigurationMavenProjectStub extends PmdProjectStub {
     private List<ReportPlugin> reportPlugins = new ArrayList<>();
 
     private Build build;
 
-    public DefaultConfigurationMavenProjectStub()
-    {
+    public DefaultConfigurationMavenProjectStub() {
         MavenXpp3Reader pomReader = new MavenXpp3Reader();
         Model model = null;
 
-        try ( FileReader reader = new FileReader( new File( getBasedir()
-            + "/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml" ) ) )
-        {
-            model = pomReader.read( reader );
-            setModel( model );
-        }
-        catch ( Exception e )
-        {
+        try (FileReader reader = new FileReader(new File(getBasedir()
+                + "/src/test/resources/unit/default-configuration/default-configuration-plugin-config.xml"))) {
+            model = pomReader.read(reader);
+            setModel(model);
+        } catch (Exception e) {
 
         }
 
-        setGroupId( model.getGroupId() );
-        setArtifactId( model.getArtifactId() );
-        setVersion( model.getVersion() );
-        setName( model.getName() );
-        setUrl( model.getUrl() );
-        setPackaging( model.getPackaging() );
+        setGroupId(model.getGroupId());
+        setArtifactId(model.getArtifactId());
+        setVersion(model.getVersion());
+        setName(model.getName());
+        setUrl(model.getUrl());
+        setPackaging(model.getPackaging());
 
         Scm scm = new Scm();
-        scm.setConnection( "scm:svn:http://svn.apache.org/maven/sample/trunk" );
-        setScm( scm );
+        scm.setConnection("scm:svn:http://svn.apache.org/maven/sample/trunk");
+        setScm(scm);
 
         Build build = new Build();
-        build.setFinalName( model.getBuild()
-                                 .getFinalName() );
-        build.setDirectory( getBasedir() + "/target/test/unit/default-configuration/target" );
-        build.setSourceDirectory( getBasedir() + "/src/test/resources/unit/default-configuration" );
-        setBuild( build );
+        build.setFinalName(model.getBuild().getFinalName());
+        build.setDirectory(getBasedir() + "/target/test/unit/default-configuration/target");
+        build.setSourceDirectory(getBasedir() + "/src/test/resources/unit/default-configuration");
+        setBuild(build);
 
-        setReportPlugins( model.getReporting()
-                               .getPlugins() );
+        setReportPlugins(model.getReporting().getPlugins());
 
         String basedir = getBasedir().getAbsolutePath();
         List<String> compileSourceRoots = new ArrayList<>();
-        compileSourceRoots.add( basedir + "/src/test/resources/unit/default-configuration/def/configuration" );
-        setCompileSourceRoots( compileSourceRoots );
+        compileSourceRoots.add(basedir + "/src/test/resources/unit/default-configuration/def/configuration");
+        setCompileSourceRoots(compileSourceRoots);
 
-        File file = new File( getBasedir().getAbsolutePath() + "/pom.xml" );
-        setFile( file );
+        File file = new File(getBasedir().getAbsolutePath() + "/pom.xml");
+        setFile(file);
 
-        Artifact artifact = new PmdPluginArtifactStub( getGroupId(), getArtifactId(), getVersion(), getPackaging() );
-        artifact.setArtifactHandler( new DefaultArtifactHandlerStub() );
-        setArtifact( artifact );
-
+        Artifact artifact = new PmdPluginArtifactStub(getGroupId(), getArtifactId(), getVersion(), getPackaging());
+        artifact.setArtifactHandler(new DefaultArtifactHandlerStub());
+        setArtifact(artifact);
     }
 
-    public void setReportPlugins( List<ReportPlugin> plugins )
-    {
+    public void setReportPlugins(List<ReportPlugin> plugins) {
         this.reportPlugins = plugins;
     }
 
     /** {@inheritDoc} */
     @Override
-    public List<ReportPlugin> getReportPlugins()
-    {
+    public List<ReportPlugin> getReportPlugins() {
         return reportPlugins;
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setBuild( Build build )
-    {
+    public void setBuild(Build build) {
         this.build = build;
     }
 
     /** {@inheritDoc} */
     @Override
-    public Build getBuild()
-    {
+    public Build getBuild() {
         return build;
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/InvalidFormatMavenProjectStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/InvalidFormatMavenProjectStub.java
index f700313..c08e19c 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/InvalidFormatMavenProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/InvalidFormatMavenProjectStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import java.io.File;
 import java.io.FileReader;
@@ -34,70 +33,59 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class InvalidFormatMavenProjectStub
-    extends PmdProjectStub
-{
+public class InvalidFormatMavenProjectStub extends PmdProjectStub {
     private Build build;
 
-    public InvalidFormatMavenProjectStub()
-    {
+    public InvalidFormatMavenProjectStub() {
         MavenXpp3Reader pomReader = new MavenXpp3Reader();
         Model model = null;
 
-        try
-        {
-            model =
-                pomReader.read( new FileReader( new File( getBasedir()
-                    + "/src/test/resources/unit/invalid-format/invalid-format-plugin-config.xml" ) ) );
-            setModel( model );
-        }
-        catch ( Exception e )
-        {
+        try {
+            model = pomReader.read(new FileReader(new File(
+                    getBasedir() + "/src/test/resources/unit/invalid-format/invalid-format-plugin-config.xml")));
+            setModel(model);
+        } catch (Exception e) {
 
         }
 
-        setGroupId( model.getGroupId() );
-        setArtifactId( model.getArtifactId() );
-        setVersion( model.getVersion() );
-        setName( model.getName() );
-        setUrl( model.getUrl() );
-        setPackaging( model.getPackaging() );
+        setGroupId(model.getGroupId());
+        setArtifactId(model.getArtifactId());
+        setVersion(model.getVersion());
+        setName(model.getName());
+        setUrl(model.getUrl());
+        setPackaging(model.getPackaging());
 
         Scm scm = new Scm();
-        scm.setConnection( "scm:svn:http://svn.apache.org/maven/sample/trunk" );
-        setScm( scm );
+        scm.setConnection("scm:svn:http://svn.apache.org/maven/sample/trunk");
+        setScm(scm);
 
         Build build = new Build();
-        build.setFinalName( model.getBuild().getFinalName() );
-        build.setDirectory( getBasedir() + "/target/test/unit/invalid-format/target" );
-        build.setSourceDirectory( getBasedir() + "/src/test/resources/unit/invalid-format" );
-        setBuild( build );
+        build.setFinalName(model.getBuild().getFinalName());
+        build.setDirectory(getBasedir() + "/target/test/unit/invalid-format/target");
+        build.setSourceDirectory(getBasedir() + "/src/test/resources/unit/invalid-format");
+        setBuild(build);
 
         String basedir = getBasedir().getAbsolutePath();
         List<String> compileSourceRoots = new ArrayList<>();
-        compileSourceRoots.add( basedir + "/src/test/resources/unit/invalid-format/invalid/format" );
-        setCompileSourceRoots( compileSourceRoots );
+        compileSourceRoots.add(basedir + "/src/test/resources/unit/invalid-format/invalid/format");
+        setCompileSourceRoots(compileSourceRoots);
 
-        Artifact artifact = new PmdPluginArtifactStub( getGroupId(), getArtifactId(), getVersion(), getPackaging() );
-        artifact.setArtifactHandler( new DefaultArtifactHandlerStub() );
-        setArtifact( artifact );
+        Artifact artifact = new PmdPluginArtifactStub(getGroupId(), getArtifactId(), getVersion(), getPackaging());
+        artifact.setArtifactHandler(new DefaultArtifactHandlerStub());
+        setArtifact(artifact);
 
-        setFile( new File( getBasedir().getAbsolutePath() + "/pom.xml" ) );
-
+        setFile(new File(getBasedir().getAbsolutePath() + "/pom.xml"));
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setBuild( Build build )
-    {
+    public void setBuild(Build build) {
         this.build = build;
     }
 
     /** {@inheritDoc} */
     @Override
-    public Build getBuild()
-    {
+    public Build getBuild() {
         return build;
     }
-
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdPluginArtifactStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdPluginArtifactStub.java
index 7ce2471..89df085 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdPluginArtifactStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdPluginArtifactStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.versioning.VersionRange;
@@ -27,9 +26,7 @@
  * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
  * @version $Id$
  */
-public class PmdPluginArtifactStub
-    extends ArtifactStub
-{
+public class PmdPluginArtifactStub extends ArtifactStub {
     private String groupId;
 
     private String artifactId;
@@ -42,92 +39,79 @@
 
     private ArtifactHandler handler;
 
-    public PmdPluginArtifactStub( String groupId, String artifactId, String version, String packaging )
-    {
+    public PmdPluginArtifactStub(String groupId, String artifactId, String version, String packaging) {
         this.groupId = groupId;
         this.artifactId = artifactId;
         this.version = version;
         this.packaging = packaging;
-        versionRange = VersionRange.createFromVersion( version );
+        versionRange = VersionRange.createFromVersion(version);
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setGroupId( String groupId )
-    {
+    public void setGroupId(String groupId) {
         this.groupId = groupId;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getGroupId()
-    {
+    public String getGroupId() {
         return groupId;
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setArtifactId( String artifactId )
-    {
+    public void setArtifactId(String artifactId) {
         this.artifactId = artifactId;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getArtifactId()
-    {
+    public String getArtifactId() {
         return artifactId;
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setVersion( String version )
-    {
+    public void setVersion(String version) {
         this.version = version;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getVersion()
-    {
+    public String getVersion() {
         return version;
     }
 
-    public void setPackaging( String packaging )
-    {
+    public void setPackaging(String packaging) {
         this.packaging = packaging;
     }
 
-    public String getPackaging()
-    {
+    public String getPackaging() {
         return packaging;
     }
 
     /** {@inheritDoc} */
     @Override
-    public VersionRange getVersionRange()
-    {
+    public VersionRange getVersionRange() {
         return versionRange;
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setVersionRange( VersionRange versionRange )
-    {
+    public void setVersionRange(VersionRange versionRange) {
         this.versionRange = versionRange;
     }
 
     /** {@inheritDoc} */
     @Override
-    public ArtifactHandler getArtifactHandler()
-    {
+    public ArtifactHandler getArtifactHandler() {
         return handler;
     }
 
     /** {@inheritDoc} */
     @Override
-    public void setArtifactHandler( ArtifactHandler handler )
-    {
+    public void setArtifactHandler(ArtifactHandler handler) {
         this.handler = handler;
     }
 }
diff --git a/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdProjectStub.java b/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdProjectStub.java
index 0b8f6f9..fd34c4f 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/stubs/PmdProjectStub.java
@@ -1,5 +1,3 @@
-package org.apache.maven.plugins.pmd.stubs;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -9,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.maven.plugins.pmd.stubs;
 
 import java.util.Collections;
 import java.util.List;
@@ -28,15 +27,16 @@
 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 
-public abstract class PmdProjectStub
-    extends MavenProjectStub
-{
+public abstract class PmdProjectStub extends MavenProjectStub {
     @Override
-    public List<ArtifactRepository> getRemoteArtifactRepositories()
-    {
-        ArtifactRepository repository = new MavenArtifactRepository( "central", "https://repo1.maven.org/maven2",
-                                                                       new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(), new ArtifactRepositoryPolicy() );
+    public List<ArtifactRepository> getRemoteArtifactRepositories() {
+        ArtifactRepository repository = new MavenArtifactRepository(
+                "central",
+                "https://repo1.maven.org/maven2",
+                new DefaultRepositoryLayout(),
+                new ArtifactRepositoryPolicy(),
+                new ArtifactRepositoryPolicy());
 
-        return Collections.singletonList( repository );
+        return Collections.singletonList(repository);
     }
 }
