diff --git a/metafacture-io/build.gradle b/metafacture-io/build.gradle index 4f1363d6c..16da7f531 100644 --- a/metafacture-io/build.gradle +++ b/metafacture-io/build.gradle @@ -25,6 +25,7 @@ dependencies { runtimeOnly "org.tukaani:xz:${versions.tukaani}" testImplementation "com.github.tomakehurst:wiremock-jre8:${versions.wiremock}" testImplementation "junit:junit:${versions.junit}" + testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit_jupiter}" testImplementation "org.mockito:mockito-core:${versions.mockito}" testImplementation "org.assertj:assertj-core:${versions.assertj}" testRuntimeOnly "org.slf4j:slf4j-simple:${versions.slf4j}" diff --git a/metafacture-io/src/main/java/org/metafacture/io/RecordReader.java b/metafacture-io/src/main/java/org/metafacture/io/RecordReader.java index 1122ad97d..0a5bfd454 100644 --- a/metafacture-io/src/main/java/org/metafacture/io/RecordReader.java +++ b/metafacture-io/src/main/java/org/metafacture/io/RecordReader.java @@ -141,8 +141,8 @@ public void process(final Reader reader) { private void emitRecord() { final String record = builder.toString(); if (!skipEmptyRecords || !record.isEmpty()) { - getReceiver().process(record); builder.delete(0, builder.length()); + getReceiver().process(record); } } diff --git a/metafacture-io/src/test/java/org/metafacture/io/RecordReaderTest.java b/metafacture-io/src/test/java/org/metafacture/io/RecordReaderTest.java index 20cc42d46..fe688e125 100644 --- a/metafacture-io/src/test/java/org/metafacture/io/RecordReaderTest.java +++ b/metafacture-io/src/test/java/org/metafacture/io/RecordReaderTest.java @@ -17,16 +17,20 @@ package org.metafacture.io; import org.metafacture.framework.ObjectReceiver; +import org.metafacture.framework.helpers.DefaultObjectReceiver; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.Assertions; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; /** * Tests for {@link RecordReader}. @@ -223,7 +227,38 @@ public void testShouldProcessMultipleReaders() { ordered.verify(receiver, Mockito.times(2)).process(RECORD2); ordered.verify(receiver).process(RECORD1); Mockito.verifyNoMoreInteractions(receiver); + } + @Test + public void issue584_shouldResetBufferOnException() { + final String error = "ERROR:"; + final String success = "SUCCESS:"; + + final List actual = new ArrayList<>(); + final String[] expected = new String[]{error + RECORD1, success + RECORD2}; + + recordReader.setReceiver(new DefaultObjectReceiver() { + @Override + public void process(final String obj) { + if (RECORD1.equals(obj)) { + throw new IllegalArgumentException(obj); + } + else { + actual.add(success + obj); + } + } + }); + + try { + recordReader.process(new StringReader(RECORD1)); + } + catch (final IllegalArgumentException e) { + actual.add(error + e.getMessage()); + } + + recordReader.process(new StringReader(RECORD2)); + + Assertions.assertArrayEquals(expected, actual.toArray()); } }