From a715473485724753507ca020ab32b2ee111c7e88 Mon Sep 17 00:00:00 2001 From: z3rotig4r Date: Tue, 30 Jun 2026 13:51:11 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20EgovFlatFileByteReader=20=EA=B3=B5?= =?UTF-8?q?=EC=9C=A0=20=EA=B0=80=EB=B3=80=20static=20LINE=5FCRLF=EB=A5=BC?= =?UTF-8?q?=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=84=ED=99=98=20(=EB=8F=99=EC=8B=9C=EC=84=B1?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=86=90=EC=83=81=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/file/EgovFlatFileByteReader.java | 17 ++++++--- .../transform/EgovFixedByteTokenizer.java | 29 +++++++++++++-- .../item/file/EgovFlatFileByteReaderTest.java | 28 +++++++++++++++ .../transform/EgovFixedByteTokenizerTest.java | 36 +++++++++++++++++++ 4 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java create mode 100644 Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizerTest.java diff --git a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java index 06d16c03..ebadafcf 100755 --- a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java +++ b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java @@ -54,7 +54,7 @@ public class EgovFlatFileByteReader extends AbstractItemCountingItemStreamIte private static final Logger LOGGER = LoggerFactory.getLogger(EgovFlatFileByteReader.class); private static final int UNIX_CRLF = 1; private static final int WINDOWS_CRLF = 2; - public static int LINE_CRLF = 2; + private int lineCrlf = WINDOWS_CRLF; byte[] b = null; private RecordSeparatorPolicy recordSeparatorPolicy = new SimpleRecordSeparatorPolicy(); private EgovByteReaderFactory bufferedReaderFactory = new EgovByteReaderFactory(); @@ -112,12 +112,19 @@ public void setLength(int length) { */ public void setOsType(String osType) { if (!osType.equalsIgnoreCase("WINDOWS")) { - LINE_CRLF = UNIX_CRLF; + this.lineCrlf = UNIX_CRLF; } else { - LINE_CRLF = WINDOWS_CRLF; + this.lineCrlf = WINDOWS_CRLF; } } + /** + * 라인 구분자 길이를 반환 + */ + public int getLineCrlf() { + return this.lineCrlf; + } + /** * Factory for the {@link BufferedReader} that will be used to extract lines * from the file. The default is fine for plain text files, but this is a @@ -186,13 +193,13 @@ protected T doRead() throws Exception { */ private byte[] readLine() { if (b == null) { - b = new byte[length + LINE_CRLF]; + b = new byte[length + this.lineCrlf]; } int line = 0; try { - line = this.reader.read(b, offset, length + LINE_CRLF); + line = this.reader.read(b, offset, length + this.lineCrlf); if (line < 0) { return null; } diff --git a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizer.java b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizer.java index 2addcb26..6611b995 100755 --- a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizer.java +++ b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizer.java @@ -15,7 +15,6 @@ */ package org.egovframe.rte.bat.core.item.file.transform; -import org.egovframe.rte.bat.core.item.file.EgovFlatFileByteReader; import org.springframework.batch.item.file.transform.IncorrectLineLengthException; import org.springframework.batch.item.file.transform.Range; import org.springframework.util.ObjectUtils; @@ -66,6 +65,14 @@ public class EgovFixedByteTokenizer extends EgovAbstractByteLineTokenizer { */ private String byteEncoding = DEFAULT_CHARSET; + private static final int UNIX_CRLF = 1; + private static final int WINDOWS_CRLF = 2; + + /** + * 라인 구분자 길이 + */ + private int lineCrlf = WINDOWS_CRLF; + /** * 범위값을 세팅 */ @@ -81,6 +88,24 @@ public void setByteEncoding(String encoding) { this.byteEncoding = encoding; } + /** + * 라인 구분자 길이를 세팅 + */ + public void setLineCrlf(int lineCrlf) { + this.lineCrlf = lineCrlf; + } + + /** + * OS타입에 따라 라인 구분자 길이를 세팅 + */ + public void setOsType(String osType) { + if (!osType.equalsIgnoreCase("WINDOWS")) { + this.lineCrlf = UNIX_CRLF; + } else { + this.lineCrlf = WINDOWS_CRLF; + } + } + /** * 주어진 구간값을 계산하여 범위를 산정 */ @@ -130,7 +155,7 @@ protected List doTokenize(byte[] line) throws Exception { protected List doTokenize(byte[] byteString, String encoding) throws Exception { String token; List tokens = new ArrayList(ranges.length); - int lineLength = byteString.length - EgovFlatFileByteReader.LINE_CRLF; + int lineLength = byteString.length - this.lineCrlf; if (lineLength == 0) { throw new IncorrectLineLengthException("Line length must be longer than 0", maxRange, lineLength); diff --git a/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java new file mode 100644 index 00000000..573df133 --- /dev/null +++ b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java @@ -0,0 +1,28 @@ +package org.egovframe.rte.bat.core.item.file; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EgovFlatFileByteReaderTest { + + @Test + public void testOsTypeIsIsolatedPerReader() { + EgovFlatFileByteReader readerA = new EgovFlatFileByteReader<>(); + readerA.setOsType("UNIX"); + EgovFlatFileByteReader readerB = new EgovFlatFileByteReader<>(); + readerB.setOsType("WINDOWS"); + + // Regression guard: the old shared static value was overwritten by reader B. + assertEquals(1, readerA.getLineCrlf()); + assertEquals(2, readerB.getLineCrlf()); + } + + @Test + public void testDefaultOsTypeIsWindows() { + EgovFlatFileByteReader reader = new EgovFlatFileByteReader<>(); + + assertEquals(2, reader.getLineCrlf()); + } + +} diff --git a/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizerTest.java b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizerTest.java new file mode 100644 index 00000000..248ce262 --- /dev/null +++ b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovFixedByteTokenizerTest.java @@ -0,0 +1,36 @@ +package org.egovframe.rte.bat.core.item.file.transform; + +import org.junit.jupiter.api.Test; +import org.springframework.batch.item.file.transform.Range; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EgovFixedByteTokenizerTest { + + @Test + public void testDefaultWindowsLineCrlf() throws Exception { + EgovFixedByteTokenizer tokenizer = createTokenizer(); + byte[] line = "ABCDEF\r\n".getBytes(StandardCharsets.US_ASCII); + + assertEquals(Arrays.asList("ABC", "DEF"), tokenizer.doTokenize(line, StandardCharsets.US_ASCII.name())); + } + + @Test + public void testUnixLineCrlf() throws Exception { + EgovFixedByteTokenizer tokenizer = createTokenizer(); + tokenizer.setOsType("UNIX"); + byte[] line = "ABCDEF\n".getBytes(StandardCharsets.US_ASCII); + + assertEquals(Arrays.asList("ABC", "DEF"), tokenizer.doTokenize(line, StandardCharsets.US_ASCII.name())); + } + + private EgovFixedByteTokenizer createTokenizer() { + EgovFixedByteTokenizer tokenizer = new EgovFixedByteTokenizer(); + tokenizer.setColumns(new Range[]{new Range(1, 3), new Range(4, 6)}); + return tokenizer; + } + +}