You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ad...@apache.org on 2020/01/12 11:57:47 UTC

[maven-pmd-plugin] 01/01: [MPMD-289] - check: unable to find pmd.xml

This is an automated email from the ASF dual-hosted git repository.

adangel pushed a commit to branch MPMD-289
in repository https://gitbox.apache.org/repos/asf/maven-pmd-plugin.git

commit 14ad82114d41af5bf70502669f10b0a45770317f
Author: Andreas Dangel <ad...@apache.org>
AuthorDate: Sun Jan 12 12:23:26 2020 +0100

    [MPMD-289] - check: unable to find pmd.xml
    
    XML report is now created always, regardless of the format
    configured.
---
 .../MPMD-289-format-html-check/invoker.properties  | 18 +++++
 src/it/MPMD-289-format-html-check/pom.xml          | 69 +++++++++++++++++
 .../src/main/java/com/mycompany/app/App.java       | 25 ++++++
 src/it/MPMD-289-format-html-check/verify.groovy    | 34 +++++++++
 .../org/apache/maven/plugins/pmd/CpdReport.java    | 68 ++++++++++-------
 .../org/apache/maven/plugins/pmd/PmdReport.java    | 89 ++++++++++++++--------
 .../apache/maven/plugins/pmd/CpdReportTest.java    |  4 +-
 7 files changed, 247 insertions(+), 60 deletions(-)

