From 8859e99c9f5b8bddcdc629e6d528beb64f3cd145 Mon Sep 17 00:00:00 2001 From: "e0968962@u.nus.edu" Date: Sat, 9 Nov 2024 20:32:34 +0800 Subject: [PATCH] Create a Parser class for more OOP --- data/bookbob_data.txt | 1 + logs/logs.log | 18 ++ src/main/java/bookbob/Main.java | 190 +-------------------- src/main/java/bookbob/parser/Parser.java | 205 +++++++++++++++++++++++ 4 files changed, 226 insertions(+), 188 deletions(-) create mode 100644 src/main/java/bookbob/parser/Parser.java diff --git a/data/bookbob_data.txt b/data/bookbob_data.txt index 864ef982f9..7be308ec7a 100644 --- a/data/bookbob_data.txt +++ b/data/bookbob_data.txt @@ -1 +1,2 @@ Name: John Doe | NRIC: S1234567A | Phone Number: 98765432 | Date_Of_Birth: | Home Address: | Allergy: [] | Sex: | Medical History: [] | Visit: [01-10-2024 15:30, Diagnosis: [], Medications: [], 21-10-2024 15:48, Diagnosis: [], Medications: []]; +Name: Patricia Chan | NRIC: S8907890J | Phone Number: | Date_Of_Birth: | Home Address: | Allergy: [] | Sex: | Medical History: [] | Visit: [21-11-2024 18:00, Diagnosis: [], Medications: []]; diff --git a/logs/logs.log b/logs/logs.log index e69de29bb2..9aa431d552 100644 --- a/logs/logs.log +++ b/logs/logs.log @@ -0,0 +1,18 @@ +Nov 09, 2024 7:14:04 PM bookbob.Main logAndExecute +INFO: Processing help command +Nov 09, 2024 7:14:04 PM bookbob.Main logAndExecute +INFO: Successfully processed help command +Nov 09, 2024 7:16:38 PM bookbob.Main logAndExecute +INFO: Processing list command +Nov 09, 2024 7:16:38 PM bookbob.Main logAndExecute +INFO: Successfully processed list command +Nov 09, 2024 7:16:53 PM bookbob.Main validateParameters +INFO: Missing required parameter: ic/ +Nov 09, 2024 7:17:02 PM bookbob.Main validateParameters +INFO: Missing required parameter: n/ +Nov 09, 2024 7:17:25 PM bookbob.Main logAndExecute +INFO: Processing add command +Nov 09, 2024 7:17:25 PM bookbob.Main logAndExecute +INFO: Successfully processed add command +Nov 09, 2024 7:17:47 PM bookbob.Main logAndExecute +INFO: Processing exit command diff --git a/src/main/java/bookbob/Main.java b/src/main/java/bookbob/Main.java index def2fff00b..9a2e61de5f 100644 --- a/src/main/java/bookbob/Main.java +++ b/src/main/java/bookbob/Main.java @@ -4,13 +4,12 @@ import bookbob.entity.AppointmentRecord; import bookbob.functions.CommandHandler; import bookbob.functions.FileHandler; +import bookbob.parser.Parser; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.time.DateTimeException; -import java.time.format.DateTimeParseException; import java.util.Scanner; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; @@ -43,37 +42,6 @@ private static void loggerConfig() { } } - private static void logAndExecute(String commandName, Runnable action) { - logger.log(Level.INFO, "Processing {0} command", commandName); - try { - action.run(); - logger.log(Level.INFO, "Successfully processed {0} command", commandName); - } catch (IllegalArgumentException e) { - logger.log(Level.WARNING, "Invalid input for {0} command: {1}", new Object[]{commandName, e.getMessage()}); - System.out.println("Invalid input: " + e.getMessage()); - } catch (DateTimeParseException e) { - logger.log(Level.WARNING, "Error in {0} command: incorrect date format", commandName); - System.out.println("Error: incorrect date format."); - } catch (DateTimeException e) { - logger.log(Level.WARNING, "Error in {0} command: incorrect time format", commandName); - System.out.println("Error: incorrect time format."); - } catch (Exception e) { - logger.log(Level.SEVERE, "Unexpected error processing {0} command", e); - System.out.println("An unexpected error occurred: " + e.getMessage()); - } - } - - private static boolean validateParameters(String input, String... requiredMarkers) { - for (String marker : requiredMarkers) { - if (!input.contains(marker)) { - System.out.println("Please provide the required parameter: " + marker); - logger.log(Level.INFO, "Missing required parameter: {0}", marker); - return false; - } - } - return true; - } - public static void main(String[] args) throws IOException { System.out.println("Welcome to BookBob, Dr. Bob!"); loggerConfig(); @@ -87,161 +55,7 @@ public static void main(String[] args) throws IOException { while (true) { String input = in.nextLine(); - String[] inputArray = input.split(" ", 2); - String command = inputArray[0]; - - switch (command) { - case "find": - logAndExecute("find", () -> commandHandler.find(input, records)); - break; - - case "exit": - logAndExecute("exit", () -> { - try { - commandHandler.removePastAppointments(appointmentRecord); - } catch (IOException e) { - throw new RuntimeException(e); - } - commandHandler.exit(input); - }); - break; - - case "add": - if (validateParameters(input, "n/", "ic/", "v/")) { - logAndExecute("add", () -> { - try { - commandHandler.add(input, records); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - break; - - case "list": - logAndExecute("list", () -> commandHandler.list(records)); - break; - - case "edit": - logAndExecute("edit", () -> { - try { - commandHandler.edit(input, records); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - break; - - case "editVisit": - logAndExecute("editVisit", () -> { - try { - commandHandler.editVisit(input, records); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - break; - - case "delete": - logAndExecute("delete", () -> { - if (inputArray.length > 1) { - String nric = inputArray[1].trim(); - try { - commandHandler.delete(nric, records); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else { - System.out.println("Please specify an NRIC to delete."); - logger.log(Level.INFO, "Empty NRIC inputted for delete command"); - } - }); - break; - - case "help": - logAndExecute("help", commandHandler::help); - break; - - case "appointment": - if (validateParameters(input, "n/", "ic/", "date/", "time/")) { - logAndExecute("appointment", () -> { - try { - commandHandler.appointment(input, appointmentRecord); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - break; - - case "listAppointments": - logAndExecute("listAppointments", () -> commandHandler.listAppointments(appointmentRecord)); - break; - - case "deleteAppointment": - logAndExecute("deleteAppointment", () -> { - try { - commandHandler.deleteAppointment(input, appointmentRecord); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - break; - - case "findAppointment": - if (inputArray.length > 1) { - logAndExecute("findAppointment", () -> commandHandler. - findAppointment(inputArray[1], appointmentRecord)); - } else { - System.out.println("Please provide search criteria for findAppointment."); - logger.log(Level.INFO, "Missing criteria for findAppointment"); - } - break; - - case "findVisit": - if (inputArray.length > 1) { - logAndExecute("findVisit", () -> commandHandler.findVisitByIc(inputArray[1], records)); - } else { - System.out.println("Please provide NRIC for findVisit."); - logger.log(Level.INFO, "Missing NRIC for findVisit"); - } - break; - - case "findMedication": - if (inputArray.length > 1) { - logAndExecute("findMedication", () -> commandHandler.findVisitByMedication(inputArray[1], records)); - } else { - System.out.println("Please provide medication for findMedication."); - logger.log(Level.INFO, "Missing medication for findMedication"); - } - break; - - case "findDiagnosis": - if (inputArray.length > 1) { - logAndExecute("findDiagnosis", () -> commandHandler.findVisitByDiagnosis(inputArray[1], records)); - } else { - System.out.println("Please provide diagnosis for findDiagnosis."); - logger.log(Level.INFO, "Missing diagnosis for findDiagnosis"); - } - break; - - case "addVisit": - if (validateParameters(input, "ic/", "v/")) { - logAndExecute("addVisit", () -> { - try { - commandHandler.addVisit(input, records); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - break; - - default: - System.out.println("Unknown command. Type 'help' for a list of commands."); - logger.log(Level.INFO, "Unknown command received: {0}", command); - break; - } + Parser.handleCommand(input, commandHandler, records, appointmentRecord); } } } diff --git a/src/main/java/bookbob/parser/Parser.java b/src/main/java/bookbob/parser/Parser.java new file mode 100644 index 0000000000..f4e2035eee --- /dev/null +++ b/src/main/java/bookbob/parser/Parser.java @@ -0,0 +1,205 @@ +package bookbob.parser; + +import bookbob.entity.Records; +import bookbob.entity.AppointmentRecord; +import bookbob.functions.CommandHandler; + +import java.io.IOException; +import java.time.DateTimeException; +import java.time.format.DateTimeParseException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Parser { + private static final Logger logger = Logger.getLogger(Parser.class.getName()); + + public static void handleCommand(String input, CommandHandler commandHandler, Records records, + AppointmentRecord appointmentRecord) { + String[] inputArray = input.split(" ", 2); + String command = inputArray[0]; + + switch (command) { + case "help": + logAndExecute("help", commandHandler::help); + break; + + case "add": + if (validateParameters(input, "n/", "ic/", "v/")) { + logAndExecute("add", () -> { + try { + commandHandler.add(input, records); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + break; + + case "delete": + logAndExecute("delete", () -> { + if (inputArray.length > 1) { + String nric = inputArray[1].trim(); + try { + commandHandler.delete(nric, records); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + System.out.println("Please specify an NRIC to delete."); + logger.log(Level.INFO, "Empty NRIC inputted for delete command"); + } + }); + break; + + case "list": + logAndExecute("list", () -> commandHandler.list(records)); + break; + + case "edit": + logAndExecute("edit", () -> { + try { + commandHandler.edit(input, records); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + break; + + case "find": + logAndExecute("find", () -> commandHandler.find(input, records)); + break; + + case "addVisit": + if (validateParameters(input, "ic/", "v/")) { + logAndExecute("addVisit", () -> { + try { + commandHandler.addVisit(input, records); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + break; + + case "editVisit": + logAndExecute("editVisit", () -> { + try { + commandHandler.editVisit(input, records); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + break; + + case "appointment": + if (validateParameters(input, "n/", "ic/", "date/", "time/")) { + logAndExecute("appointment", () -> { + try { + commandHandler.appointment(input, appointmentRecord); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + break; + + case "listAppointments": + logAndExecute("listAppointments", () -> commandHandler.listAppointments(appointmentRecord)); + break; + + case "deleteAppointment": + logAndExecute("deleteAppointment", () -> { + try { + commandHandler.deleteAppointment(input, appointmentRecord); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + break; + + case "findAppointment": + if (inputArray.length > 1) { + logAndExecute("findAppointment", () -> commandHandler. + findAppointment(inputArray[1], appointmentRecord)); + } else { + System.out.println("Please provide search criteria for findAppointment."); + logger.log(Level.INFO, "Missing criteria for findAppointment"); + } + break; + + case "findVisit": + if (inputArray.length > 1) { + logAndExecute("findVisit", () -> commandHandler.findVisitByIc(inputArray[1], records)); + } else { + System.out.println("Please provide NRIC for findVisit."); + logger.log(Level.INFO, "Missing NRIC for findVisit"); + } + break; + + case "findMedication": + if (inputArray.length > 1) { + logAndExecute("findMedication", () -> commandHandler.findVisitByMedication(inputArray[1], records)); + } else { + System.out.println("Please provide medication for findMedication."); + logger.log(Level.INFO, "Missing medication for findMedication"); + } + break; + + case "findDiagnosis": + if (inputArray.length > 1) { + logAndExecute("findDiagnosis", () -> commandHandler.findVisitByDiagnosis(inputArray[1], records)); + } else { + System.out.println("Please provide diagnosis for findDiagnosis."); + logger.log(Level.INFO, "Missing diagnosis for findDiagnosis"); + } + break; + + case "exit": + logAndExecute("exit", () -> { + try { + commandHandler.removePastAppointments(appointmentRecord); + } catch (IOException e) { + throw new RuntimeException(e); + } + commandHandler.exit(input); + }); + break; + + default: + System.out.println("Unknown command. Type 'help' for a list of commands."); + logger.log(Level.INFO, "Unknown command received: {0}", command); + break; + } + } + + private static void logAndExecute(String commandName, Runnable action) { + logger.log(Level.INFO, "Processing {0} command", commandName); + try { + action.run(); + logger.log(Level.INFO, "Successfully processed {0} command", commandName); + } catch (IllegalArgumentException e) { + logger.log(Level.WARNING, "Invalid input for {0} command: {1}", new Object[]{commandName, e.getMessage()}); + System.out.println("Invalid input: " + e.getMessage()); + } catch (DateTimeParseException e) { + logger.log(Level.WARNING, "Error in {0} command: incorrect date format", commandName); + System.out.println("Error: incorrect date format."); + } catch (DateTimeException e) { + logger.log(Level.WARNING, "Error in {0} command: incorrect time format", commandName); + System.out.println("Error: incorrect time format."); + } catch (Exception e) { + logger.log(Level.SEVERE, "Unexpected error processing {0} command", e); + System.out.println("An unexpected error occurred: " + e.getMessage()); + } + } + + private static boolean validateParameters(String input, String... requiredMarkers) { + for (String marker : requiredMarkers) { + if (!input.contains(marker)) { + System.out.println("Please provide the required parameter: " + marker); + logger.log(Level.INFO, "Missing required parameter: {0}", marker); + return false; + } + } + return true; + } +}