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 2021/03/26 08:27:45 UTC

[maven-pmd-plugin] 02/04: [MPMD-312] Remove deprecated usage of RuleSetReferenceId

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

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

commit 0bc759bd1e2cc210ed8c0da2fc1dfd7734c02697
Author: Andreas Dangel <ad...@apache.org>
AuthorDate: Thu Mar 25 12:53:47 2021 +0100

    [MPMD-312] Remove deprecated usage of RuleSetReferenceId
---
 .../org/apache/maven/plugins/pmd/PmdReport.java    | 37 ++++++++++--
 .../apache/maven/plugins/pmd/PmdReportTest.java    | 54 +++++++++++++++++
 .../pmd-report-resolve-rulesets.xml                | 67 ++++++++++++++++++++++
 3 files changed, 154 insertions(+), 4 deletions(-)

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 ba06cf8..52585a2 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/PmdReport.java
@@ -54,7 +54,6 @@ import org.codehaus.plexus.resource.loader.ResourceNotFoundException;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 
-import net.sourceforge.pmd.RuleSetReferenceId;
 import net.sourceforge.pmd.renderers.Renderer;
 
 /**
@@ -118,7 +117,7 @@ public class PmdReport
      * (<code>/rulesets/java/maven-pmd-plugin-default.xml</code>).
      */
     @Parameter
-    private 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
@@ -438,8 +437,8 @@ public class PmdReport
             {
                 String set = rulesets[idx];
                 getLog().debug( "Preparing ruleset: " + set );
-                RuleSetReferenceId id = new RuleSetReferenceId( set );
-                File ruleset = locator.getResourceAsFile( id.getRuleSetFileName(), getLocationTemp( set ) );
+                String rulesetFilename = determineRulesetFilename( set );
+                File ruleset = locator.getResourceAsFile( rulesetFilename, getLocationTemp( set ) );
                 if ( null == ruleset )
                 {
                     throw new MavenReportException( "Could not resolve " + set );
@@ -454,6 +453,36 @@ public class PmdReport
         return StringUtils.join( sets, "," );
     }
 
+    private String determineRulesetFilename( String ruleset )
+    {
+        String result = ruleset.trim();
+        String lowercase = result.toLowerCase( Locale.ROOT );
+        if ( 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" ) )
+            {
+                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 );
+            return "rulesets/" + language + "/" + rulesetName + ".xml";
+        }
+        // fallback - no change of the given ruleset specifier
+        return result;
+    }
+
     private void generateMavenSiteReport( Locale locale )
         throws MavenReportException
     {
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 8a4fc0b..7e175a9 100644
--- a/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/pmd/PmdReportTest.java
@@ -690,4 +690,58 @@ public class PmdReportTest
         assertEquals( 4, StringUtils.countMatches( str, "\">UnusedPrivateField</a></td>" ) );
     }
 
+    public void testPmdReportResolveRulesets()
+            throws Exception
+    {
+        int port = determineFreePort();
+        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 );
+
+        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;
+
+        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( sonarProfileUrl ) )
+                .willReturn( WireMock.aResponse().withStatus( 200 ).withHeader( "Content-Type",
+                                                                                "text/xml" ).withBody( sonarRuleset ) ) );
+        mockServer.stubFor( WireMock.get( WireMock.urlEqualTo( myRulesetBaseUrl ) )
+                .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" ) );
+
+        File testPom =
+            new File( getBasedir(),
+                      "src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml" );
+        PmdReport mojo = (PmdReport) lookupMojo( "pmd", testPom );
+        mojo.rulesets[3] = sonarExportRulesetUrl;
+        mojo.rulesets[4] = myRulesetUrl;
+        mojo.execute();
+
+        // 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() ) );
+
+        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/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() ) );
+
+        mockServer.stop();
+    }
+
 }
diff --git a/src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml b/src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml
new file mode 100644
index 0000000..5d4ea4b
--- /dev/null
+++ b/src/test/resources/unit/default-configuration/pmd-report-resolve-rulesets.xml
@@ -0,0 +1,67 @@
+<!--
+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>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>def.configuration</groupId>
+  <artifactId>default-configuration</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <inceptionYear>2006</inceptionYear>
+  <name>Maven PMD Plugin Default Configuration Test</name>
+  <url>http://maven.apache.org</url>
+  <build>
+    <finalName>default-configuration</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <configuration>
+          <project implementation="org.apache.maven.plugins.pmd.stubs.DefaultConfigurationMavenProjectStub"/>
+          <outputDirectory>${basedir}/target/test/unit/default-configuration/target/site</outputDirectory>
+          <targetDirectory>${basedir}/target/test/unit/default-configuration/target</targetDirectory>
+          <rulesetsTargetDirectory>${basedir}/target/test/unit/default-configuration/target/pmd/rulesets</rulesetsTargetDirectory>
+          <rulesets>
+            <ruleset>${basedir}/src/test/resources/unit/default-configuration/rulesets/custom-rules.xml</ruleset>
+            <ruleset>category/java/bestpractices.xml</ruleset>
+            <ruleset>java-design</ruleset>
+            <!-- note, the port of the http urls will be replaced by the unit test -->
+            <ruleset>http://localhost:12345/profiles/export?format=pmd&amp;language=java&amp;name=Sonar%2520way</ruleset>
+            <ruleset>http://localhost:12345/config/my-ruleset.xml</ruleset>
+          </rulesets>
+          <format>xml</format>
+          <linkXRef>true</linkXRef>
+          <xrefLocation>${basedir}/target/test/unit/default-configuration/target/site/xref</xrefLocation>
+          <sourceEncoding>UTF-8</sourceEncoding>
+          <compileSourceRoots>
+            <compileSourceRoot>${basedir}/src/test/resources/unit/default-configuration/</compileSourceRoot>
+          </compileSourceRoots>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jxr-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>