diff --git a/archunit/src/main/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStore.java b/archunit/src/main/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStore.java index cf2726760a..6d279ff7f4 100644 --- a/archunit/src/main/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStore.java +++ b/archunit/src/main/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStore.java @@ -25,7 +25,6 @@ import java.util.UUID; import java.util.regex.Pattern; -import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.tngtech.archunit.PublicAPI; import com.tngtech.archunit.lang.ArchRule; @@ -151,24 +150,23 @@ public void save(ArchRule rule, List violations) { } private void write(List violations, File ruleDetails) { - String updatedViolations = Joiner.on("\n").join(escape(violations)); + StringBuilder builder = new StringBuilder(); + for (String violation : violations) { + builder.append(escape(violation)).append("\n"); + } try { - Files.write(ruleDetails.toPath(), updatedViolations.getBytes(UTF_8)); + Files.write(ruleDetails.toPath(), builder.toString().getBytes(UTF_8)); } catch (IOException e) { throw new StoreUpdateFailedException(e); } } - private List escape(List violations) { - return replaceCharacter(violations, "\n", "\\\n"); - } - - private List unescape(List violations) { - return replaceCharacter(violations, "\\\n", "\n"); + private String escape(String violation) { + return violation.replace("\n", "\\\n"); } - private List replaceCharacter(List violations, String characterToReplace, String replacement) { - return violations.stream().map(violation -> violation.replace(characterToReplace, replacement)).collect(toList()); + private String unescape(String violation) { + return violation.replace("\\\n", "\n"); } private String ensureRuleFileName(ArchRule rule) { @@ -197,8 +195,9 @@ public List getViolations(ArchRule rule) { private List readLines(String ruleDetailsFileName) { String violationsText = readStoreFile(ruleDetailsFileName); - List lines = Splitter.on(UNESCAPED_LINE_BREAK_PATTERN).omitEmptyStrings().splitToList(violationsText); - return unescape(lines); + return Splitter.on(UNESCAPED_LINE_BREAK_PATTERN).omitEmptyStrings().splitToStream(violationsText) + .map(this::unescape) + .collect(toList()); } private String readStoreFile(String fileName) { diff --git a/archunit/src/test/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStoreTest.java b/archunit/src/test/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStoreTest.java index 301ee3aa47..9916799d5d 100644 --- a/archunit/src/test/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStoreTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/library/freeze/TextFileBasedViolationStoreTest.java @@ -60,8 +60,8 @@ public void stores_violations_of_single_rule_in_configured_folder() throws IOExc String ruleViolationsFile = properties.getProperty(defaultRule().getDescription()); assertThat(ruleViolationsFile).isNotBlank(); - List violationLines = Files.readLines(new File(configuredFolder, ruleViolationsFile), UTF_8); - assertThat(violationLines).containsOnly("first violation", "second violation"); + String contents = Files.asCharSource(new File(configuredFolder, ruleViolationsFile), UTF_8).read(); + assertThat(contents).isEqualTo("first violation\nsecond violation\n"); } @Test