From 8d54a9f59e23bef7e679e9141b60a4efcce3af25 Mon Sep 17 00:00:00 2001
From: Jesper Zedlitz <jesper@zedlitz.de>
Date: Wed, 15 Dec 2021 07:58:56 +0100
Subject: [PATCH] handle consecutive empty lines correctly

---
 .../catalogproxy/FilterInvalidRDF.java        | 21 +++++++------
 .../catalogproxy/FilterInvalidRDFTest.java    | 30 +++++++++++++++++--
 2 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java b/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java
index 3507515..0b90295 100644
--- a/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java
+++ b/src/main/java/de/landsh/opendata/catalogproxy/FilterInvalidRDF.java
@@ -31,13 +31,13 @@ public class FilterInvalidRDF extends InputStream {
             String[] fragments = line.split("&");
             for (int i = 1; i < fragments.length; i++) {
                 String fragment = fragments[i];
-                if( !(fragment.startsWith("#") || fragment.startsWith("amp") || fragment.startsWith("apos")
-                || fragment.startsWith("quot") || fragment.startsWith("lt")|| fragment.startsWith("gt"))) {
+                if (!(fragment.startsWith("#") || fragment.startsWith("amp") || fragment.startsWith("apos")
+                        || fragment.startsWith("quot") || fragment.startsWith("lt") || fragment.startsWith("gt"))) {
                     // invalid character entity reference
-                    fragments[i] = "amp;"+ fragment;
+                    fragments[i] = "amp;" + fragment;
                 }
             }
-            line = StringUtils.join(fragments,"&");
+            line = StringUtils.join(fragments, "&");
         }
 
         String before = null;
@@ -84,12 +84,6 @@ public class FilterInvalidRDF extends InputStream {
             return -1;
         }
 
-        // insert a newline character at the end of each line
-        if (index == currentLine.length) {
-            index++;
-            return '\n';
-        }
-
         if (index > currentLine.length) {
             readNextLine();
         }
@@ -97,7 +91,12 @@ public class FilterInvalidRDF extends InputStream {
         if (currentLine == null) {
             return -1;
         }
-
+        // insert a newline character at the end of each line
+        if (index == currentLine.length) {
+            index++;
+            return '\n';
+        }
+        
         byte result = currentLine[index];
         index++;
         return result;
diff --git a/src/test/java/de/landsh/opendata/catalogproxy/FilterInvalidRDFTest.java b/src/test/java/de/landsh/opendata/catalogproxy/FilterInvalidRDFTest.java
index f188d81..44d3600 100644
--- a/src/test/java/de/landsh/opendata/catalogproxy/FilterInvalidRDFTest.java
+++ b/src/test/java/de/landsh/opendata/catalogproxy/FilterInvalidRDFTest.java
@@ -3,6 +3,7 @@ package de.landsh.opendata.catalogproxy;
 import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.Test;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
@@ -21,6 +22,32 @@ public class FilterInvalidRDFTest {
         assertEquals(expectedResult, result);
     }
 
+    @Test
+    public void read_empty_stream() throws IOException {
+        InputStream inputStream = new FilterInvalidRDF(new ByteArrayInputStream(new byte[0]));
+        assertEquals(-1, inputStream.read());
+    }
+
+    @Test
+    public void read_empty_line() throws IOException {
+        InputStream inputStream = new FilterInvalidRDF(new ByteArrayInputStream("\n".getBytes()));
+        String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+        assertEquals("\n", result);
+    }
+    @Test
+    public void read_empty_lines() throws IOException {
+        InputStream inputStream = new FilterInvalidRDF(new ByteArrayInputStream("\n\n\n".getBytes()));
+        String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+        assertEquals("\n\n\n", result);
+    }
+
+    @Test
+    public void read_no_newline() throws IOException {
+        InputStream inputStream = new FilterInvalidRDF(new ByteArrayInputStream("OK".getBytes()));
+        String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+        assertEquals("OK\n", result);
+    }
+
     @Test
     public void read_iri_with_space() throws IOException {
         final String invalidIRI = "\"https://opendata.schleswig-holstein.de/dataset/automatische-zahlstelle-neustadt i. h.-süd-2012\"";
@@ -30,7 +57,7 @@ public class FilterInvalidRDFTest {
         final String correctedURL = "https://www.bast.de/DE/Verkehrstechnik/Fachthemen/v2-verkehrszaehlung/Aktuell/zaehl_aktuell_node.html?nn=1819516&amp;cms_detail=1105&amp;cms_map=0";
 
         String expectedResult = IOUtils.toString(getClass().getResourceAsStream("/invalid_iri.xml"), StandardCharsets.UTF_8)
-                .replace(invalidIRI,correctedIRI)
+                .replace(invalidIRI, correctedIRI)
                 .replace(invalidURL, correctedURL);
 
         InputStream inputStream = new FilterInvalidRDF(getClass().getResourceAsStream("/invalid_iri.xml"));
@@ -59,6 +86,5 @@ public class FilterInvalidRDFTest {
     @Test
     public void filterLine_invalid_xml_entity() {
         assertEquals("?nn=1819516&amp;cms_detail=1105&amp;cms_map=0", FilterInvalidRDF.filterLine("?nn=1819516&cms_detail=1105&cms_map=0"));
-
     }
 }
-- 
GitLab