Skip to content

Commit 5b45c6c

Browse files
committed
improve error handling when reading data files
1 parent d1ce72b commit 5b45c6c

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

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

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.netflix.nebula.archrules.core.ArchRulesService;
44
import com.netflix.nebula.archrules.core.Runner;
5-
import com.tngtech.archunit.core.importer.ClassFileImporter;
65
import com.tngtech.archunit.core.importer.ClassFileImporterWithPackage;
76
import com.tngtech.archunit.lang.Priority;
87
import org.gradle.workers.WorkAction;
@@ -11,9 +10,6 @@
1110
import org.slf4j.LoggerFactory;
1211

1312
import java.io.File;
14-
import java.io.FileOutputStream;
15-
import java.io.IOException;
16-
import java.io.ObjectOutputStream;
1713
import java.util.ArrayList;
1814
import java.util.List;
1915
import java.util.Map;
@@ -105,17 +101,6 @@ public void execute() {
105101
}
106102
});
107103

108-
try (var out = new ObjectOutputStream(new FileOutputStream(getParameters().getDataOutputFile().get()))) {
109-
out.writeInt(violationList.size());
110-
violationList.forEach((v) -> {
111-
try {
112-
out.writeObject(v);
113-
} catch (IOException e) {
114-
throw new RuntimeException(e);
115-
}
116-
});
117-
} catch (IOException e) {
118-
throw new RuntimeException(e);
119-
}
104+
ViolationsUtil.writeDetails(getParameters().getDataOutputFile().get(), violationList);
120105
}
121106
}

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

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@ package com.netflix.nebula.archrules.gradle
22

33
import com.tngtech.archunit.lang.Priority
44
import org.gradle.internal.logging.text.StyledTextOutput
5+
import org.slf4j.Logger
6+
import org.slf4j.LoggerFactory
57
import java.io.File
68
import java.io.FileInputStream
9+
import java.io.FileOutputStream
710
import java.io.IOException
811
import java.io.ObjectInputStream
12+
import java.io.ObjectOutputStream
913

1014
/**
1115
* Helpers for dealing with [RuleResult]
1216
*/
1317
class ViolationsUtil {
1418
companion object {
19+
val log: Logger = LoggerFactory.getLogger(ViolationsUtil::class.java)
20+
1521
@JvmStatic
1622
fun readDetails(dataFile: File): List<RuleResult> {
1723
val list: MutableList<RuleResult> = mutableListOf()
@@ -23,18 +29,30 @@ class ViolationsUtil {
2329
}
2430
}
2531
} catch (e: IOException) {
26-
throw RuntimeException(e)
32+
log.warn("Archrules data read failed for {}", dataFile.absolutePath, e)
2733
} catch (e: ClassNotFoundException) {
2834
throw RuntimeException(e)
2935
}
3036
return list
3137
}
3238

3339
@JvmStatic
34-
fun printReport(violations: Map<Rule, List<RuleResult>>,
35-
output: StyledTextOutput,
36-
priorityThreshold: Priority?,
37-
infoLogging: Boolean) {
40+
fun writeDetails(dataFile: File, violationList : List<RuleResult>) {
41+
ObjectOutputStream(FileOutputStream(dataFile)).use { out ->
42+
out.writeInt(violationList.size)
43+
violationList.forEach {
44+
out.writeObject(it);
45+
}
46+
}
47+
}
48+
49+
@JvmStatic
50+
fun printReport(
51+
violations: Map<Rule, List<RuleResult>>,
52+
output: StyledTextOutput,
53+
priorityThreshold: Priority?,
54+
infoLogging: Boolean
55+
) {
3856
output.style(StyledTextOutput.Style.Header).println("ArchRule Violation Details:")
3957
violations
4058
.mapValues { it.value.filter { it.rule().priority().meetsThreshold(priorityThreshold) || infoLogging } }
@@ -59,7 +77,12 @@ class ViolationsUtil {
5977
}
6078

6179
@JvmStatic
62-
fun printSummary(resultMap: Map<Rule, List<RuleResult>>, output: StyledTextOutput, skipPassing: Boolean, infoLogging: Boolean) {
80+
fun printSummary(
81+
resultMap: Map<Rule, List<RuleResult>>,
82+
output: StyledTextOutput,
83+
skipPassing: Boolean,
84+
infoLogging: Boolean
85+
) {
6386
output.style(StyledTextOutput.Style.Header).println("ArchRule Summary:")
6487
val indent = 4
6588
val maxRuleNameLength = resultMap.keys.maxOfOrNull { it.ruleName().length } ?: 1

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,22 @@ import com.tngtech.archunit.lang.Priority
44
import org.assertj.core.api.Assertions.assertThat
55
import org.gradle.internal.logging.text.StyledTextOutput
66
import org.junit.jupiter.api.Test
7+
import org.junit.jupiter.api.io.TempDir
8+
import java.io.File
79

810
internal class ViolationsUtilTest {
11+
@TempDir
12+
lateinit var tempDir: File
13+
14+
@Test
15+
fun `test serialization`() {
16+
val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM)
17+
val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS))
18+
val dataFile = tempDir.resolve("test.data")
19+
ViolationsUtil.writeDetails(dataFile, results)
20+
val actual = ViolationsUtil.readDetails(dataFile)
21+
assertThat(actual).containsExactlyElementsOf(results)
22+
}
923

1024
@Test
1125
fun `test printSummary`() {

0 commit comments

Comments
 (0)