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

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

commit 02910c902b168ce14ef948d65db7b239a5ee56c4
Author: Andreas Dangel <adan...@apache.org>
AuthorDate: Thu Aug 17 16:04:20 2023 +0200

    Update for upcoming changes in PMD 7.0.0-SNAPSHOT
    
    Refs pmd/pmd#4397
---
 pom.xml                                            | 14 +++-
 .../org/apache/maven/plugins/pmd/CpdReport.java    | 17 +---
 .../plugins/pmd/ExcludeDuplicationsFromFile.java   |  2 +-
 .../apache/maven/plugins/pmd/exec/CpdExecutor.java | 91 +++++++++++-----------
 .../maven/plugins/pmd/exec/CpdReportFilter.java    |  2 +-
 .../apache/maven/plugins/pmd/exec/CpdRequest.java  | 28 +++++++
 .../apache/maven/plugins/pmd/exec/PmdExecutor.java |  3 +-
 7 files changed, 94 insertions(+), 63 deletions(-)

diff --git a/pom.xml b/pom.xml
index 39eb089..5bebc2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@ under the License.
   </parent>
 
   <artifactId>maven-pmd-plugin</artifactId>
-  <version>3.21.1-pmd-7.0.0-rc3-SNAPSHOT</version>
+  <version>3.21.1-pmd-7.0.0-SNAPSHOT</version>
   <packaging>maven-plugin</packaging>
 
   <name>Apache Maven PMD Plugin</name>
@@ -83,7 +83,7 @@ under the License.
   <properties>
     <mavenVersion>3.2.5</mavenVersion>
     <javaVersion>8</javaVersion>
-    <pmdVersion>7.0.0-rc3</pmdVersion>
+    <pmdVersion>7.0.0-SNAPSHOT</pmdVersion>
     <slf4jVersion>1.7.36</slf4jVersion>
     <aetherVersion>1.0.0.v20140518</aetherVersion>
     <doxiaVersion>1.12.0</doxiaVersion>
@@ -347,6 +347,16 @@ under the License.
     </dependency>
   </dependencies>
 
+  <repositories>
+    <repository>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <id>sonatype-ossrh-snapshots</id>
+      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+    </repository>
+  </repositories>
+
   <build>
     <pluginManagement>
       <plugins>
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 45660e0..60b5552 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
@@ -21,9 +21,7 @@ package org.apache.maven.plugins.pmd;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.Locale;
-import java.util.Properties;
 
-import net.sourceforge.pmd.cpd.JavaTokenizer;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -176,23 +174,12 @@ public class CpdReport extends AbstractPmdReport {
             return;
         }
 
