From 2f63d03d40cc893173e914f60ba0168922b115b3 Mon Sep 17 00:00:00 2001 From: Nikollai Date: Mon, 18 May 2026 15:04:18 +0200 Subject: [PATCH 1/3] Created CSVFileHandler to reduce overhead code when reading stocks from a CSV file Also changed where file information is passed to filereader and csvparser respectively to accommodate this change --- .../millions/controller/GameController.java | 9 +++--- .../controller/fileIO/CSVFileHandler.java | 31 +++++++++++++++++++ .../controller/fileIO/CSVStockFileParser.java | 15 +++++---- .../controller/fileIO/StockFileReader.java | 9 ++---- .../java/millions/CSVStockFileParserTest.java | 4 +-- .../java/millions/CSVStockFileWriterTest.java | 4 +-- .../java/millions/StockFileReaderTest.java | 4 +-- 7 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 src/main/java/millions/controller/fileIO/CSVFileHandler.java diff --git a/src/main/java/millions/controller/GameController.java b/src/main/java/millions/controller/GameController.java index fe626bf..9cc6239 100644 --- a/src/main/java/millions/controller/GameController.java +++ b/src/main/java/millions/controller/GameController.java @@ -5,6 +5,8 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; + +import millions.controller.fileIO.CSVFileHandler; import millions.controller.fileIO.CSVStockFileParser; import millions.controller.fileIO.InvalidFormatException; import millions.controller.fileIO.StockFileReader; @@ -23,11 +25,8 @@ public void startGame( throw new IllegalArgumentException("Pre run weeks cannot be negative"); } try { - StockFileReader reader = new StockFileReader(stockFilePath); - List lines = reader.readFile(); - CSVStockFileParser parser = new CSVStockFileParser(lines); - - List stocks = parser.parse(); + CSVFileHandler fileHandler = new CSVFileHandler(); + List stocks = fileHandler.getStocksFromFile(stockFilePath); exchange = new Exchange("Exchange", stocks); for (int i = 0; i < preRunWeeks; i++) { diff --git a/src/main/java/millions/controller/fileIO/CSVFileHandler.java b/src/main/java/millions/controller/fileIO/CSVFileHandler.java new file mode 100644 index 0000000..1a8b192 --- /dev/null +++ b/src/main/java/millions/controller/fileIO/CSVFileHandler.java @@ -0,0 +1,31 @@ +package millions.controller.fileIO; + +import millions.controller.fileIO.StockFileReader; +import millions.controller.fileIO.CSVStockFileParser; +import millions.model.Stock; + +import java.nio.file.Path; +import java.util.List; + +public class CSVFileHandler { + StockFileReader reader; + CSVStockFileParser parser; + + public CSVFileHandler() { + this.reader = new StockFileReader(); + this.parser = new CSVStockFileParser(); + } + + public List getStocksFromFile(Path filePath) { + try { + StockFileReader reader = new StockFileReader(); + List lines = reader.readFile(filePath); + + CSVStockFileParser parser = new CSVStockFileParser(); + return parser.parse(lines); + + } catch (InvalidFormatException e) { + throw new InvalidFormatException(e.getMessage()); + } + } +} diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java index a1084ad..fa74dde 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java +++ b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java @@ -9,13 +9,7 @@ public class CSVStockFileParser { private List lines; - public CSVStockFileParser(List lines) { - if (verifyCSV(lines)) { - this.lines = lines; - } else { - throw new InvalidFormatException("Incorrect format for CSV File"); - } - } + public CSVStockFileParser() {} // returns true if all entries have exactly 3 data points public boolean verifyCSV(List lines) { @@ -24,7 +18,12 @@ public boolean verifyCSV(List lines) { .noneMatch(l -> l.split(",").length != 3); } - public List parse() { + public List parse(List lines) { + if (verifyCSV(lines)) { + this.lines = lines; + } else { + throw new InvalidFormatException("Incorrect format for CSV File"); + } List stocks = new ArrayList<>(); lines.stream() .filter(l -> !((l.startsWith("#") || l.isBlank()))) diff --git a/src/main/java/millions/controller/fileIO/StockFileReader.java b/src/main/java/millions/controller/fileIO/StockFileReader.java index 31e37ee..33956b1 100644 --- a/src/main/java/millions/controller/fileIO/StockFileReader.java +++ b/src/main/java/millions/controller/fileIO/StockFileReader.java @@ -14,14 +14,11 @@ * Reads a file and returns its lines as a list of strings. */ public class StockFileReader { - private final Path filePath; - public StockFileReader(Path path) { - this.filePath = path; - } + public StockFileReader() {} - public List readFile() { - File file = new File(filePath.toString()); + public List readFile(Path path) { + File file = new File(path.toString()); List lines = new ArrayList<>(); try (Reader reader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(reader)) { diff --git a/src/test/java/millions/CSVStockFileParserTest.java b/src/test/java/millions/CSVStockFileParserTest.java index 7683445..e81cf60 100644 --- a/src/test/java/millions/CSVStockFileParserTest.java +++ b/src/test/java/millions/CSVStockFileParserTest.java @@ -30,7 +30,7 @@ public static void setUpTestFile() throws Exception { public void parseStockFileTest(){ List testList = List.of(exampleString.split("\n")); - CSVStockFileParser parser = new CSVStockFileParser(testList); - assertEquals(3, parser.parse().size()); + CSVStockFileParser parser = new CSVStockFileParser(); + assertEquals(3, parser.parse(testList).size()); } } diff --git a/src/test/java/millions/CSVStockFileWriterTest.java b/src/test/java/millions/CSVStockFileWriterTest.java index 6765f7a..4c156a0 100644 --- a/src/test/java/millions/CSVStockFileWriterTest.java +++ b/src/test/java/millions/CSVStockFileWriterTest.java @@ -37,7 +37,7 @@ public void testWrite() { CSVStockFileWriter csvStockFileWriter = new CSVStockFileWriter(stocks); csvStockFileWriter.write(tempDir.resolve("stocks.csv")); - StockFileReader stockFileReader = new StockFileReader(tempDir.resolve("stocks.csv")); - assertEquals(3, stockFileReader.readFile().size()); + StockFileReader stockFileReader = new StockFileReader(); + assertEquals(3, stockFileReader.readFile(tempDir.resolve("stocks.csv")).size()); } } diff --git a/src/test/java/millions/StockFileReaderTest.java b/src/test/java/millions/StockFileReaderTest.java index bfb9a8d..2bc8970 100644 --- a/src/test/java/millions/StockFileReaderTest.java +++ b/src/test/java/millions/StockFileReaderTest.java @@ -29,7 +29,7 @@ public static void setUpTestFile() throws Exception { @Test public void testReadStockFile() { - StockFileReader stockFileReader = new StockFileReader(sharedFile); - assertEquals(6, stockFileReader.readFile().size()); + StockFileReader stockFileReader = new StockFileReader(); + assertEquals(6, stockFileReader.readFile(sharedFile).size()); } } From ff38fdfdd01d76e32ab253fb5d33d25e3c9e15e9 Mon Sep 17 00:00:00 2001 From: Nikollai Date: Mon, 18 May 2026 15:09:54 +0200 Subject: [PATCH 2/3] Removed reduntant attributes for CSVParser and changed the parse method to reflect earlier changes --- .../controller/fileIO/CSVStockFileParser.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java index fa74dde..530ed02 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java +++ b/src/main/java/millions/controller/fileIO/CSVStockFileParser.java @@ -7,7 +7,6 @@ /** Parses CSV lines into Stock objects. */ public class CSVStockFileParser { - private List lines; public CSVStockFileParser() {} @@ -19,22 +18,21 @@ public boolean verifyCSV(List lines) { } public List parse(List lines) { + List stocks = new ArrayList<>(); if (verifyCSV(lines)) { - this.lines = lines; + lines.stream() + .filter(l -> !((l.startsWith("#") || l.isBlank()))) + .forEach( + l -> { + String[] split = l.split(","); + String symbol = split[0]; + String company = split[1]; + BigDecimal price = new BigDecimal(split[2]); + stocks.add(new Stock(symbol, company, price)); + }); } else { throw new InvalidFormatException("Incorrect format for CSV File"); } - List stocks = new ArrayList<>(); - lines.stream() - .filter(l -> !((l.startsWith("#") || l.isBlank()))) - .forEach( - l -> { - String[] split = l.split(","); - String symbol = split[0]; - String company = split[1]; - BigDecimal price = new BigDecimal(split[2]); - stocks.add(new Stock(symbol, company, price)); - }); return stocks; } } From 81ad8ae9fe1edf67ae9e492cb46b6d75a1ac0d95 Mon Sep 17 00:00:00 2001 From: Nikollai Date: Mon, 18 May 2026 15:12:08 +0200 Subject: [PATCH 3/3] Refactored packagestructure for csv file handlers --- src/main/java/millions/controller/GameController.java | 4 +--- .../millions/controller/fileIO/{ => CSV}/CSVFileHandler.java | 4 ++-- .../controller/fileIO/{ => CSV}/CSVStockFileParser.java | 4 +++- .../controller/fileIO/{ => CSV}/CSVStockFileWriter.java | 3 ++- src/test/java/millions/CSVStockFileParserTest.java | 5 +---- src/test/java/millions/CSVStockFileWriterTest.java | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) rename src/main/java/millions/controller/fileIO/{ => CSV}/CSVFileHandler.java (87%) rename src/main/java/millions/controller/fileIO/{ => CSV}/CSVStockFileParser.java (91%) rename src/main/java/millions/controller/fileIO/{ => CSV}/CSVStockFileWriter.java (92%) diff --git a/src/main/java/millions/controller/GameController.java b/src/main/java/millions/controller/GameController.java index 9cc6239..f50c4f7 100644 --- a/src/main/java/millions/controller/GameController.java +++ b/src/main/java/millions/controller/GameController.java @@ -6,10 +6,8 @@ import java.util.List; import java.util.stream.Collectors; -import millions.controller.fileIO.CSVFileHandler; -import millions.controller.fileIO.CSVStockFileParser; +import millions.controller.fileIO.CSV.CSVFileHandler; import millions.controller.fileIO.InvalidFormatException; -import millions.controller.fileIO.StockFileReader; import millions.model.Exchange; import millions.model.Player; import millions.model.Stock; diff --git a/src/main/java/millions/controller/fileIO/CSVFileHandler.java b/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java similarity index 87% rename from src/main/java/millions/controller/fileIO/CSVFileHandler.java rename to src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java index 1a8b192..5a7d9b8 100644 --- a/src/main/java/millions/controller/fileIO/CSVFileHandler.java +++ b/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java @@ -1,7 +1,7 @@ -package millions.controller.fileIO; +package millions.controller.fileIO.CSV; +import millions.controller.fileIO.InvalidFormatException; import millions.controller.fileIO.StockFileReader; -import millions.controller.fileIO.CSVStockFileParser; import millions.model.Stock; import java.nio.file.Path; diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java similarity index 91% rename from src/main/java/millions/controller/fileIO/CSVStockFileParser.java rename to src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java index 530ed02..2eab5ab 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileParser.java +++ b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java @@ -1,8 +1,10 @@ -package millions.controller.fileIO; +package millions.controller.fileIO.CSV; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; + +import millions.controller.fileIO.InvalidFormatException; import millions.model.Stock; /** Parses CSV lines into Stock objects. */ diff --git a/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileWriter.java similarity index 92% rename from src/main/java/millions/controller/fileIO/CSVStockFileWriter.java rename to src/main/java/millions/controller/fileIO/CSV/CSVStockFileWriter.java index 52fee6e..0233a7c 100644 --- a/src/main/java/millions/controller/fileIO/CSVStockFileWriter.java +++ b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileWriter.java @@ -1,5 +1,6 @@ -package millions.controller.fileIO; +package millions.controller.fileIO.CSV; +import millions.controller.fileIO.StockFileWriter; import millions.model.Stock; import java.io.BufferedWriter; diff --git a/src/test/java/millions/CSVStockFileParserTest.java b/src/test/java/millions/CSVStockFileParserTest.java index e81cf60..df753aa 100644 --- a/src/test/java/millions/CSVStockFileParserTest.java +++ b/src/test/java/millions/CSVStockFileParserTest.java @@ -1,12 +1,9 @@ package millions; -import millions.controller.fileIO.CSVStockFileParser; -import millions.controller.fileIO.StockFileReader; +import millions.controller.fileIO.CSV.CSVStockFileParser; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import java.sql.Array; -import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/millions/CSVStockFileWriterTest.java b/src/test/java/millions/CSVStockFileWriterTest.java index 4c156a0..c6fe15a 100644 --- a/src/test/java/millions/CSVStockFileWriterTest.java +++ b/src/test/java/millions/CSVStockFileWriterTest.java @@ -1,6 +1,6 @@ package millions; -import millions.controller.fileIO.CSVStockFileWriter; +import millions.controller.fileIO.CSV.CSVStockFileWriter; import millions.controller.fileIO.StockFileReader; import millions.model.Stock;