Skip to content

Commit

Permalink
Update for upcoming changes in PMD 7.0.0-SNAPSHOT
Browse files Browse the repository at this point in the history
  • Loading branch information
adangel committed Aug 17, 2023
1 parent b7b243f commit 02910c9
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 63 deletions.
14 changes: 12 additions & 2 deletions pom.xml
Expand Up @@ -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>
Expand Down Expand Up @@ -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>
Expand Down Expand Up @@ -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>
Expand Down
17 changes: 4 additions & 13 deletions src/main/java/org/apache/maven/plugins/pmd/CpdReport.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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());

Expand All @@ -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);
Expand Down
Expand Up @@ -62,7 +62,7 @@ public boolean isExcludedFromFailure(final Duplication errorDetail) {
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);
}
Expand Down
91 changes: 46 additions & 45 deletions src/main/java/org/apache/maven/plugins/pmd/exec/CpdExecutor.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand All @@ -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);
Expand Down
Expand Up @@ -22,7 +22,7 @@
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;

Expand Down
28 changes: 28 additions & 0 deletions src/main/java/org/apache/maven/plugins/pmd/exec/CpdRequest.java
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down

0 comments on commit 02910c9

Please sign in to comment.