-        Properties languageProperties = new Properties();
-        if (ignoreLiterals) {
-            languageProperties.setProperty(JavaTokenizer.IGNORE_LITERALS, 
"true");
-        }
-        if (ignoreIdentifiers) {
-            languageProperties.setProperty(JavaTokenizer.IGNORE_IDENTIFIERS, 
"true");
-        }
-        if (ignoreAnnotations) {
-            languageProperties.setProperty(JavaTokenizer.IGNORE_ANNOTATIONS, 
"true");
-        }
         try {
             filesToProcess = getFilesToProcess();
 
             CpdRequest request = new CpdRequest();
             request.setMinimumTokens(minimumTokens);
             request.setLanguage(language);
-            request.setLanguageProperties(languageProperties);
             request.setSourceEncoding(getInputEncoding());
             request.addFiles(filesToProcess.keySet());
 
@@ -206,6 +193,10 @@ public class CpdReport extends AbstractPmdReport {
             request.setIncludeXmlInSite(includeXmlInSite);
             
request.setReportOutputDirectory(getReportOutputDirectory().getAbsolutePath());
 
+            request.setIgnoreLiterals(ignoreLiterals);
+            request.setIgnoreIdentifiers(ignoreIdentifiers);
+            request.setIgnoreAnnotations(ignoreAnnotations);
+
             Toolchain tc = getToolchain();
             if (tc != null) {
                 getLog().info("Toolchain in maven-pmd-plugin: " + tc);
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 fc2be59..ebcee32 100644
--- 
a/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java
+++ 
b/src/main/java/org/apache/maven/plugins/pmd/ExcludeDuplicationsFromFile.java
@@ -62,7 +62,7 @@ public class ExcludeDuplicationsFromFile implements 
ExcludeFromFile<Duplication>
     public boolean isExcludedFromFailure(final Match errorDetail) {
         final Set<String> uniquePaths = new HashSet<>();
         for (Mark mark : errorDetail.getMarkSet()) {
-            uniquePaths.add(mark.getFilename());
+            uniquePaths.add(mark.getLocation().getFileId().getAbsolutePath());
         }
         return isExcludedFromFailure(uniquePaths);
     }
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 4f0a25f..85adffa 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
@@ -25,21 +25,19 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStreamWriter;
+import java.io.UncheckedIOException;
 import java.io.Writer;
+import java.nio.charset.Charset;
 import java.util.Objects;
 
-import net.sourceforge.pmd.cpd.CPD;
 import net.sourceforge.pmd.cpd.CPDConfiguration;
 import net.sourceforge.pmd.cpd.CPDReport;
+import net.sourceforge.pmd.cpd.CPDReportRenderer;
 import net.sourceforge.pmd.cpd.CSVRenderer;
-import net.sourceforge.pmd.cpd.EcmascriptLanguage;
-import net.sourceforge.pmd.cpd.JSPLanguage;
-import net.sourceforge.pmd.cpd.JavaLanguage;
-import net.sourceforge.pmd.cpd.Language;
-import net.sourceforge.pmd.cpd.LanguageFactory;
+import net.sourceforge.pmd.cpd.CpdAnalysis;
 import net.sourceforge.pmd.cpd.SimpleRenderer;
 import net.sourceforge.pmd.cpd.XMLRenderer;
-import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer;
+import net.sourceforge.pmd.lang.Language;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
 import org.apache.maven.reporting.MavenReportException;
@@ -153,58 +151,61 @@ public class CpdExecutor extends Executor {
         CPDConfiguration cpdConfiguration = new CPDConfiguration();
         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())) {
-            cpdLanguage = new EcmascriptLanguage();
-        } else if ("jsp".equals(request.getLanguage())) {
-            cpdLanguage = new JSPLanguage();
-        } else {
-            cpdLanguage = 
LanguageFactory.createLanguage(request.getLanguage(), 
request.getLanguageProperties());
+        String language = request.getLanguage();
+        if (language == null) {
+            language = "java";
         }
+        if ("javascript".equalsIgnoreCase(language)) {
+            language = "ecmascript";
+        }
+        Language cpdLanguage = 
cpdConfiguration.getLanguageRegistry().getLanguageById(language);
 
-        cpdConfiguration.setLanguage(cpdLanguage);
-        cpdConfiguration.setSourceEncoding(request.getSourceEncoding());
+        cpdConfiguration.setOnlyRecognizeLanguage(cpdLanguage);
+        
cpdConfiguration.setSourceEncoding(Charset.forName(request.getSourceEncoding()));
 
-        CPD cpd = new CPD(cpdConfiguration);
-        try {
-            cpd.add(request.getFiles());
-        } catch (IOException e) {
-            throw new MavenReportException(e.getMessage(), e);
-        }
+        cpdConfiguration.setIgnoreAnnotations(request.isIgnoreAnnotations());
+        cpdConfiguration.setIgnoreLiterals(request.isIgnoreLiterals());
+        cpdConfiguration.setIgnoreIdentifiers(request.isIgnoreIdentifiers());
 
-        LOG.debug("Executing CPD...");
-        cpd.go();
-        LOG.debug("CPD finished.");
+        try (CpdAnalysis cpd = CpdAnalysis.create(cpdConfiguration)) {
+            for (File file : request.getFiles()) {
+                cpd.files().addFile(file.toPath());
+            }
+            LOG.debug("Executing CPD...");
+            cpd.performAnalysis(cpdReport -> {
+                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);
+                // 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(cpdReport);
 
-        // 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);
+                // 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(cpdReport);
+                }
+            });
+        } catch (IOException e) {
+            throw new MavenReportException(e.getMessage(), e);
         }
 
         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");
+    private void writeXmlReport(CPDReport cpdReport) {
+        File targetFile = writeReport(cpdReport, 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);
+                throw new UncheckedIOException(e);
             }
         }
     }
 
