diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileConverter.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileConverter.java new file mode 100644 index 0000000..936a9d4 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileConverter.java @@ -0,0 +1,23 @@ +package edu.ntnu.idi.idatt2003.g40.mappe; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class FileConverter { + + public List getStocksFromFile(FileParser fileParser) throws IOException { + List strings = fileParser.readFile(); + List stocksFromFile = new ArrayList<>(); + + strings.forEach(s -> { + String[] lineElements = s.split(","); + String stockSymbol = lineElements[0].trim(); + String stockName = lineElements[1].trim(); + BigDecimal stockPrice = new BigDecimal(lineElements[2].trim()); + stocksFromFile.add(new Stock(stockSymbol, stockName, stockPrice)); + }); + return stocksFromFile; + } +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileParser.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileParser.java new file mode 100644 index 0000000..23c8f8a --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/FileParser.java @@ -0,0 +1,68 @@ +package edu.ntnu.idi.idatt2003.g40.mappe; + +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.function.Predicate; + +public class FileParser { + + private final String pathName; + + private enum ParserRuleSet { + NOT_EMPTY(s -> !s.trim().isEmpty()), + NOT_COMMENT(s -> !s.startsWith("#")), + VALID_FORMAT(NOT_EMPTY.rule.and(NOT_COMMENT.rule)), + VALID_CODE(s -> s.matches("[A-Z]{4}")), + VALID_NAME(s -> s.matches(".*")), + CAN_PARSE_TO_BIG_DECIMAL(s -> { + try { + new BigDecimal(s); + return true; + } catch (NumberFormatException e) { + return false; + } + }), + VALID_PRICE_FORMAT(s -> s.matches("[^a-zA-Z]+")), + VALID_PRICE(VALID_PRICE_FORMAT.rule.and(CAN_PARSE_TO_BIG_DECIMAL.rule)); + + private final Predicate rule; + + ParserRuleSet(final Predicate rule) { + this.rule = rule; + } + } + + public FileParser(final String pathName) { + this.pathName = pathName; + } + + public List readFile() throws IOException { + try { + Path path = Paths.get(pathName); + List allLines = Files.readAllLines(path); + List readableLines = allLines.stream().filter(ParserRuleSet.VALID_FORMAT.rule).toList(); + + // Valid lines (following the correct regular expressions) + return readableLines.stream().filter(s -> { + String[] parts = s.trim().split(","); + + if (parts.length != 3) { + return false; + } + + boolean validCode = ParserRuleSet.VALID_CODE.rule.test(parts[0].trim()); + boolean validName = ParserRuleSet.VALID_NAME.rule.test(parts[1].trim()); + boolean validPrice = ParserRuleSet.VALID_PRICE.rule.test(parts[2].trim()); + + return validCode && validName && validPrice; + }).toList(); + + } catch (IOException e) { + throw new IOException("File parser could not parse file!"); + } + } +} diff --git a/src/main/resources/dummydata.txt b/src/main/resources/dummydata.txt new file mode 100644 index 0000000..29f6c6b --- /dev/null +++ b/src/main/resources/dummydata.txt @@ -0,0 +1,11 @@ +#THIS IS A COMMENT. Below me is an empty line + +AAPL, Apple Inc., 276.43 +NVID, Nvidida Corporation, 241.591 + +#Above me are some valid formats. +#Below me are some invalid formats + +COOLI, This is a cool name, 252.2 + +COOL, This is a cool name, 252.2a \ No newline at end of file