This repository has been archived by the owner on Feb 11, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
/
PmdConfigurator.groovy
92 lines (82 loc) · 3.11 KB
/
PmdConfigurator.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.novoda.staticanalysis.internal.pmd
import com.novoda.staticanalysis.EvaluateViolationsTask
import com.novoda.staticanalysis.internal.CodeQualityConfigurator
import com.novoda.staticanalysis.internal.QuietLogger
import com.novoda.staticanalysis.internal.Violations
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.plugins.quality.Pmd
import org.gradle.api.plugins.quality.PmdExtension
import org.gradle.internal.logging.ConsoleRenderer
class PmdConfigurator extends CodeQualityConfigurator<Pmd, PmdExtension> {
PmdConfigurator(Project project, EvaluateViolationsTask evaluateViolations) {
super(project, evaluateViolations.maybeCreate('PMD'), evaluateViolations)
}
@Override
protected String getToolName() {
'pmd'
}
@Override
protected Class<PmdExtension> getExtensionClass() {
PmdExtension
}
@Override
protected Class<Pmd> getTaskClass() {
Pmd
}
@Override
protected Action<PmdExtension> getDefaultConfiguration() {
new Action<PmdExtension>() {
@Override
void execute(PmdExtension pmdExtension) {
pmdExtension.toolVersion = '5.5.1'
pmdExtension.rulePriority = 5
}
}
}
@Override
protected void configureAndroid(Object variants) {
project.with {
android.sourceSets.all { sourceSet ->
def sourceDirs = sourceSet.java.srcDirs
def notEmptyDirs = sourceDirs.findAll { it.list()?.length > 0 }
if (notEmptyDirs.empty) {
return
}
Pmd pmd = tasks.create("pmd${sourceSet.name.capitalize()}", Pmd)
pmd.with {
description = "Run PMD analysis for ${sourceSet.name} classes"
source = sourceSet.java.srcDirs
}
variants.all { variant ->
pmd.mustRunAfter variant.javaCompile
}
}
}
}
@Override
protected void configureTask(Pmd pmd) {
super.configureTask(pmd)
pmd.ignoreFailures = true
pmd.metaClass.getLogger = { QuietLogger.INSTANCE }
pmd.doLast {
File xmlReportFile = pmd.reports.xml.destination
File htmlReportFile = new File(xmlReportFile.absolutePath - '.xml' + '.html')
evaluateReports(xmlReportFile, htmlReportFile, violations)
}
evaluateViolations.dependsOn pmd
}
private static void evaluateReports(File xmlReportFile, File htmlReportFile, Violations violations) {
PmdViolationsEvaluator evaluator = new PmdViolationsEvaluator(xmlReportFile)
int errors = 0, warnings = 0
evaluator.collectViolations().each { PmdViolationsEvaluator.PmdViolation violation ->
if (violation.isError()) {
errors += 1
} else {
warnings += 1
}
}
String reportUrl = new ConsoleRenderer().asClickableFileUrl(htmlReportFile ?: xmlReportFile)
violations.addViolations(errors, warnings, reportUrl)
}
}