diff --git a/pom.xml b/pom.xml
index 39eb0892..5bebc2d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@ under the License.
maven-pmd-plugin
- 3.21.1-pmd-7.0.0-rc3-SNAPSHOT
+ 3.21.1-pmd-7.0.0-SNAPSHOT
maven-plugin
Apache Maven PMD Plugin
@@ -83,7 +83,7 @@ under the License.
3.2.5
8
- 7.0.0-rc3
+ 7.0.0-SNAPSHOT
1.7.36
1.0.0.v20140518
1.12.0
@@ -347,6 +347,16 @@ under the License.
+
+
+
+ false
+
+ sonatype-ossrh-snapshots
+ https://oss.sonatype.org/content/repositories/snapshots/
+
+
+
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 45660e09..60b55520 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 @@
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 @@ private void executeCpd() throws MavenReportException {
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 @@ private void executeCpd() throws MavenReportException {
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 fc2be596..ebcee321 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 boolean isExcludedFromFailure(final Duplication errorDetail) {
public boolean isExcludedFromFailure(final Match errorDetail) {
final Set 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 4f0a25fd..85adffaf 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.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 @@ private CpdResult run() throws MavenReportException {
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 @@ private File writeReport(CPD cpd, CPDReportRenderer r, String extension) throws
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 static CPDReportRenderer createRenderer(String format, String outputEncod
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 1a7c961d..e2ca9966 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.util.Predicate;
import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
-class CpdReportFilter implements Predicate {
+class CpdReportFilter implements Predicate, java.util.function.Predicate {
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 ebbff049..bd60ae8a 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 boolean isShowPmdLog() {
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 807259d1..41c9f10d 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.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 @@ private PmdResult run() throws MavenReportException {
configuration.setDefaultLanguageVersion(languageVersion);
if (request.getSourceEncoding() != null) {
- configuration.setSourceEncoding(request.getSourceEncoding());
+ configuration.setSourceEncoding(Charset.forName(request.getSourceEncoding()));
}
configuration.prependAuxClasspath(request.getAuxClasspath());