From 2a547116ffa65579c8ada312aa58e6497c4023f3 Mon Sep 17 00:00:00 2001 From: asdfasdf Date: Tue, 1 Oct 2019 15:28:41 -0700 Subject: [PATCH] Added Save / Load interface for WatchList + test --- src/main/data/Load.java | 11 ++++++ src/main/data/Save.java | 7 ++++ src/main/data/WatchList.java | 70 ++++++++++++++++++++++++++++++++++-- src/main/ui/Main.java | 18 +++++++++- src/main/ui/Tui.java | 7 +++- src/test/WatchListTest.java | 22 +++++++++++- 6 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 src/main/data/Load.java create mode 100644 src/main/data/Save.java diff --git a/src/main/data/Load.java b/src/main/data/Load.java new file mode 100644 index 0000000..a6229b5 --- /dev/null +++ b/src/main/data/Load.java @@ -0,0 +1,11 @@ +package data; + +public interface Load { + // Effects: Load data from a file + // Modifies: this + // Requires: Existing file with name "filename" + public void load(String filename); + + // Effects: Check if file exists + public boolean fileExists(String filename); +} diff --git a/src/main/data/Save.java b/src/main/data/Save.java new file mode 100644 index 0000000..a45ad4e --- /dev/null +++ b/src/main/data/Save.java @@ -0,0 +1,7 @@ +package data; + +public interface Save { + // Effects: Save data to a file + // Modifies: this + public void save(String filename); +} diff --git a/src/main/data/WatchList.java b/src/main/data/WatchList.java index ffb106c..96c8d40 100644 --- a/src/main/data/WatchList.java +++ b/src/main/data/WatchList.java @@ -1,14 +1,29 @@ package data; import java.util.*; +import java.io.*; import data.StockEntry; +import ui.Main; -public class WatchList { +public class WatchList implements Load,Save { private LinkedHashMap listdata; + private Main mainObj; + public static final String DEFAULT_SAVEFILE = ".jwatch.list"; // Effects: List is empty - public WatchList() { - this.listdata = new LinkedHashMap(); + // or loaded with save values + public WatchList(Main mainObj) { + listdata = new LinkedHashMap(); + this.mainObj = mainObj; + if (fileExists(DEFAULT_SAVEFILE)) { + load(""); + } + } + + // Debug constructor + public WatchList(Main mainObj, boolean debug) { + listdata = new LinkedHashMap(); + this.mainObj = mainObj; } // Effects: Add an entry with key==target @@ -38,4 +53,53 @@ public class WatchList { public int size() { return listdata.size(); } + + @Override + public void save(String filename) { + if (filename.equals("")) { + filename = DEFAULT_SAVEFILE; + } + try { + FileWriter fwriter = new FileWriter(filename); + BufferedWriter bwriter = new BufferedWriter(fwriter); + Iterator iterate = iterator(); + while (iterate.hasNext()) { + Map.Entry entry = (Map.Entry)iterate.next(); + String outString = (String)entry.getKey(); + System.out.println("Exported: " + outString); + bwriter.write(outString); + bwriter.newLine(); + } + bwriter.close(); + } catch (IOException e) { + System.out.println("IO Error when writing: " + filename); + } + } + + @Override + public boolean fileExists(String filename) { + File fileObj = new File(filename); + return fileObj.isFile(); + } + + @Override + public void load(String filename) { + if (filename.equals("")) { + filename = DEFAULT_SAVEFILE; + } + String sss = null; + try { + FileReader freader = new FileReader(filename); + BufferedReader breader = new BufferedReader(freader); + while ((sss = breader.readLine()) != null) { + mainObj.addWatchStock(sss); + System.out.println("Imported: " + sss); + } + breader.close(); + } catch (FileNotFoundException e) { + System.out.println("File not found: " + filename); + } catch (IOException e) { + System.out.println("IO Error when reading: " + filename); + } + } } diff --git a/src/main/ui/Main.java b/src/main/ui/Main.java index 042e399..6f74df1 100644 --- a/src/main/ui/Main.java +++ b/src/main/ui/Main.java @@ -21,11 +21,20 @@ public class Main { //parse args, uses allOptions.parseArgs(args); stypeMap = new StypeMap(); - mainList = new WatchList(); + mainList = new WatchList(this); //initalize UI thread, options not ready //this.Iface = IfaceFactory.getIface(allOptions.getSection("ui")); iface = IfaceFactory.getIface(this); } + + //Constructor for testing + public Main(boolean debug) { + //init options, it will load defaults + //from resource xml + allOptions = new Options(); + stypeMap = new StypeMap(); + mainList = new WatchList(this, true); + } // java main public static void main(String[] args) { @@ -38,6 +47,7 @@ public class Main { return this.mainList; } + // Consider moving all to watchlist public void addWatchStock(String target) { //XXX Concurrency not ready // Should add runnable to executor @@ -46,9 +56,15 @@ public class Main { mainList.addStock(target, stype); } + // Consider moving all to watchlist public void delWatchStock(String target) { //XXX Concurrency not ready // Should add runnable to executor mainList.delStock(target); } + + // Consider moving all to watchlist + public void saveWatch(String file) { + mainList.save(file); + } } diff --git a/src/main/ui/Tui.java b/src/main/ui/Tui.java index 3ea0845..f3cf217 100644 --- a/src/main/ui/Tui.java +++ b/src/main/ui/Tui.java @@ -127,12 +127,13 @@ public class Tui implements Iface { } public void demo() { - System.out.println("Welcome to " + Const.PROGRAM_NAME + "!"); + System.out.println(" Welcome to " + Const.PROGRAM_NAME + "!"); boolean cont = true; while (cont) { demomenu(); cont = demoinput(); } + saveWatch(); System.out.println("Thank you for using " + Const.PROGRAM_NAME + "!"); } @@ -159,4 +160,8 @@ public class Tui implements Iface { String userin = getInputLine(); main.delWatchStock(userin); } + + public void saveWatch() { + main.saveWatch(""); + } } diff --git a/src/test/WatchListTest.java b/src/test/WatchListTest.java index 6d46b1a..b82c05e 100644 --- a/src/test/WatchListTest.java +++ b/src/test/WatchListTest.java @@ -2,6 +2,8 @@ import data.WatchList; import data.StypeMap; import data.StockType; import data.Nyse; +import ui.Main; +import java.io.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -10,11 +12,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class WatchListTest { private WatchList watchlist; + private Main mainObj; private StypeMap smap; @BeforeEach public void runBefore() { - watchlist = new WatchList(); + mainObj = new Main(true); + watchlist = mainObj.getWatchList(); smap = new StypeMap(); } @@ -47,4 +51,20 @@ public class WatchListTest { } assertEquals(watchlist.size(), 50); } + + @Test + public void testSaveLoad() { + StockType nyyyse = smap.getStype("Nyse"); + for (int i = 0; i < 100; i++) { + watchlist.addStock(Integer.toString(i), nyyyse); + } + watchlist.save(""); + assertTrue(watchlist.fileExists(watchlist.DEFAULT_SAVEFILE)); + Main testMain = new Main(true); + WatchList testlist = testMain.getWatchList(); + testlist.load(""); + assertEquals(watchlist.size(), testlist.size()); + File testFile = new File(watchlist.DEFAULT_SAVEFILE); + testFile.delete(); + } }