From f1d3b93ff6dd4bba023d0ca380f8111b6ae05e54 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Tue, 17 Dec 2019 16:41:02 +0100 Subject: [PATCH] [core] Preserve newlines in DocumentFile Fixes #2170 [core] DocumentFile doesn't preserve newlines --- docs/pages/release_notes.md | 2 ++ .../sourceforge/pmd/document/DocumentFile.java | 8 +++----- .../pmd/document/DocumentFileTest.java | 17 +++++++++++++++++ .../pmd/document/ShouldPreserveNewlines.java | 8 ++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 pmd-core/src/test/resources/net/sourceforge/pmd/document/ShouldPreserveNewlines.java diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 3e4ae727f7..5d993b51a9 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -28,6 +28,8 @@ the implementation based on your feedback. ### Fixed Issues +* core + * [#2170](https://github.com/pmd/pmd/issues/2170): \[core] DocumentFile doesn't preserve newlines * java-codestyle * [#2167](https://github.com/pmd/pmd/issues/2167): \[java] UnnecessaryLocalBeforeReturn false positive with variable captured by method reference * java-bestpractices diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/document/DocumentFile.java b/pmd-core/src/main/java/net/sourceforge/pmd/document/DocumentFile.java index 1aba2c795b..7c3e1640c0 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/document/DocumentFile.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/document/DocumentFile.java @@ -21,6 +21,8 @@ import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.commons.io.IOUtils; + /** * Implementation that handles a Document as a file in the filesystem and receives operations in a sorted manner * (i.e. the regions are sorted). This improves the efficiency of reading the file by only scanning it once while @@ -157,11 +159,7 @@ public class DocumentFile implements Document, Closeable { } private void writeUntilEOF() throws IOException { - String line; - - while ((line = reader.readLine()) != null) { - writer.write(line); - } + IOUtils.copy(reader, writer); } /* package-private */ List getLineToOffset() { diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/document/DocumentFileTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/document/DocumentFileTest.java index 738d886936..ece529938d 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/document/DocumentFileTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/document/DocumentFileTest.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -48,6 +49,22 @@ public class DocumentFileTest { } } + @Test + public void shouldPreserveNewlines() throws IOException { + final String testFileContent = IOUtils.toString( + DocumentFileTest.class.getResource("ShouldPreserveNewlines.java"), StandardCharsets.UTF_8); + writeContentToTemporaryFile(testFileContent); + + try (DocumentFile documentFile = new DocumentFile(temporaryFile, StandardCharsets.UTF_8)) { + documentFile.insert(0, 0, "public "); + } + + try (FileInputStream stream = new FileInputStream(temporaryFile)) { + final String actualContent = new String(readAllBytes(stream)); + assertEquals("public " + testFileContent, actualContent); + } + } + private byte[] readAllBytes(final FileInputStream stream) throws IOException { final int defaultBufferSize = 8192; final int maxBufferSize = Integer.MAX_VALUE - 8; diff --git a/pmd-core/src/test/resources/net/sourceforge/pmd/document/ShouldPreserveNewlines.java b/pmd-core/src/test/resources/net/sourceforge/pmd/document/ShouldPreserveNewlines.java new file mode 100644 index 0000000000..265d32f5d1 --- /dev/null +++ b/pmd-core/src/test/resources/net/sourceforge/pmd/document/ShouldPreserveNewlines.java @@ -0,0 +1,8 @@ +class ShouldPreserveNewlines { + public static void main(String[] args) { + System.out.println("Test"); + } +} +// note: multiple empty lines at the end + +