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
The following commit(s) were added to refs/heads/pmd7 by this push: new 0b6b3ac Refactor to use CPDReport and CPDReportRenderer 0b6b3ac is described below commit 0b6b3acd5c41debc25b20dcbb182843256ec314e Author: Andreas Dangel <adan...@apache.org> AuthorDate: Thu Jan 19 09:45:46 2023 +0100 Refactor to use CPDReport and CPDReportRenderer --- .../net/sourceforge/pmd/cpd/CPDReportFriend.java | 44 ++++++++++++++++++++++ .../org/apache/maven/plugins/pmd/CpdReport.java | 14 ------- .../plugins/pmd/exec/CPDReportRendererAdapter.java | 43 +++++++++++++++++++++ .../apache/maven/plugins/pmd/exec/CpdExecutor.java | 28 +++++++------- 4 files changed, 101 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/sourceforge/pmd/cpd/CPDReportFriend.java b/src/main/java/net/sourceforge/pmd/cpd/CPDReportFriend.java new file mode 100644 index 0000000..d50a2a8 --- /dev/null +++ b/src/main/java/net/sourceforge/pmd/cpd/CPDReportFriend.java @@ -0,0 +1,44 @@ +package net.sourceforge.pmd.cpd; + +/* + * 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. + */ + +import java.util.List; +import java.util.Map; + +/** + * Allows to create a new CPDReport as the ctor is package private + * in PMD. + * + * <p>Only needed temporarily until <a href="https://github.com/pmd/pmd/issues/4340">[core] Allow to filter found + * matches in CPDReport #4340</a> is done. + */ +public final class CPDReportFriend +{ + + private CPDReportFriend() + { + // utility + } + + public static CPDReport newReport( List<Match> matches, Map<String, Integer> numberOfTokensPerFile ) + { + return new CPDReport( matches, numberOfTokensPerFile ); + } +} 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 522b350..83391bc 100644 --- a/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java +++ b/src/main/java/org/apache/maven/plugins/pmd/CpdReport.java @@ -34,7 +34,6 @@ import org.apache.maven.reporting.MavenReportException; import org.apache.maven.toolchain.Toolchain; import net.sourceforge.pmd.cpd.JavaTokenizer; -import net.sourceforge.pmd.cpd.renderer.CPDRenderer; /** * Creates a report for PMD's Copy/Paste Detector (CPD) tool. @@ -259,17 +258,4 @@ public class CpdReport { return ResourceBundle.getBundle( "cpd-report", locale, CpdReport.class.getClassLoader() ); } - - /** - * 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 - * @deprecated Use {@link CpdExecutor#createRenderer(String, String)} instead. - */ - @Deprecated - public CPDRenderer createRenderer() throws MavenReportException - { - return CpdExecutor.createRenderer( format, getOutputEncoding() ); - } } diff --git a/src/main/java/org/apache/maven/plugins/pmd/exec/CPDReportRendererAdapter.java b/src/main/java/org/apache/maven/plugins/pmd/exec/CPDReportRendererAdapter.java new file mode 100644 index 0000000..c161480 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/pmd/exec/CPDReportRendererAdapter.java @@ -0,0 +1,43 @@ +package org.apache.maven.plugins.pmd.exec; + +/* + * 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. + */ + +import java.io.IOException; +import java.io.Writer; + +import net.sourceforge.pmd.cpd.CPDReport; +import net.sourceforge.pmd.cpd.renderer.CPDRenderer; +import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer; + +final class CPDReportRendererAdapter implements CPDReportRenderer +{ + private final CPDRenderer renderer; + + CPDReportRendererAdapter( CPDRenderer renderer ) + { + this.renderer = renderer; + } + + @Override + public void render( CPDReport cpdReport, Writer writer ) throws IOException + { + renderer.render( cpdReport.getMatches().iterator(), writer ); + } +} 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 998c8e3..b50aea4 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 @@ -28,7 +28,6 @@ import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -41,6 +40,8 @@ import org.slf4j.LoggerFactory; import net.sourceforge.pmd.cpd.CPD; import net.sourceforge.pmd.cpd.CPDConfiguration; +import net.sourceforge.pmd.cpd.CPDReport; +import net.sourceforge.pmd.cpd.CPDReportFriend; import net.sourceforge.pmd.cpd.CSVRenderer; import net.sourceforge.pmd.cpd.EcmascriptLanguage; import net.sourceforge.pmd.cpd.JSPLanguage; @@ -50,7 +51,7 @@ import net.sourceforge.pmd.cpd.LanguageFactory; import net.sourceforge.pmd.cpd.Match; import net.sourceforge.pmd.cpd.SimpleRenderer; import net.sourceforge.pmd.cpd.XMLRenderer; -import net.sourceforge.pmd.cpd.renderer.CPDRenderer; +import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer; /** * Executes CPD with the configuration provided via {@link CpdRequest}. @@ -251,7 +252,7 @@ public class CpdExecutor extends Executor } } - private File writeReport( CPD cpd, CPDRenderer r, String extension ) throws MavenReportException + private File writeReport( CPD cpd, CPDReportRenderer r, String extension ) throws MavenReportException { if ( r == null ) { @@ -264,7 +265,7 @@ public class CpdExecutor extends Executor try ( Writer writer = new OutputStreamWriter( new FileOutputStream( targetFile ), request.getOutputEncoding() ) ) { - r.render( filterMatches( cpd.getMatches() ), writer ); + r.render( filterMatches( cpd.toReport() ), writer ); writer.flush(); } catch ( IOException ioe ) @@ -277,7 +278,7 @@ public class CpdExecutor extends Executor private void writeFormattedReport( CPD cpd ) throws MavenReportException { - CPDRenderer r = createRenderer( request.getFormat(), request.getOutputEncoding() ); + CPDReportRenderer r = createRenderer( request.getFormat(), request.getOutputEncoding() ); writeReport( cpd, r, request.getFormat() ); } @@ -288,27 +289,27 @@ public class CpdExecutor extends Executor * @return the renderer based on the configured output * @throws org.apache.maven.reporting.MavenReportException if no renderer found for the output type */ - public static CPDRenderer createRenderer( String format, String outputEncoding ) + public static CPDReportRenderer createRenderer( String format, String outputEncoding ) throws MavenReportException { - CPDRenderer renderer = null; + CPDReportRenderer renderer = null; if ( "xml".equals( format ) ) { renderer = new XMLRenderer( outputEncoding ); } else if ( "csv".equals( format ) ) { - renderer = new CSVRenderer(); + renderer = new CPDReportRendererAdapter( new CSVRenderer() ); } else if ( "txt".equals( format ) ) { - renderer = new SimpleRenderer(); + renderer = new CPDReportRendererAdapter( new SimpleRenderer() ); } else if ( !"".equals( format ) && !"none".equals( format ) ) { try { - renderer = (CPDRenderer) Class.forName( format ).getConstructor().newInstance(); + renderer = (CPDReportRenderer) Class.forName( format ).getConstructor().newInstance(); } catch ( Exception e ) { @@ -320,16 +321,15 @@ public class CpdExecutor extends Executor return renderer; } - private Iterator<Match> filterMatches( Iterator<Match> matches ) + private CPDReport filterMatches( CPDReport report ) { LOG.debug( "Filtering duplications. Using " + excludeDuplicationsFromFile.countExclusions() + " configured exclusions." ); List<Match> filteredMatches = new ArrayList<>(); int excludedDuplications = 0; - while ( matches.hasNext() ) + for ( Match match : report.getMatches() ) { - Match match = matches.next(); if ( excludeDuplicationsFromFile.isExcludedFromFailure( match ) ) { excludedDuplications++; @@ -341,7 +341,7 @@ public class CpdExecutor extends Executor } LOG.debug( "Excluded " + excludedDuplications + " duplications." ); - return filteredMatches.iterator(); + return CPDReportFriend.newReport( filteredMatches, report.getNumberOfTokensPerFile() ); } }