1
2
3
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
22
23
24
25 final class SourceValidator {
26
27
28
29 private final PMDConfiguration config;
30
31
32
33
34 private final Charset encoding;
35
36
37
38
39
40 SourceValidator(final Environment env) {
41 this.config = new PMDConfiguration();
42 this.encoding = env.encoding();
43 }
44
45
46
47
48
49
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 }