View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2011-2026 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.qulice.pmd;
6   
7   import com.jcabi.log.Logger;
8   import com.qulice.spi.Environment;
9   import java.io.File;
10  import java.nio.charset.Charset;
11  import java.util.Collection;
12  import java.util.LinkedList;
13  import java.util.List;
14  import net.sourceforge.pmd.PMDConfiguration;
15  import net.sourceforge.pmd.PmdAnalysis;
16  import net.sourceforge.pmd.lang.rule.RulePriority;
17  import net.sourceforge.pmd.reporting.Report;
18  import org.cactoos.list.ListOf;
19  
20  /**
21   * Validates source files via <code>PmdValidator</code>.
22   *
23   * @since 0.3
24   */
25  final class SourceValidator {
26      /**
27       * Rules.
28       */
29      private final PMDConfiguration config;
30  
31      /**
32       * Source files encoding.
33       */
34      private final Charset encoding;
35  
36      /**
37       * Creates new instance of <code>SourceValidator</code>.
38       * @param env Environment
39       */
40      SourceValidator(final Environment env) {
41          this.config = new PMDConfiguration();
42          this.encoding = env.encoding();
43      }
44  
45      /**
46       * Performs validation of the input source files.
47       * @param sources Input source files.
48       * @param path Base path.
49       * @return Collection of violations.
50       */
51      @SuppressWarnings({"PMD.AvoidInstantiatingObjectsInLoops", "PMD.CloseResource"})
52      public Collection<PmdError> validate(
53          final Collection<File> sources, final String path) {
54          this.config.setRuleSets(new ListOf<>("com/qulice/pmd/ruleset.xml"));
55          this.config.setThreads(0);
56          this.config.setMinimumPriority(RulePriority.LOW);
57          this.config.setIgnoreIncrementalAnalysis(true);
58          this.config.setShowSuppressedViolations(true);
59          this.config.setSourceEncoding(this.encoding);
60          final List<PmdError> errors = new LinkedList<>();
61          try (PmdAnalysis analysis = PmdAnalysis.create(this.config)) {
62              for (final File source : sources) {
63                  Logger.debug(
64                      this,
65                      "Processing file: %s",
66                      source.toPath().toString()
67                  );
68                  analysis.files().addFile(source.toPath());
69              }
70              final Report report = analysis.performAnalysisAndCollectReport();
71              report.getConfigurationErrors().stream()
72                  .map(PmdError.OfConfigError::new).forEach(errors::add);
73              report.getProcessingErrors().stream()
74                  .map(PmdError.OfProcessingError::new).forEach(errors::add);
75              report.getViolations().stream().map(PmdError.OfRuleViolation::new)
76                  .forEach(errors::add);
77          }
78          return errors;
79      }
80  }