From 230e87ba441ded8a16501e600fb48571aa606dfb Mon Sep 17 00:00:00 2001 From: junhyeong0411 Date: Fri, 10 Nov 2023 23:47:07 +0900 Subject: [PATCH 1/5] Add exception for file changes in flashcard.txt --- data/flashcards/flashcard.txt | 3 ++ data/flashcards/flashcard1110.txt | 3 ++ .../seedu/duke/calendar/CalendarManager.java | 1 + .../java/seedu/duke/flashcard/Flashcard.java | 2 +- .../duke/flashcard/FlashcardComponent.java | 1 + .../{calendar => storage}/EventStorage.java | 31 +++---------- .../duke/storage/EventStorageParser.java | 46 +++++++++++++++++++ .../FlashcardStorage.java | 24 ++++++++-- .../FlashcardStorageParser.java | 24 +++++++++- .../exceptions/EventFileFormatException.java | 4 ++ .../FlashcardFileFormatException.java | 4 ++ src/test/java/seedu/duke/DukeTest.java | 4 +- 12 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 data/flashcards/flashcard1110.txt rename src/main/java/seedu/duke/{calendar => storage}/EventStorage.java (69%) create mode 100644 src/main/java/seedu/duke/storage/EventStorageParser.java rename src/main/java/seedu/duke/{flashcard => storage}/FlashcardStorage.java (72%) rename src/main/java/seedu/duke/{flashcard => storage}/FlashcardStorageParser.java (60%) create mode 100644 src/main/java/seedu/duke/storage/exceptions/EventFileFormatException.java create mode 100644 src/main/java/seedu/duke/storage/exceptions/FlashcardFileFormatException.java diff --git a/data/flashcards/flashcard.txt b/data/flashcards/flashcard.txt index cbf57134e9..a7cdb0d1e3 100644 --- a/data/flashcards/flashcard.txt +++ b/data/flashcards/flashcard.txt @@ -1,2 +1,5 @@ 3 | cs2113 | software enginnering | 3 5 | Hello | Duke | 4 +7 | Hello | Duke | 5 +9 | id | checker | 5 +10 | id increases | correctly | 5 diff --git a/data/flashcards/flashcard1110.txt b/data/flashcards/flashcard1110.txt new file mode 100644 index 0000000000..acf345ab1d --- /dev/null +++ b/data/flashcards/flashcard1110.txt @@ -0,0 +1,3 @@ +3 | cs2113 | software enginnering | 3 +5 | Hello | Duke | 4 +7 | Hello | Duke | 5 diff --git a/src/main/java/seedu/duke/calendar/CalendarManager.java b/src/main/java/seedu/duke/calendar/CalendarManager.java index 26c2512827..a691d73df0 100644 --- a/src/main/java/seedu/duke/calendar/CalendarManager.java +++ b/src/main/java/seedu/duke/calendar/CalendarManager.java @@ -4,6 +4,7 @@ import seedu.duke.calendar.command.EventCommand; import seedu.duke.calendar.command.UnknownCommand; +import seedu.duke.storage.EventStorage; import java.io.FileNotFoundException; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/flashcard/Flashcard.java b/src/main/java/seedu/duke/flashcard/Flashcard.java index b34473220c..3d89fff944 100644 --- a/src/main/java/seedu/duke/flashcard/Flashcard.java +++ b/src/main/java/seedu/duke/flashcard/Flashcard.java @@ -45,7 +45,7 @@ public static void calculateAndUpdateGlobalMaxId( } } - globalMaxId = currentMax + 1; + globalMaxId = currentMax; } public int getId() { diff --git a/src/main/java/seedu/duke/flashcard/FlashcardComponent.java b/src/main/java/seedu/duke/flashcard/FlashcardComponent.java index 32f584dad6..2a664959b2 100644 --- a/src/main/java/seedu/duke/flashcard/FlashcardComponent.java +++ b/src/main/java/seedu/duke/flashcard/FlashcardComponent.java @@ -4,6 +4,7 @@ import seedu.duke.flashcard.command.FlashcardCommand; import seedu.duke.flashcard.command.UnknownCommand; +import seedu.duke.storage.FlashcardStorage; import java.io.FileNotFoundException; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/calendar/EventStorage.java b/src/main/java/seedu/duke/storage/EventStorage.java similarity index 69% rename from src/main/java/seedu/duke/calendar/EventStorage.java rename to src/main/java/seedu/duke/storage/EventStorage.java index 0cbe5face8..6998cbe063 100644 --- a/src/main/java/seedu/duke/calendar/EventStorage.java +++ b/src/main/java/seedu/duke/storage/EventStorage.java @@ -1,10 +1,13 @@ -package seedu.duke.calendar; +package seedu.duke.storage; + +import seedu.duke.calendar.Event; +import seedu.duke.calendar.EventList; +import seedu.duke.calendar.Goal; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Scanner; import java.util.logging.Level; @@ -31,28 +34,6 @@ public boolean isStorageAvailable(){ return f.exists(); } - /** - * load an event from certain format - * Tokens includes attributes of Event - * @param tokens is used to get event name - * @return Event object - */ - private Event loadEvent(String[] tokens){ - - assert tokens.length == 3 || tokens.length == 4: "Token length should be 3 or 4"; - if(tokens.length == 3) { - String name = tokens[0].trim(); - LocalDateTime from = LocalDateTime.parse(tokens[1].trim()); - LocalDateTime to = LocalDateTime.parse(tokens[2].trim()); - return new Event(name, from, to); - } - String name = tokens[0].trim(); - LocalDateTime by = LocalDateTime.parse(tokens[1].trim()); - int goal = Integer.parseInt(tokens[2].trim()); - int completed = Integer.parseInt(tokens[3].trim()); - return new Goal(name, by, goal, completed); - } - /** * load list of events * from this.path @@ -66,7 +47,7 @@ public EventList loadEvents() throws FileNotFoundException{ while(s.hasNext()){ String[] eventTokens = s.nextLine().split(" \\| "); - eventList.addEvent(loadEvent(eventTokens)); + eventList.addEvent(EventStorageParser.loadEvent(eventTokens)); } logger.log(Level.INFO, String.format( diff --git a/src/main/java/seedu/duke/storage/EventStorageParser.java b/src/main/java/seedu/duke/storage/EventStorageParser.java new file mode 100644 index 0000000000..527ab28973 --- /dev/null +++ b/src/main/java/seedu/duke/storage/EventStorageParser.java @@ -0,0 +1,46 @@ +package seedu.duke.storage; + +import seedu.duke.calendar.Event; +import seedu.duke.calendar.Goal; + +import java.time.LocalDateTime; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class EventStorageParser { + + private static Logger logger; // for logging + + + /** + * load an event from certain format + * Tokens includes attributes of Event + * @param tokens is used to get event name + * @return Event object + */ + public static Event loadEvent(String[] tokens){ + + logger = Logger.getLogger("event"); + logger.setLevel(Level.WARNING); + + assert tokens.length == 3 || tokens.length == 4: "Token length should be 3 or 4"; + + if(tokens.length == 3) { + String name = tokens[0].trim(); + LocalDateTime from = LocalDateTime.parse(tokens[1].trim()); + LocalDateTime to = LocalDateTime.parse(tokens[2].trim()); + + logger.log(Level.INFO, "loaded event"); + + return new Event(name, from, to); + } + String name = tokens[0].trim(); + LocalDateTime by = LocalDateTime.parse(tokens[1].trim()); + int goal = Integer.parseInt(tokens[2].trim()); + int completed = Integer.parseInt(tokens[3].trim()); + + logger.log(Level.INFO, "loaded event"); + + return new Goal(name, by, goal, completed); + } +} diff --git a/src/main/java/seedu/duke/flashcard/FlashcardStorage.java b/src/main/java/seedu/duke/storage/FlashcardStorage.java similarity index 72% rename from src/main/java/seedu/duke/flashcard/FlashcardStorage.java rename to src/main/java/seedu/duke/storage/FlashcardStorage.java index c8d98b3467..5500e51d8e 100644 --- a/src/main/java/seedu/duke/flashcard/FlashcardStorage.java +++ b/src/main/java/seedu/duke/storage/FlashcardStorage.java @@ -1,4 +1,8 @@ -package seedu.duke.flashcard; +package seedu.duke.storage; + +import seedu.duke.flashcard.Flashcard; +import seedu.duke.flashcard.FlashcardList; +import seedu.duke.storage.exceptions.FlashcardFileFormatException; import java.io.File; import java.io.FileNotFoundException; @@ -9,6 +13,8 @@ import java.util.logging.Level; import java.util.logging.Logger; +import static seedu.duke.storage.FlashcardStorageParser.flashcardFileChecker; + /** * storage for flashcards * One storage manages one file @@ -47,11 +53,19 @@ public FlashcardList loadFlashcards() throws FileNotFoundException{ File f = new File (this.path); Scanner s = new Scanner(f); - while(s.hasNext()){ - String[] flashTokens = s.nextLine().split(" \\| "); - flashcardList.add(FlashcardStorageParser.loadFlashcard(flashTokens)); - flashlogger.log(Level.INFO, "added flashcard"); + try{ + while(s.hasNext()){ + String[] flashTokens = s.nextLine().split(" \\| "); + flashcardFileChecker(flashTokens); + flashcardList.add(FlashcardStorageParser.loadFlashcard(flashTokens)); + flashlogger.log(Level.INFO, "added flashcard"); + } + } catch (FlashcardFileFormatException e) { + System.out.println("The flashcard save file is corrupted"); + System.out.println("Automatically making new file"); + flashcardList = new FlashcardList(new ArrayList<>()); + saveFlashcards(flashcardList.getFlashcards()); } flashlogger.log(Level.INFO, String.format( diff --git a/src/main/java/seedu/duke/flashcard/FlashcardStorageParser.java b/src/main/java/seedu/duke/storage/FlashcardStorageParser.java similarity index 60% rename from src/main/java/seedu/duke/flashcard/FlashcardStorageParser.java rename to src/main/java/seedu/duke/storage/FlashcardStorageParser.java index 3f45cbc9c2..3120d09362 100644 --- a/src/main/java/seedu/duke/flashcard/FlashcardStorageParser.java +++ b/src/main/java/seedu/duke/storage/FlashcardStorageParser.java @@ -1,6 +1,8 @@ -package seedu.duke.flashcard; +package seedu.duke.storage; + +import seedu.duke.flashcard.Flashcard; +import seedu.duke.storage.exceptions.FlashcardFileFormatException; -import java.time.LocalDateTime; import java.util.logging.Level; import java.util.logging.Logger; @@ -12,6 +14,24 @@ public final class FlashcardStorageParser { private static Logger flashlogger; // for logging + /** + * check the saved file format + * token length should be 4 + * type should be integer, string, string, integer + * @param tokens + * @throws FlashcardFileFormatException + */ + public static void flashcardFileChecker(String[] tokens) throws FlashcardFileFormatException { + if(tokens.length != 4) throw new FlashcardFileFormatException(); + + try { + Integer.parseInt(tokens[0].trim()); + Integer.parseInt(tokens[3].trim()); + } catch (NumberFormatException e) { + throw new FlashcardFileFormatException(); + } + } + /** * load a flash card from certain format * Tokens includes attributes of Flashcard diff --git a/src/main/java/seedu/duke/storage/exceptions/EventFileFormatException.java b/src/main/java/seedu/duke/storage/exceptions/EventFileFormatException.java new file mode 100644 index 0000000000..b03384593e --- /dev/null +++ b/src/main/java/seedu/duke/storage/exceptions/EventFileFormatException.java @@ -0,0 +1,4 @@ +package seedu.duke.storage.exceptions; + +public class EventFileFormatException extends Exception{ +} diff --git a/src/main/java/seedu/duke/storage/exceptions/FlashcardFileFormatException.java b/src/main/java/seedu/duke/storage/exceptions/FlashcardFileFormatException.java new file mode 100644 index 0000000000..b248f29454 --- /dev/null +++ b/src/main/java/seedu/duke/storage/exceptions/FlashcardFileFormatException.java @@ -0,0 +1,4 @@ +package seedu.duke.storage.exceptions; + +public class FlashcardFileFormatException extends Exception{ +} diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java index 7a842b3e88..c43d813e6d 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/seedu/duke/DukeTest.java @@ -5,10 +5,10 @@ import org.junit.jupiter.api.Test; import seedu.duke.calendar.CalendarManager; -import seedu.duke.calendar.EventStorage; +import seedu.duke.storage.EventStorage; import seedu.duke.flashcard.FlashcardComponent; import seedu.duke.flashcard.FlashcardList; -import seedu.duke.flashcard.FlashcardStorage; +import seedu.duke.storage.FlashcardStorage; import seedu.duke.flashcard.FlashcardUi; From ff8cb878b4c76402b0a24ed7b8247a0b2e3ea8c5 Mon Sep 17 00:00:00 2001 From: junhyeong0411 Date: Sat, 11 Nov 2023 00:04:04 +0900 Subject: [PATCH 2/5] Add exception for file changes in event.txt --- data/events/event.txt | 2 +- .../java/seedu/duke/storage/EventStorage.java | 19 ++++++++++-- .../duke/storage/EventStorageParser.java | 30 +++++++++++++++++++ .../duke/storage/FlashcardStorageParser.java | 6 ++-- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/data/events/event.txt b/data/events/event.txt index 40ec95f025..4e557f107c 100644 --- a/data/events/event.txt +++ b/data/events/event.txt @@ -1,4 +1,4 @@ hello | 2023-12-20T12:30:30 | 2023-12-20T12:30:30 EC3333 | 2023-12-20T12:30:30 | 2023-12-20T12:30:40 -Deadline | 2023-12-20T12:30:30 | 10 | 0 +Deadline | 2023-12-20Tsf0:30 | 10 | 0 More Deadline | 2023-12-20T12:30:30 | 20 | 0 diff --git a/src/main/java/seedu/duke/storage/EventStorage.java b/src/main/java/seedu/duke/storage/EventStorage.java index 6998cbe063..0e6899da11 100644 --- a/src/main/java/seedu/duke/storage/EventStorage.java +++ b/src/main/java/seedu/duke/storage/EventStorage.java @@ -3,6 +3,8 @@ import seedu.duke.calendar.Event; import seedu.duke.calendar.EventList; import seedu.duke.calendar.Goal; +import seedu.duke.flashcard.FlashcardList; +import seedu.duke.storage.exceptions.EventFileFormatException; import java.io.File; import java.io.FileNotFoundException; @@ -13,6 +15,8 @@ import java.util.logging.Level; import java.util.logging.Logger; +import static seedu.duke.storage.EventStorageParser.eventFileChecker; + /** * storage for Events @@ -45,11 +49,20 @@ public EventList loadEvents() throws FileNotFoundException{ File f = new File (this.path); Scanner s = new Scanner(f); - while(s.hasNext()){ - String[] eventTokens = s.nextLine().split(" \\| "); - eventList.addEvent(EventStorageParser.loadEvent(eventTokens)); + try{ + while(s.hasNext()){ + String[] eventTokens = s.nextLine().split(" \\| "); + eventFileChecker(eventTokens); + eventList.addEvent(EventStorageParser.loadEvent(eventTokens)); + } + } catch (EventFileFormatException e) { + System.out.println("The flashcard save file is corrupted"); + System.out.println("Automatically making new file"); + eventList = new EventList(new ArrayList<>()); + saveEvents(eventList.getEvents()); } + logger.log(Level.INFO, String.format( " There are currently %d events in the save file", eventList.getSize())); diff --git a/src/main/java/seedu/duke/storage/EventStorageParser.java b/src/main/java/seedu/duke/storage/EventStorageParser.java index 527ab28973..12a6fe4e22 100644 --- a/src/main/java/seedu/duke/storage/EventStorageParser.java +++ b/src/main/java/seedu/duke/storage/EventStorageParser.java @@ -2,8 +2,11 @@ import seedu.duke.calendar.Event; import seedu.duke.calendar.Goal; +import seedu.duke.storage.exceptions.EventFileFormatException; +import seedu.duke.storage.exceptions.FlashcardFileFormatException; import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; import java.util.logging.Level; import java.util.logging.Logger; @@ -11,6 +14,33 @@ public class EventStorageParser { private static Logger logger; // for logging + /** + * check the saved file format + * token length should be 3 or 4 + * if token length is 3, format should be string, localdatetime, localdatetime + * if token length is 4, format should be string, localdatetime, int, int + * @param tokens is a split txt line + * @throws EventFileFormatException + */ + public static void eventFileChecker(String[] tokens) throws EventFileFormatException { + if(tokens.length != 3 && tokens.length != 4) { + throw new EventFileFormatException(); + } + + try { + LocalDateTime.parse(tokens[1].trim()); + if(tokens.length == 3){ + LocalDateTime.parse(tokens[2].trim()); + } + if(tokens.length == 4){ + Integer.parseInt(tokens[2].trim()); + Integer.parseInt(tokens[3].trim()); + } + } catch (DateTimeParseException | NumberFormatException e) { + throw new EventFileFormatException(); + } + } + /** * load an event from certain format diff --git a/src/main/java/seedu/duke/storage/FlashcardStorageParser.java b/src/main/java/seedu/duke/storage/FlashcardStorageParser.java index 3120d09362..795be643e7 100644 --- a/src/main/java/seedu/duke/storage/FlashcardStorageParser.java +++ b/src/main/java/seedu/duke/storage/FlashcardStorageParser.java @@ -18,11 +18,13 @@ public final class FlashcardStorageParser { * check the saved file format * token length should be 4 * type should be integer, string, string, integer - * @param tokens + * @param tokens is a split txt line * @throws FlashcardFileFormatException */ public static void flashcardFileChecker(String[] tokens) throws FlashcardFileFormatException { - if(tokens.length != 4) throw new FlashcardFileFormatException(); + if(tokens.length != 4) { + throw new FlashcardFileFormatException(); + } try { Integer.parseInt(tokens[0].trim()); From a8930377411d6f0f48b43dd7f9ffeb1bc31ec40d Mon Sep 17 00:00:00 2001 From: junhyeong0411 Date: Sat, 11 Nov 2023 00:07:33 +0900 Subject: [PATCH 3/5] Restore event.txt file --- data/events/event.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/events/event.txt b/data/events/event.txt index 4e557f107c..40ec95f025 100644 --- a/data/events/event.txt +++ b/data/events/event.txt @@ -1,4 +1,4 @@ hello | 2023-12-20T12:30:30 | 2023-12-20T12:30:30 EC3333 | 2023-12-20T12:30:30 | 2023-12-20T12:30:40 -Deadline | 2023-12-20Tsf0:30 | 10 | 0 +Deadline | 2023-12-20T12:30:30 | 10 | 0 More Deadline | 2023-12-20T12:30:30 | 20 | 0 From 435c29790094c947c5fb72257ad2877ba2637ae4 Mon Sep 17 00:00:00 2001 From: Wendelin Wemhoener Date: Sun, 12 Nov 2023 00:59:29 +0800 Subject: [PATCH 4/5] Disallow creating empty flashcards --- data/flashcards/flashcard.txt | 1 + .../duke/flashcard/command/CreateFlashcardCommand.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/data/flashcards/flashcard.txt b/data/flashcards/flashcard.txt index a7cdb0d1e3..d5784585bf 100644 --- a/data/flashcards/flashcard.txt +++ b/data/flashcards/flashcard.txt @@ -3,3 +3,4 @@ 7 | Hello | Duke | 5 9 | id | checker | 5 10 | id increases | correctly | 5 +11 | f | dfdf | 5 diff --git a/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java b/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java index ca2d74f034..3f2e9c4f9d 100644 --- a/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java +++ b/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java @@ -23,6 +23,15 @@ public class CreateFlashcardCommand extends FlashcardCommand { public void execute(Scanner scanner, FlashcardList flashcardList) { System.out.print(" Enter the front page text: "); String frontPageText = scanner.nextLine(); + + while (frontPageText.strip().equals("")) { + System.out.println(" Invalid input! The front text must " + + "contain at least one letter or digit!"); + + System.out.print(" Enter the front page text: "); + frontPageText = scanner.nextLine(); + } + System.out.print(" Enter the back page text: "); String backPageText = scanner.nextLine(); From 70a5c2a25bda3a8d9215d24184bd2f16820c47f3 Mon Sep 17 00:00:00 2001 From: Wendelin Wemhoener Date: Sun, 12 Nov 2023 01:05:13 +0800 Subject: [PATCH 5/5] Disallow empty flashcard back --- data/flashcards/flashcard.txt | 8 +++++--- .../duke/flashcard/command/CreateFlashcardCommand.java | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/data/flashcards/flashcard.txt b/data/flashcards/flashcard.txt index d5784585bf..dc1b225a97 100644 --- a/data/flashcards/flashcard.txt +++ b/data/flashcards/flashcard.txt @@ -1,6 +1,8 @@ 3 | cs2113 | software enginnering | 3 5 | Hello | Duke | 4 -7 | Hello | Duke | 5 -9 | id | checker | 5 +7 | Hello | Duke | 4 +9 | id | checker | 6 10 | id increases | correctly | 5 -11 | f | dfdf | 5 +11 | f | dfdf | 5 +12 | dfdf | | 5 +13 | 1 | j | 5 diff --git a/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java b/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java index 3f2e9c4f9d..f0eaae8db5 100644 --- a/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java +++ b/src/main/java/seedu/duke/flashcard/command/CreateFlashcardCommand.java @@ -35,6 +35,14 @@ public void execute(Scanner scanner, FlashcardList flashcardList) { System.out.print(" Enter the back page text: "); String backPageText = scanner.nextLine(); + while (backPageText.strip().equals("")) { + System.out.println(" Invalid input! The back text must " + + "contain at least one letter or digit!"); + + System.out.print(" Enter the back page text: "); + backPageText = scanner.nextLine(); + } + Flashcard flashcard = new Flashcard(frontPageText, backPageText); flashcardList.add(flashcard);