diff --git a/src/main/java/millions/controller/GameController.java b/src/main/java/millions/controller/GameController.java index 7688f6f..a437790 100644 --- a/src/main/java/millions/controller/GameController.java +++ b/src/main/java/millions/controller/GameController.java @@ -63,7 +63,7 @@ public List getStocks() { * Gives alphabetic sort of findStocks * * @param searchTerm - * @return + * @return Alphabetically sorted list of stocks */ public List searchStocks(String searchTerm) { if (searchTerm == null || searchTerm.isBlank()) { @@ -78,12 +78,19 @@ public List searchStocks(String searchTerm) { * Get stocks with symbol * * @param symbol - * @return + * @return stocks with matching symbol */ public Stock getStock(String symbol) { return exchange.getStock(symbol); } + /** + * Purchases a stock + * + * @param symbol Symbol of desired stock + * @param quantity How much of a stock to purchase + * @return Transaction object for purchase + */ public Transaction buyStock(String symbol, BigDecimal quantity) { if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { throw new IllegalArgumentException("Quantity must be positive"); @@ -91,6 +98,12 @@ public Transaction buyStock(String symbol, BigDecimal quantity) { return exchange.buy(symbol, player, quantity); } + /** + * Sells a share + * + * @param share Share to sell + * @return Transaction object for sale + */ public Transaction sellShare(Share share) { if (share == null) { throw new IllegalArgumentException("Share cannot be null"); @@ -98,6 +111,12 @@ public Transaction sellShare(Share share) { return exchange.sell(share, player); } + /** + * Returns a players owned shares + * + * @param symbol Symbol for stock + * @return List of shares + */ public List getOwnedShares(String symbol) { return new ArrayList<>(player.getPortfolio().getShares(symbol)); } @@ -106,12 +125,24 @@ public void advanceWeek() { exchange.advance(); } + /** + * Returns the players owned quantity of a given share + * + * @param symbol Symbol for shares + * @return BigDecimal Quantity + */ public BigDecimal getOwnedQuantity(String symbol) { return player.getPortfolio().getShares(symbol).stream() .map(Share::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); } + /** + * Returns the maximum quantity of a stock the player can purchase + * + * @param symbol Symbol for stock + * @return int Quantity + */ public int getMaxBuyableQuantity(String symbol) { Stock stock = getStock(symbol); if (stock == null || player == null) { diff --git a/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java b/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java index fd2c3fb..95f7b56 100644 --- a/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java +++ b/src/main/java/millions/controller/fileIO/CSV/CSVFileHandler.java @@ -10,7 +10,7 @@ import java.util.List; /** - *

Bundles StockFileReader and CSVStockFileParser together to reduce boilerplate code when reading stocks from a csv file

+ * Bundles StockFileReader and CSVStockFileParser together to reduce boilerplate code when reading stocks from a csv file */ public class CSVFileHandler { StockFileReader reader; @@ -24,7 +24,7 @@ public CSVFileHandler() { /** * Reads and parses stocks from a csv file * @param filePath Path to stock file - * @return list of stock object created from parsed file + * @return list of stock objects created from parsed file * @throws InvalidFormatException Throws an InvalidFormatException received from parser * @throws UncheckedFileNotFoundException Upon Receiving a FilenotFoundException */ diff --git a/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java index 9208bbc..2a5d1ae 100644 --- a/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java +++ b/src/main/java/millions/controller/fileIO/CSV/CSVStockFileParser.java @@ -16,7 +16,7 @@ public CSVStockFileParser() {} * Verifies the amount of data fields present in supplied CSV file. * * @param lines Lines from csv file - * @return Boolean: True if file satisfies expected format (3 fields) + * @return Boolean: True if file satisfies expected format */ public boolean verifyCSV(List lines) { return lines.stream() diff --git a/src/main/java/millions/controller/fileIO/UncheckedFileNotFoundException.java b/src/main/java/millions/controller/fileIO/UncheckedFileNotFoundException.java index 0b4b02d..6f87d4c 100644 --- a/src/main/java/millions/controller/fileIO/UncheckedFileNotFoundException.java +++ b/src/main/java/millions/controller/fileIO/UncheckedFileNotFoundException.java @@ -1,5 +1,8 @@ package millions.controller.fileIO; +/** + * RuntimeException wrapper for FileNotFoundException. + */ public class UncheckedFileNotFoundException extends RuntimeException { public UncheckedFileNotFoundException(String message) { super(message); diff --git a/src/main/java/millions/model/Exchange.java b/src/main/java/millions/model/Exchange.java index ef59694..55b2ab7 100644 --- a/src/main/java/millions/model/Exchange.java +++ b/src/main/java/millions/model/Exchange.java @@ -41,6 +41,15 @@ public Exchange(String name, List stockList) { } } + /** + * Purchases a quantity of a given stock. + * + * @param symbol Symbol identifying the stock. + * @param player The player doing the purchase. + * @param quantity Quantity to purchase. + * @throws IllegalArgumentException If a stock isn't found + * @return Transaction object for purchase. + */ public Transaction buy(String symbol, Player player, BigDecimal quantity) { Stock stock = this.stocks.get(symbol); @@ -61,6 +70,13 @@ public Transaction buy(String symbol, Player player, int quantity) { return this.buy(symbol, player, BigDecimal.valueOf(quantity)); } + /** + * Creates a transaction for a sale. + * + * @param share share to sell. + * @param player player performing the sale. + * @return Transaction object for sale. + */ public Transaction sell(Share share, Player player) { Transaction sale = saleFactory.createTransaction(share, weekNumber); @@ -95,6 +111,12 @@ public List findStocks(String searchTerm) { .toList(); } + /** + * Returns the best performing stocks. + * + * @param limit Mmount of stocks to collect. + * @return Sorted list of stock objects sorted + */ public List getGainers(int limit) { Collection stocksCollection = stocks.values(); return stocksCollection.stream() @@ -103,6 +125,12 @@ public List getGainers(int limit) { .collect(Collectors.toList()); } + /** + * Returns the worst performing stocks. + * + * @param limit Amount of stocks to collect + * @return Sorted list of stock objects + */ public List getLosers(int limit) { Collection stocksCollection = stocks.values(); return stocksCollection.stream() @@ -111,6 +139,9 @@ public List getLosers(int limit) { .collect(Collectors.toList()); } + /** + * Advances the current game week by performing new price calculations for all stocks. + */ public void advance() { this.weekNumber++; for (Stock stock : this.stocks.values()) { diff --git a/src/main/java/millions/model/Player.java b/src/main/java/millions/model/Player.java index 2dfd684..e4abeae 100644 --- a/src/main/java/millions/model/Player.java +++ b/src/main/java/millions/model/Player.java @@ -62,10 +62,10 @@ public void withdrawMoney(BigDecimal amount) { } /** - * @return + * Calculates the skill level of the player + * @return String player status level */ public String getStatus() { - // TODO dobbel sjekk logikken int weeksTraded = transactionArchive.countDistinctWeeks(); String status = "Novice"; @@ -81,21 +81,21 @@ public String getStatus() { } /** - * @return + * @return player name */ public String getName() { return this.name; } /** - * @return + * @return player money */ public BigDecimal getMoney() { return this.money; } /** - * @return + * @return player portfolio */ public Portfolio getPortfolio() { return this.portfolio; @@ -120,28 +120,28 @@ public void removeShareFromPortfolio(Share share) { } /** - * @return + * @return player net worth */ public BigDecimal getNetWorth() { return this.money.add(this.portfolio.getNetWorth()); } /** - * @return + * @return TransactionArchive object */ public TransactionArchive getTransactionArchive() { return this.transactionArchive; } /** - * @param listener + * @param listener PlayerListener */ public void addListener(PlayerListener listener) { listeners.add(listener); } /** - * @param listener + * @param listener PlayerListener */ public void removeListener(PlayerListener listener) { listeners.remove(listener); diff --git a/src/main/java/millions/model/Portfolio.java b/src/main/java/millions/model/Portfolio.java index 210f784..4374595 100644 --- a/src/main/java/millions/model/Portfolio.java +++ b/src/main/java/millions/model/Portfolio.java @@ -15,7 +15,7 @@ public Portfolio() { /** * @param share Share to be added - * @return + * @return Boolean for success */ public boolean addShare(Share share) { return this.shares.add(share); @@ -23,22 +23,22 @@ public boolean addShare(Share share) { /** * @param share Share to be removed - * @return + * @return Boolean for success */ public boolean removeShare(Share share) { return this.shares.remove(share); } /** - * @return + * @return List of shares */ public List getShares() { return this.shares; } /** - * @param symbol - * @return + * @param symbol Symbol for share + * @return List of shares */ public List getShares(String symbol) { return this.shares.stream() @@ -47,7 +47,7 @@ public List getShares(String symbol) { } /** - * @return + * @return BigDecimal net worth */ public BigDecimal getNetWorth() { BigDecimal total = BigDecimal.ZERO; @@ -59,8 +59,8 @@ public BigDecimal getNetWorth() { } /** - * @param share - * @return + * @param share Share + * @return Boolean */ public boolean contains(Share share) { return this.shares.contains(share); diff --git a/src/main/java/millions/view/StartView.java b/src/main/java/millions/view/StartView.java index 44e02f6..dd7dfba 100644 --- a/src/main/java/millions/view/StartView.java +++ b/src/main/java/millions/view/StartView.java @@ -6,6 +6,9 @@ import java.net.URL; import java.nio.file.Paths; import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -15,10 +18,11 @@ import javafx.scene.layout.VBox; import javafx.stage.FileChooser; import javafx.stage.Stage; +import millions.App; /** The initial game setup screen where the player enters their info. */ public class StartView extends VBox { - + private static final Logger logger = Logger.getLogger(StartView.class.getName()); private TextField nameField; private TextField startingAmountField; private TextField preRunWeeksField; @@ -110,6 +114,7 @@ private File loadDefaultStocksFile() { URL resource = Objects.requireNonNull(getClass().getResource("/data/default-stocks.csv")); return Paths.get(resource.toURI()).toFile(); } catch (URISyntaxException e) { + logger.log(Level.SEVERE, "Error accessing default stocks file", e); throw new IllegalStateException("Could not load default stocks file", e); } }