[ 
https://issues.apache.org/jira/browse/MPMD-395?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17847723#comment-17847723
 ] 

ASF GitHub Bot commented on MPMD-395:
-------------------------------------

michael-o commented on code in PR #150:
URL: https://github.com/apache/maven-pmd-plugin/pull/150#discussion_r1606095807


##########
src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportConsumer.java:
##########
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+package org.apache.maven.plugins.pmd.exec;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+import net.sourceforge.pmd.cpd.CPDReport;
+import net.sourceforge.pmd.cpd.CPDReportRenderer;
+import net.sourceforge.pmd.cpd.Match;
+import net.sourceforge.pmd.cpd.XMLRenderer;
+import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class CpdReportConsumer implements Consumer<CPDReport> {
+    private static final Logger LOG = 
LoggerFactory.getLogger(CpdReportConsumer.class);
+
+    private final CpdRequest request;
+    private final ExcludeDuplicationsFromFile excludeDuplicationsFromFile;
+    private MavenReportException reportException;
+
+    CpdReportConsumer(CpdRequest request, ExcludeDuplicationsFromFile 
excludeDuplicationsFromFile) {
+        this.request = request;
+        this.excludeDuplicationsFromFile = excludeDuplicationsFromFile;
+    }
+
+    @Override
+    public void accept(CPDReport report) {
+        try {
+            // always create XML format. we need to output it even if the file 
list is empty or we have no
+            // duplications so that the "check" goals can check for violations
+            writeXmlReport(report);
+
+            // html format is handled by maven site report, xml format has 
already been rendered
+            // a renderer is only needed for other formats
+            String format = request.getFormat();
+            if (!"html".equals(format) && !"xml".equals(format)) {
+                writeFormattedReport(report);
+            }
+        } catch (MavenReportException e) {
+            // Exceptions happening during this consumer are only logged by 
PMD.
+            // Remembering the exception here, so that we can rethrow it later 
to fail the build.
+            reportException = e;
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void writeXmlReport(CPDReport cpd) throws MavenReportException {
+        File targetFile = writeReport(cpd, 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("Error while copying cpd.xml 
report to site dir", e);
+            }
+        }
+    }
+
+    private void writeFormattedReport(CPDReport cpd) throws 
MavenReportException {
+        CPDReportRenderer r = CpdExecutor.createRenderer(request.getFormat(), 
request.getOutputEncoding());
+        writeReport(cpd, r, request.getFormat());
+    }
+
+    private File writeReport(CPDReport cpd, CPDReportRenderer r, String 
extension) throws MavenReportException {
+        if (r == null) {
+            return null;
+        }
+
+        File targetDir = new File(request.getTargetDirectory());
+        targetDir.mkdirs();
+        File targetFile = new File(targetDir, "cpd." + extension);
+        try (Writer writer = new OutputStreamWriter(new 
FileOutputStream(targetFile), request.getOutputEncoding())) {
+            r.render(cpd.filterMatches(filterMatches()), writer);
+            writer.flush();
+        } catch (IOException ioe) {
+            throw new MavenReportException(ioe.getMessage(), ioe);

Review Comment:
   This duplicates the message...not good



##########
src/main/java/org/apache/maven/plugins/pmd/exec/CpdReportConsumer.java:
##########
@@ -0,0 +1,133 @@
+/*
+ * 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.
+ */
+package org.apache.maven.plugins.pmd.exec;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+import net.sourceforge.pmd.cpd.CPDReport;
+import net.sourceforge.pmd.cpd.CPDReportRenderer;
+import net.sourceforge.pmd.cpd.Match;
+import net.sourceforge.pmd.cpd.XMLRenderer;
+import org.apache.maven.plugins.pmd.ExcludeDuplicationsFromFile;
+import org.apache.maven.reporting.MavenReportException;
+import org.codehaus.plexus.util.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class CpdReportConsumer implements Consumer<CPDReport> {
+    private static final Logger LOG = 
LoggerFactory.getLogger(CpdReportConsumer.class);
+
+    private final CpdRequest request;
+    private final ExcludeDuplicationsFromFile excludeDuplicationsFromFile;
+    private MavenReportException reportException;
+
+    CpdReportConsumer(CpdRequest request, ExcludeDuplicationsFromFile 
excludeDuplicationsFromFile) {
+        this.request = request;
+        this.excludeDuplicationsFromFile = excludeDuplicationsFromFile;
+    }
+
+    @Override
+    public void accept(CPDReport report) {
+        try {
+            // always create XML format. we need to output it even if the file 
list is empty or we have no
+            // duplications so that the "check" goals can check for violations
+            writeXmlReport(report);
+
+            // html format is handled by maven site report, xml format has 
already been rendered
+            // a renderer is only needed for other formats
+            String format = request.getFormat();
+            if (!"html".equals(format) && !"xml".equals(format)) {
+                writeFormattedReport(report);
+            }
+        } catch (MavenReportException e) {
+            // Exceptions happening during this consumer are only logged by 
PMD.
+            // Remembering the exception here, so that we can rethrow it later 
to fail the build.
+            reportException = e;
+            throw new RuntimeException(e);

Review Comment:
   Is `java.util.function.Consumer` really the right approach here? Given that 
you have to memorize the actual actual, throw a fake one to satisfy the 
interface and then rethrow it tells me that this is not right, no?





> Build doesn't fail for invalid CPD format
> -----------------------------------------
>
>                 Key: MPMD-395
>                 URL: https://issues.apache.org/jira/browse/MPMD-395
>             Project: Maven PMD Plugin
>          Issue Type: Bug
>          Components: CPD
>    Affects Versions: 3.22.0
>            Reporter: Andreas Dangel
>            Assignee: Andreas Dangel
>            Priority: Major
>
> See 
> [https://github.com/apache/maven-pmd-plugin/pull/144#issuecomment-2094371392]
>  
> If an exception occurs while the CPD report is created, the exception is only 
> logged but doesn't fail the build. This means, that build appears to be 
> successful, although it didn't produce all expected build artifacts.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to