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());