-    private File writeReport(CPD cpd, CPDReportRenderer r, String extension) 
throws MavenReportException {
+    private File writeReport(CPDReport cpdReport, CPDReportRenderer r, String 
extension) {
         if (r == null) {
             return null;
         }
@@ -213,26 +214,26 @@ public class CpdExecutor extends Executor {
         targetDir.mkdirs();
         File targetFile = new File(targetDir, "cpd." + extension);
         try (Writer writer = new OutputStreamWriter(new 
FileOutputStream(targetFile), request.getOutputEncoding())) {
-            r.render(filterMatches(cpd.toReport()), writer);
+            r.render(filterMatches(cpdReport), writer);
             writer.flush();
         } catch (IOException ioe) {
-            throw new MavenReportException(ioe.getMessage(), ioe);
+            throw new UncheckedIOException(ioe);
         }
         return targetFile;
     }
 
-    private void writeFormattedReport(CPD cpd) throws MavenReportException {
+    private void writeFormattedReport(CPDReport cpdReport) {
         CPDReportRenderer r = createRenderer(request.getFormat(), 
request.getOutputEncoding());
-        writeReport(cpd, r, request.getFormat());
+        writeReport(cpdReport, r, request.getFormat());
     }
 
     /**
      * Create and return the correct renderer for the output type.
      *
      * @return the renderer based on the configured output
-     * @throws org.apache.maven.reporting.MavenReportException if no renderer 
found for the output type
+     * @throws RuntimeExceptionn if no renderer found for the output type
      */
-    public static CPDReportRenderer createRenderer(String format, String 
outputEncoding) throws MavenReportException {
+    public static CPDReportRenderer createRenderer(String format, String 
outputEncoding) {
         CPDReportRenderer renderer = null;
         if ("xml".equals(format)) {
             renderer = new XMLRenderer(outputEncoding);
@@ -245,7 +246,7 @@ public class CpdExecutor extends Executor {
                 renderer = (CPDReportRenderer)
                         Class.forName(format).getConstructor().newInstance();
             } catch (Exception e) {
-                throw new MavenReportException(
+                throw new RuntimeException(
                         "Can't find CPD custom format " + format + ": "
                                 + e.getClass().getName(),
                         e);
diff --git 
a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportFilter.java 
b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportFilter.java
index 1a7c961..e2ca996 100644
--- a/src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportFilter.java
+++ b/src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportFilter.java
@@ -22,7 +22,7 @@ import net.sourceforge.pmd.cpd.Match;
 import net.sourceforge.pmd.util.Predicate;
 import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
 
-class CpdReportFilter implements Predicate<Match> {
+class CpdReportFilter implements Predicate<Match>, 
java.util.function.Predicate<Match> {
     private final ExcludeDuplicationsFromFile excludeDuplicationsFromFile;
     private int excludedDuplications = 0;
 
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 ebbff04..bd60ae8 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
@@ -54,6 +54,10 @@ public class CpdRequest implements Serializable {
     private boolean includeXmlInSite;
     private String reportOutputDirectory;
 
+    private boolean ignoreLiterals;
+    private boolean ignoreIdentifiers;
+    private boolean ignoreAnnotations;
+
     public void setJavaExecutable(String javaExecutable) {
         this.javaExecutable = javaExecutable;
     }
@@ -165,4 +169,28 @@ public class CpdRequest implements Serializable {
     public String getLogLevel() {
         return logLevel;
     }
+
+    public boolean isIgnoreLiterals() {
+        return ignoreLiterals;
+    }
+
+    public void setIgnoreLiterals(boolean ignoreLiterals) {
+        this.ignoreLiterals = ignoreLiterals;
+    }
+
+    public boolean isIgnoreIdentifiers() {
+        return ignoreIdentifiers;
+    }
+
+    public void setIgnoreIdentifiers(boolean ignoreIdentifiers) {
+        this.ignoreIdentifiers = ignoreIdentifiers;
+    }
+
+    public boolean isIgnoreAnnotations() {
+        return ignoreAnnotations;
+    }
+
+    public void setIgnoreAnnotations(boolean ignoreAnnotations) {
+        this.ignoreAnnotations = ignoreAnnotations;
+    }
 }
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 807259d..41c9f10 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
@@ -27,6 +27,7 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -172,7 +173,7 @@ public class PmdExecutor extends Executor {
         configuration.setDefaultLanguageVersion(languageVersion);
 
         if (request.getSourceEncoding() != null) {
-            configuration.setSourceEncoding(request.getSourceEncoding());
+            
configuration.setSourceEncoding(Charset.forName(request.getSourceEncoding()));
         }
 
         configuration.prependAuxClasspath(request.getAuxClasspath());

Reply via email to