View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2011-2025 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.qulice.pmd;
6   
7   import com.qulice.spi.Environment;
8   import com.qulice.spi.ResourceValidator;
9   import com.qulice.spi.Violation;
10  import java.io.File;
11  import java.util.Collection;
12  import java.util.LinkedList;
13  import net.sourceforge.pmd.util.datasource.DataSource;
14  import net.sourceforge.pmd.util.datasource.FileDataSource;
15  
16  /**
17   * Validates source code with PMD.
18   *
19   * @since 0.3
20   */
21  public final class PmdValidator implements ResourceValidator {
22  
23      /**
24       * Environment to use.
25       */
26      private final transient Environment env;
27  
28      /**
29       * Constructor.
30       * @param env Environment to use.
31       */
32      public PmdValidator(final Environment env) {
33          this.env = env;
34      }
35  
36      @Override
37      @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
38      public Collection<Violation> validate(final Collection<File> files) {
39          final SourceValidator validator = new SourceValidator(this.env);
40          final Collection<DataSource> sources = this.getNonExcludedFiles(files);
41          final Collection<PmdError> errors = validator.validate(
42              sources, this.env.basedir().getPath()
43          );
44          final Collection<Violation> violations = new LinkedList<>();
45          for (final PmdError error : errors) {
46              violations.add(
47                  new Violation.Default(
48                      this.name(),
49                      error.name(),
50                      error.fileName(),
51                      error.lines(),
52                      error.description()
53                  )
54              );
55          }
56          return violations;
57      }
58  
59      @Override
60      public String name() {
61          return "PMD";
62      }
63  
64      /**
65       * Filters out excluded files from further validation.
66       * @param files Files to validate
67       * @return Relevant source files
68       */
69      public Collection<DataSource> getNonExcludedFiles(final Collection<File> files) {
70          final Collection<DataSource> sources = new LinkedList<>();
71          for (final File file : files) {
72              final String name = file.getPath().substring(
73                  this.env.basedir().toString().length()
74              );
75              if (this.env.exclude("pmd", name)) {
76                  continue;
77              }
78              if (!name.matches("^.*\\.java$")) {
79                  continue;
80              }
81              sources.add(new FileDataSource(file));
82          }
83          return sources;
84      }
85  }