diff --git a/src/it/MPMD-289-format-html-check/invoker.properties b/src/it/MPMD-289-format-html-check/invoker.properties
new file mode 100644
index 0000000..a5ed592
--- /dev/null
+++ b/src/it/MPMD-289-format-html-check/invoker.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "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
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+invoker.goals = clean verify
diff --git a/src/it/MPMD-289-format-html-check/pom.xml b/src/it/MPMD-289-format-html-check/pom.xml
new file mode 100644
index 0000000..9d44fe0
--- /dev/null
+++ b/src/it/MPMD-289-format-html-check/pom.xml
@@ -0,0 +1,69 @@
+<?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
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"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
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+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>
+
+  <groupId>org.apache.maven.plugins.pmd.its</groupId>
+  <artifactId>MPMD-289-format-html-check</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <description>
+    Then report format is html, xml format should still be created so that the check goal still works.
+  </description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>@project.version@</version>
+        <configuration>
+          <skipPmdError>false</skipPmdError>
+          <skip>false</skip>
+          <failOnViolation>true</failOnViolation>
+          <failurePriority>4</failurePriority>
+          <sourceEncoding>UTF-8</sourceEncoding>
+          <minimumTokens>100</minimumTokens>
+          <skipEmptyReport>false</skipEmptyReport>
+          <format>html</format>
+          <excludes>
+            <exclude>**/*Bean.java</exclude>
+            <exclude>**/generated/*.java</exclude>
+          </excludes>
+          <excludeRoots>
+            <excludeRoot>target/generated-sources/stubs</excludeRoot>
+          </excludeRoots>
+          <rulesets/>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>check</goal>
+              <goal>cpd-check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/MPMD-289-format-html-check/src/main/java/com/mycompany/app/App.java b/src/it/MPMD-289-format-html-check/src/main/java/com/mycompany/app/App.java
new file mode 100644
index 0000000..8e4972d
--- /dev/null
+++ b/src/it/MPMD-289-format-html-check/src/main/java/com/mycompany/app/App.java
@@ -0,0 +1,25 @@
+package com.mycompany.app;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "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
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public class App
+{
+
+}
diff --git a/src/it/MPMD-289-format-html-check/verify.groovy b/src/it/MPMD-289-format-html-check/verify.groovy
new file mode 100644
index 0000000..04afaae
--- /dev/null
+++ b/src/it/MPMD-289-format-html-check/verify.groovy
@@ -0,0 +1,34 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "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
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.exists()
+
+File pmdXml = new File( basedir, 'target/pmd.xml' )
+assert pmdXml.exists()
+
+File pmdHtmlReport = new File ( basedir, 'target/site/pmd.html' )
+assert pmdHtmlReport.exists()
+
+File cpdXml = new File( basedir, 'target/cpd.xml' )
+assert cpdXml.exists()
+
+File cpdHtmlReport = new File ( basedir, 'target/site/cpd.html' )
+assert cpdHtmlReport.exists()
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 9a1037c..d9fb606 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
@@ -51,8 +51,8 @@ import net.sourceforge.pmd.cpd.JavaTokenizer;
 import net.sourceforge.pmd.cpd.Language;
 import net.sourceforge.pmd.cpd.LanguageFactory;
 import net.sourceforge.pmd.cpd.Match;
-import net.sourceforge.pmd.cpd.Renderer;
 import net.sourceforge.pmd.cpd.XMLRenderer;
+import net.sourceforge.pmd.cpd.renderer.CPDRenderer;
 
 /**
  * Creates a report for PMD's CPD tool. See
@@ -168,12 +168,7 @@ public class CpdReport
             {
                 Thread.currentThread().setContextClassLoader( this.getClass().getClassLoader() );
 
-                generateReport( locale );
-
-                if ( !isHtml() && !isXml() )
-                {
-                    writeNonHtml( cpd );
-                }
+                generateMavenSiteReport( locale );
             }
             finally
             {
@@ -313,11 +308,14 @@ public class CpdReport
         cpd.go();
         getLog().debug( "CPD finished." );
 
-        // if format is XML, we need to output it even if the file list is empty or we have no duplications
+        // 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
-        if ( isXml() )
+        writeXmlReport( cpd );
+
+        // html format is handled by maven site report, xml format as already bean rendered
+        if ( !isHtml() && !isXml() )
         {
-            writeNonHtml( cpd );
+            writeFormattedReport( cpd );
         }
     }
 
@@ -345,7 +343,7 @@ public class CpdReport
         return filteredMatches.iterator();
     }
 
-    private void generateReport( Locale locale )
+    private void generateMavenSiteReport( Locale locale )
     {
         CpdReportGenerator gen = new CpdReportGenerator( getSink(), filesToProcess, getBundle( locale ), aggregate );
         Iterator<Match> matches = cpd.getMatches();
@@ -373,35 +371,51 @@ public class CpdReport
         return encoding;
     }
 
-    void writeNonHtml( CPD cpd )
+    private void writeFormattedReport( CPD cpd )
         throws MavenReportException
     {
-        Renderer r = createRenderer();
+        CPDRenderer r = createRenderer();
+        writeReport( cpd, r, format );
+
+    }
 
+    void writeXmlReport( CPD cpd ) throws MavenReportException
+    {
+        File targetFile = writeReport( cpd, new XMLRenderer( getOutputEncoding() ), "xml" );
+        if ( includeXmlInSite )
+        {
+            File siteDir = getReportOutputDirectory();
+            siteDir.mkdirs();
+            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 )
         {
-            return;
+            return null;
         }
 
-        String buffer = r.render( filterMatches( cpd.getMatches() ) );
-        File targetFile = new File( targetDirectory, "cpd." + format );
+        File targetFile = new File( targetDirectory, "cpd." + extension );
         targetDirectory.mkdirs();
         try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ), getOutputEncoding() ) )
         {
-            writer.write( buffer );
+            r.render( filterMatches( cpd.getMatches() ), writer );
             writer.flush();
-
-            if ( includeXmlInSite )
-            {
-                File siteDir = getReportOutputDirectory();
-                siteDir.mkdirs();
-                FileUtils.copyFile( targetFile, new File( siteDir, "cpd." + format ) );
-            }
         }
         catch ( IOException ioe )
         {
             throw new MavenReportException( ioe.getMessage(), ioe );
         }
+        return targetFile;
     }
 
     /**
@@ -423,10 +437,10 @@ public class CpdReport
      * @return the renderer based on the configured output
      * @throws org.apache.maven.reporting.MavenReportException if no renderer found for the output type
      */
