Skip to content

Commit f4dbad1

Browse files
committed
improve wiring of data file inputs for report tasks
should help prevent ConcurrentModificationException from sometimes occurring
1 parent 0eba8ed commit f4dbad1

File tree

10 files changed

+32
-30
lines changed

10 files changed

+32
-30
lines changed

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/GenerateServicesRegistryTask.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
import com.tngtech.archunit.thirdparty.org.objectweb.asm.ClassReader;
44
import org.gradle.api.DefaultTask;
55
import org.gradle.api.file.ConfigurableFileCollection;
6-
import org.gradle.api.provider.Property;
6+
import org.gradle.api.file.RegularFileProperty;
77
import org.gradle.api.tasks.*;
8-
import org.jspecify.annotations.NonNull;
8+
import org.jspecify.annotations.NullMarked;
99

10-
import java.io.File;
1110
import java.io.IOException;
1211
import java.nio.file.Files;
1312
import java.nio.file.StandardOpenOption;
@@ -16,6 +15,7 @@
1615
* Generates a file in META-INF/services to allow Rule classes to be discovered by the Runner
1716
*/
1817
@CacheableTask
18+
@NullMarked
1919
abstract public class GenerateServicesRegistryTask extends DefaultTask {
2020
/**
2121
* The classes declared in the archRules source set
@@ -28,7 +28,7 @@ abstract public class GenerateServicesRegistryTask extends DefaultTask {
2828
* The file in META-INF/services to output to. It should be named com.netflix.nebula.archrules.core.ArchRulesService.
2929
*/
3030
@OutputFile
31-
abstract public Property<@NonNull File> getArchRuleServicesFile();
31+
abstract public RegularFileProperty getArchRuleServicesFile();
3232

3333
@TaskAction
3434
public void generate() throws IOException {
@@ -47,11 +47,11 @@ public void generate() throws IOException {
4747
getLogger().warn("Failed to read class file {}", classFile.getAbsolutePath(), e);
4848
}
4949
});
50-
if (getArchRuleServicesFile().get().exists()) {
51-
getArchRuleServicesFile().get().delete();
50+
if (getArchRuleServicesFile().getAsFile().get().exists()) {
51+
getArchRuleServicesFile().getAsFile().get().delete();
5252
}
53-
getArchRuleServicesFile().get().createNewFile();
53+
getArchRuleServicesFile().getAsFile().get().createNewFile();
5454
String fileContent = String.join("\n", visitor.getArchRuleServiceClasses());
55-
Files.writeString(getArchRuleServicesFile().get().toPath(), fileContent, StandardOpenOption.WRITE);
55+
Files.writeString(getArchRuleServicesFile().getAsFile().get().toPath(), fileContent, StandardOpenOption.WRITE);
5656
}
5757
}

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/PrintJsonReportTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract public class PrintJsonReportTask extends DefaultTask {
2525
*/
2626
@InputFiles
2727
@PathSensitive(PathSensitivity.RELATIVE)
28-
abstract public ListProperty<File> getDataFiles();
28+
abstract public ConfigurableFileCollection getDataFiles();
2929

3030
/**
3131
* File to output JSON to
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.netflix.nebula.archrules.gradle;
22

33
import com.tngtech.archunit.lang.Priority;
4+
import org.jspecify.annotations.NullMarked;
45

56
import java.io.Serializable;
67

8+
@NullMarked
79
public record Rule(String ruleClass, String ruleName, String description, Priority priority) implements Serializable {
810
}

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RuleResult.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.netflix.nebula.archrules.gradle;
22

3+
import org.jspecify.annotations.NullMarked;
4+
35
import java.io.Serializable;
46

7+
@NullMarked
58
public record RuleResult(
69
Rule rule,
710
String message,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.netflix.nebula.archrules.gradle;
22

3+
import org.jspecify.annotations.NullMarked;
4+
5+
@NullMarked
36
public enum RuleResultStatus {
47
PASS, FAIL, NO_MATCH
58
}

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RuleSummary.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.netflix.nebula.archrules.gradle;
22

33
import com.tngtech.archunit.lang.Priority;
4+
import org.jspecify.annotations.NullMarked;
45

56
import java.io.Serializable;
67

8+
/**
9+
* @deprecated Unused class
10+
*/
11+
@Deprecated(forRemoval = true)
12+
@NullMarked
713
public record RuleSummary(
814
String ruleClass,
915
String ruleName,

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class ArchrulesLibraryPlugin : Plugin<Project> {
5555
archRuleServicesFile.set(
5656
project.layout.buildDirectory.file(
5757
"resources/archRules/META-INF/services/com.netflix.nebula.archrules.core.ArchRulesService"
58-
).map { it.asFile }
58+
)
5959
)
6060
ruleSourceClasses.setFrom(archRulesSourceSet.output)
6161
dependsOn(archRulesSourceSet.classesTaskName)

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
5454
.configureEach {
5555
project.configureCheckTaskForSourceSet(this, archRulesExt)
5656
}
57-
val checkTasks = project.tasks.withType<CheckRulesTask>()
5857

5958
val jsonReportDependencies = project.configurations.dependencyScope("archRulesJsonReporting"){
6059
project.dependencies.add(this.name, ARCHRULES_DEPENDENCY)
@@ -64,22 +63,16 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
6463
extendsFrom(jsonReportDependencies.get())
6564
}
6665
val jsonReportTask = project.tasks.register<PrintJsonReportTask>("archRulesJsonReport") {
67-
getDataFiles().set(
68-
project.provider { (project.tasks.withType<CheckRulesTask>().flatMap { it.outputs.files }) }
69-
)
66+
dataFiles.from(project.tasks.withType<CheckRulesTask>())
7067
getJsonReportFile().set(archRulesReportDir.map { it.file("report.json").asFile })
7168
reportingClasspath.setFrom(jsonReportClasspath)
72-
dependsOn(checkTasks)
7369
onlyIf { archRulesExt.jsonReportEnabled.get() }
7470
}
7571

7672
val consoleReportTask = project.tasks.register<PrintConsoleReportTask>("archRulesConsoleReport") {
77-
dataFiles.from(
78-
project.provider { (project.tasks.withType<CheckRulesTask>().flatMap { it.outputs.files }) }
79-
)
73+
dataFiles.from(project.tasks.withType<CheckRulesTask>())
8074
summaryForPassingDisabled.set(archRulesExt.skipPassingSummaries)
8175
detailsThreshold.set(archRulesExt.consoleDetailsThreshold)
82-
dependsOn(checkTasks)
8376
onlyIf { archRulesExt.consoleReportEnabled.get() }
8477
}
8578

@@ -98,16 +91,12 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
9891
}
9992

10093
val enforceTask = project.tasks.register<EnforceArchRulesTask>("enforceArchRules") {
101-
dependsOn(checkTasks)
102-
dataFiles.set(
103-
project.provider { (project.tasks.withType<CheckRulesTask>().flatMap { it.outputs.files }) }
104-
)
94+
dataFiles.from(project.tasks.withType<CheckRulesTask>())
10595
failureThreshold.set(archRulesExt.failureThreshold)
10696
onlyIf { failureThreshold.isPresent }
10797
}
10898

10999
project.tasks.named("check") {
110-
dependsOn(checkTasks)
111100
dependsOn(enforceTask)
112101
finalizedBy(jsonReportTask, consoleReportTask)
113102
}

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/EnforceArchRulesTask.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package com.netflix.nebula.archrules.gradle
22

33
import com.tngtech.archunit.lang.Priority
44
import org.gradle.api.DefaultTask
5-
import org.gradle.api.provider.ListProperty
5+
import org.gradle.api.file.ConfigurableFileCollection
66
import org.gradle.api.provider.Property
77
import org.gradle.api.tasks.*
8-
import java.io.File
98

109
@CacheableTask
1110
abstract class EnforceArchRulesTask : DefaultTask() {
@@ -16,7 +15,7 @@ abstract class EnforceArchRulesTask : DefaultTask() {
1615
*/
1716
@get:InputFiles
1817
@get:PathSensitive(PathSensitivity.RELATIVE)
19-
abstract val dataFiles: ListProperty<File>
18+
abstract val dataFiles: ConfigurableFileCollection
2019

2120
/**
2221
* The data files to read in. These files should container binary data representing [RuleResult]s
@@ -28,7 +27,7 @@ abstract class EnforceArchRulesTask : DefaultTask() {
2827

2928
@TaskAction
3029
fun enforce() {
31-
val criticalFailures = dataFiles.get()
30+
val criticalFailures = dataFiles.files
3231
.filter { it.exists() }
3332
.flatMap { ViolationsUtil.readDetails(it) }
3433
.filter { it.status == RuleResultStatus.FAIL }
@@ -52,4 +51,4 @@ abstract class EnforceArchRulesTask : DefaultTask() {
5251
null -> false
5352
}
5453
}
55-
}
54+
}

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class ArchrulesRunnerPluginTest {
9999
.`as`("console report inputs are correct")
100100
.hasSize(2)
101101
val jsonReport = project.tasks.named<PrintJsonReportTask>("archRulesJsonReport")
102-
assertThat(jsonReport.get().dataFiles.get())
102+
assertThat(jsonReport.get().dataFiles.files)
103103
.`as`("json report inputs are correct")
104104
.hasSize(2)
105105
}

0 commit comments

Comments
 (0)