-    public Renderer createRenderer()
+    public CPDRenderer createRenderer()
         throws MavenReportException
     {
-        Renderer renderer = null;
+        CPDRenderer renderer = null;
         if ( "xml".equals( format ) )
         {
             renderer = new XMLRenderer( getOutputEncoding() );
@@ -439,7 +453,7 @@ public class CpdReport
         {
             try
             {
-                renderer = (Renderer) Class.forName( format ).newInstance();
+                renderer = (CPDRenderer) Class.forName( format ).getConstructor().newInstance();
             }
             catch ( Exception e )
             {
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 3ab36ef..0c59b3d 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
@@ -316,12 +316,7 @@ public class PmdReport
             {
                 Thread.currentThread().setContextClassLoader( this.getClass().getClassLoader() );
 
-                Report report = generateReport( locale );
-
-                if ( !isHtml() && !isXml() )
-                {
-                    writeNonHtml( report );
-                }
+                generateMavenSiteReport( locale );
             }
             finally
             {
@@ -491,11 +486,22 @@ public class PmdReport
 
         removeExcludedViolations( renderer.getViolations() );
 
-        // if format is XML, we need to output it even if the file list is empty or we have no violations
+        // 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
-        if ( isXml() && renderer != null )
+        if ( renderer != null )
         {
-            writeNonHtml( renderer.asReport() );
+            Report report = renderer.asReport();
+            writeXmlReport( report );
+
+            // write any other format except for xml and html. xml as been just produced.
+            // html format is produced by the maven site formatter. Excluding html here
+            // avoids usind PMD's own html formatter, which doesn't fit into the maven site
+            // considering the html/css styling
+            if ( !isHtml() && !isXml() )
+            {
+                writeFormattedReport( report );
+            }
         }
 
         if ( benchmark )
@@ -569,7 +575,7 @@ public class PmdReport
         }
     }
 
-    private Report generateReport( Locale locale )
+    private void generateMavenSiteReport( Locale locale )
         throws MavenReportException
     {
         Sink sink = getSink();
@@ -593,8 +599,6 @@ public class PmdReport
         {
             getLog().warn( "Failure creating the report: " + e.getLocalizedMessage(), e );
         }
-
-        return renderer.asReport();
     }
 
     /**
@@ -630,23 +634,14 @@ public class PmdReport
         return loc;
     }
 
-    /**
-     * Use the PMD renderers to render in any format aside from HTML.
-     *
-     * @param report
-     * @throws MavenReportException
-     */
-    private void writeNonHtml( Report report )
-        throws MavenReportException
+    private File writeReport( Report report, Renderer r, String extension ) throws MavenReportException
     {
-        Renderer r = createRenderer();
-
         if ( r == null )
         {
-            return;
+            return null;
         }
 
-        File targetFile = new File( targetDirectory, "pmd." + format );
+        File targetFile = new File( targetDirectory, "pmd." + extension );
         try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ), getOutputEncoding() ) )
         {
             targetDirectory.mkdirs();
@@ -656,18 +651,50 @@ public class PmdReport
             r.renderFileReport( report );
             r.end();
             r.flush();
-
-            if ( includeXmlInSite )
-            {
-                File siteDir = getReportOutputDirectory();
-                siteDir.mkdirs();
-                FileUtils.copyFile( targetFile, new File( siteDir, "pmd." + format ) );
-            }
         }
         catch ( IOException ioe )
         {
             throw new MavenReportException( ioe.getMessage(), ioe );
         }
+
+        return targetFile;
+    }
+
+    /**
+     * Use the PMD renderers to render in any format aside from HTML and XML.
+     *
+     * @param report
+     * @throws MavenReportException
+     */
+    private void writeFormattedReport( Report report )
+        throws MavenReportException
+    {
+        Renderer r = createRenderer();
+        writeReport( report, r, format );
+    }
+
+    /**
+     * Use the PMD XML renderer to create the XML report format used by the check mojo later on.
+     *
+     * @param report
+     * @throws MavenReportException
+     */
+    private void writeXmlReport( Report report ) throws MavenReportException
+    {
+        File targetFile = writeReport( report, new XMLRenderer( getOutputEncoding() ), "xml" );
+        if ( includeXmlInSite )
+        {
+            File siteDir = getReportOutputDirectory();
+            siteDir.mkdirs();
+            try
+            {
+                FileUtils.copyFile( targetFile, new File( siteDir, "pmd.xml" ) );
+            }
+            catch ( IOException e )
+            {
+                throw new MavenReportException( e.getMessage(), e );
+            }
+        }
     }
 
     /**
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 2dac659..e64d532 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/CpdReportTest.java
@@ -228,7 +228,7 @@ public class CpdReportTest
 
         String duplicatedCodeFragment = "// ----- duplicated code example -----";
         CPD tCpd = prepareMockCpd( duplicatedCodeFragment );
-        mojo.writeNonHtml( tCpd );
+        mojo.writeXmlReport( tCpd );
 
         File tReport = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
 
@@ -257,7 +257,7 @@ public class CpdReportTest
 
         String duplicatedCodeFragment = "// ----- duplicated code example -----";
         CPD tCpd = prepareMockCpd( duplicatedCodeFragment );
-        mojo.writeNonHtml( tCpd );
+        mojo.writeXmlReport( tCpd );
 
         File tReport = new File( getBasedir(), "target/test/unit/default-configuration/target/cpd.xml" );
         assertTrue( FileUtils.fileExists( tReport.getAbsolutePath() ) );