| layout | page |
|---|---|
| title | Developer Guide |
- 1. Setting up, getting started
- 2. Design
- 3. Implementation
- Documentation, logging, testing and dev-ops
- Appendix-requirements
- Appendix-instructions-for-manual-testing
Refer to the guide Setting up and getting started.
The Architecture Diagram given above explains the high-level design of the App. Given below is a quick overview of each component.
💡 Tip: The .puml files used to create diagrams in this document can be found in the diagrams folder.
Refer to the PlantUML Tutorial at se-edu/guides to learn how to create and edit diagrams.
Main has two classes called Main
and MainApp. It is responsible for,
- At app launch: Initializes the components in the correct sequence, and connects them up with each other.
- At shut down: Shuts down the components and invokes cleanup methods where necessary.
Commons represents a collection of classes used by multiple other components.
The rest of the App consists of four components.
UI: The UI of the App.Logic: The command executor.Model: Holds the data of the App in memory.Storage: Reads data from, and writes data to, the hard disk.
Each of the four components,
- defines its API in an
interfacewith the same name as the Component. - exposes its functionality using a concrete
{Component Name}Managerclass (which implements the corresponding APIinterfacementioned in the previous point.
For example, the Logic component (see the class diagram given below) defines its API in the Logic.java interface and exposes its functionality using the LogicManager.java class which implements the Logic interface.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete 1.
The sections below give more details of each component.
API :
Ui.java
The UI consists of a MainWindow that is made up of parts e.g.CommandBox, ResultDisplay, PersonListPanel, StatusBarFooter etc. All these, including the MainWindow, inherit from the abstract UiPart class.
The UI component uses JavaFx UI framework. The layout of these UI parts are defined in matching .fxml files that are in the src/main/resources/view folder. For example, the layout of the MainWindow is specified in MainWindow.fxml
The UI component,
- Executes user commands using the
Logiccomponent. - Listens for changes to
Modeldata so that the UI can be updated with the modified data.
API :
Logic.java
Logicuses theRemindMeParserclass to parse the user command.- This results in a
Commandobject which is executed by theLogicManager. - The command execution can affect the
Model(e.g. adding a person). - The result of the command execution is encapsulated as a
CommandResultobject which is passed back to theUi. - In addition, the
CommandResultobject can also instruct theUito perform certain actions, such as displaying help to the user.
Given below is the Sequence Diagram for interactions within the Logic component for the execute("delete m/CS2103 a/1") API call.
API : Model.java
The Model,
- stores a
UserPrefobject that represents the user’s preferences. - stores the RemindMe data.
- exposes an unmodifiable
ObservableList<Person>ObservableList<Module>orObservableList<GeneralEvent>that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. - does not depend on any of the other three components.

API : Storage.java
The Storage component,
- can save
UserPrefobjects in json format and read it back. - can save the RemindMe data in json format and read it back.
- CalendarStorage is accessed by UI component which is no indicated in the diagram.
This section describes some noteworthy details on how certain features are implemented.
The proposed add implementation is facilitated by ModelManager, which extends Model. ModelManager contains FilteredList of each entities:
- Persons
- Modules
- General Events
Given below is an example usage scenario and how the find mechanism behaves at each step. Input: add m/CS2103T
Step 1: Your input is parsed into RemindMeParser using the parseCommand method.
Step 2: Based on the command word of your input (i.e., add), an AddCommandParser will be used.
Step 3: In AddCommandParser#parseCommand, your input will be tokenized using ArgumentTokenizer. ArgumentTokenizer uses your input, then searches for the prefixes and returns the ArgumentMultimap.
Step 4: Using the ArgumentMultimap checks the prefixes in your input and returns the respective AddCommandParser.
Module: `m/`: `AddModuleCommandPaser`
Person: `n/`: `AddPersonCommandParser`
General Event: `g/`: `AddGeneralEventParser`
if it is an unknown prefix, `parseCommand` will throw a ParseException and returns a `AddMessageUsage`. Since the input is `m/`, `AddModuleCommandPaser` will be returned.
Step 5: In AddModuleCommandPaser, AddModuleCommandPaser#parse is called. Again ArgumentMultimap is created using ArgumentTokenizer but only with Module prefix: m/. The class diagram shows the Parser class diagram when passing your input into the appropriate AddModuleCommand.
Step 6: The parse method does a few checks:
- If there isn't the
PREFIX:m/present, or the preamble of thePREFIXis not empty, or your search input after thePREFIXis whitespaces, thenparsemethod will throwParseExceptionand returns aAddMessageUsageforModule. - Else your inputs is used to create a
titlewhich is then used to create amodule.
Step 7: AddModuleCommand is executed:
- Using the
moduleas an input, theModel#hasModulemethod checks if the givenmoduleis a duplicate or not. If it is, it will throwCommandExceptionand return aMESSAGE_DUPLICATE_MODULE. - Else, using the
moduleas an input, theModel#addModulemethod is called, and adds themoduleto theUniqueModuleListinRemindMe.
Step 8: The CommandResult is logged in the logger and using resultDisplay#setFeedacktoUser, returning resultDisplay. Using resultDisplay#setText shows the CommandResult in the GUI.
The following sequence diagram shows how the find operation works:
The proposed find implementation is facilitated by ModelManager, which extends Model. ModelManager contains FilteredList of each entities:
- Persons
- Modules
- General Events
Given below is an example usage scenario and how the find mechanism behaves at each step. Input: find m/CS2101
Step 1: Your input is parsed into RemindMeParser using the parseCommand method.
Step 2: Based on the command word of your input (i.e., find), a FindCommandParser will be used.
Step 3: In FindCommandParser#parseCommand, your input will be tokenized using ArgumentTokenizer. ArgumentTokenizer uses your input, then searches for the prefixes and returns the ArgumentMultimap.
Step 4: Using the ArgumentMultimap checks the prefixes in your input and returns the respective FindCommandParser.
Module: `m/`: `FindModuleCommandPaser`
Person: `n/`: `FindPersonCommandParser`
General Event: `g/`: `FindGeneralEventParser`
if it is an unknown prefix, `parseCommand` will throw a ParseException and returns a `FindMessageUsage`. Since the input is `m/`, `FindModuleCommandPaser` will be returned.
Step 5: In FindModuleCommandPaser, FindModuleCommandPaser#parse is called. Again ArgumentMultimap is created using ArgumentTokenizer but only with Module prefix: m/. The class diagram shows the Parser class diagram when passing your input into the appropriate FindModuleCommand.
Step 6: The parse method does a few checks:
- If there isn't the
PREFIX:m/present, or the preamble of thePREFIXis not empty, or your search input after thePREFIXis whitespaces, thenparsemethod will throwParseExceptionand returns aFindMessageUsageforModule. - Else your inputs is split into individual keywords, and contained as a
List of keywords.
Step 7: The keywords will be stored in TitleContainsKeywordsPredicate as a predicate, then stored in FindModuleCommand.
Step 8: FindModuleCommand is executed:
- Using the
predicate, theModel#updateFilteredModuleListis called withpredicateas input. - Using the
FilteredList<Module>#setPredicatereturns the filtered list of modules with titles matching to any of thekeywordsas aCommandResult.
Step 9: The CommandResult is logged in the logger and using resultDisplay#setFeedacktoUser, returning resultDisplay. Using resultDisplay#setText shows the CommandResult in the GUI.
The following sequence diagram shows how the find operation works:

RemindMe is able to delete an existing Assignment in an existing Module
The diagram below shows the relationships between DeleteAssignmentCommand and DeleteAssignmentCommandParser under
the Logic component and the relationship between Module and Assignment under the Model component.
The following example usage scenario describes how the delete mechanism behaves at each step.
Assuming RemindMe has a Module named CS2103. This Module contains a AssignmentList that stores
a list of Assignmnets:
[D] Assigment1 due on 01/01/2021 2359
[X] Assignment2 due on 05/05/2022 2359
[D] Assignment3 due on 25/03/1021 2359
Step 1: The user launches the RemindMe application, LogicManager and RemindMeParser will be initialized.
Step 2: The user executes delete m/CS2103 a/3 to delete the assignment at Index 3 from the AssignmentList of
the Module CS2103. This invokes the method LogicManager#execute(String) which then invokes the
RemindMeParser#parseCommand(String) method.
Step 3: RemindMeParser will parse the command word delete and will create a DeleteCommandParser. The
DeleteCommandParser will tokenize the prefixes and will choose to create a deleteAssignmentCommandParser to parse
the Title CS2103 and Index 3.
Step 4: The DeleteAssignmentCommandParser will create a new DeleteAssignmentCommand with the Title CS203 and
Index 3 and return it back to the LogicManager.
Step 5: The DeleteAssignmentCommand verifies whether the target Module exist in the FilteredModuleList
and whether an assignment exists at Index 3. If either fails, DeleteAssignmentCommand will throw a CommandException.
If not, it will invoke the method Module#deleteAssignment(Index) which removes the assignment at Index 3 from the
AssignmentList
Step 6: A CommandResult will be created with a successful message if the user inputs are valid
and returned to LogicManager.
Step 7: Lastly, LogicManager saves the updated RemindMe.
The above process is shown in the following sequence diagram:

The following activity diagram summarises the general workflow for the Delete Command:

RemindMe is capable of editing an existing assignment.
Below is a class diagram to show the relationship between EditAssignmentCommand and EditAssignmentCommandParser under
the Logic component and the relationship between Module and Assignment under the Model component.
Given below is an example usage scenario and how the edit mechanism behaves at each step.
Assuming RemindMe already has a Module named CS2103 and an Assignment Tut1 with time 01/01/2021 2359 stored.
Step 1: The user launches the RemindMe application, LogicManager and RemindMeParser will be initialized.
Step 2: The user executes edit m/CS2103 a/1 d/Tut2 to edit the description of the first assignment
in the CS2103 module. This invokes the method LogicManager#execute(String) which then invokes the
RemindedParser#parseCommand(String) method.
Step 3: RemindMeParser will then create EditCommandParser
which detects the edit conditions and calls EditAssignmentCommandParser
to parse inputs according to the format specified.
Step 4: The EditAssignmentCommandParser will create a new EditAssignmentCommand
with the given module CS2103 , the given index 1, the description Tut2 and a null
date and return it back to LogicManager.
Step 5: LogicManager calls the EditAssignmentCommand#execute(Model) method
which then verifies whether the target module and assignment exists and whether
the edited content is valid, eg. same content.
step 6: The Model calls RemindMe#editAssignment(Module, index, Description) method which retrieves
the module to edit from the UniqueModuleList ,retrieves and update the assignment and place the
module back to the list.
Step 7: A CommandResult will be created with a successful message if the user inputs are valid
and returned to LogicManager.
Step 8: Lastly, LogicManager saves the updated RemindMe.
Note: An EditAssignmentCommand can either change the description or date of an assignment, not both.
The above process is shown in the following sequence diagram:
The following activity diagram summarises the general workflow for the Edit Command:
Given below is an example of how the calendar UI is created.
Step1: CalendarWindow will be created at the start of the program.
Step2: CalendarWindow will then call itself CalendarWindow#loadCalendar to load the details into the calendar.
Step3: In the loadCalendar method, to ensure that the details inside calendar are the latest,
the method will then call CalendarStorage#refreshStorage to update the storage for the calendar.
Step4: In the refreshStorage method, calendar storage will be cleared first by calling CalendarStorage#clear
and then the details about events are retrieved from RemindMe model by calling RemindMe#getFilteredPersonList
, RemindMe#getFilteredModuleList and RemindMe#getFilteredEventList.
Step5: With calendar storage updated, the calendar will then store events to each respective day and then the calendar
will be ready to be displayed as a GUI.
Given below is an example usage scenario and how the calendar mechanism behaves at each step. Input: calendar.
Step 1. Your input is parsed into RemindMeParser using the parseCommand method.
Step 2: Based on the command word of your input (i.e., calendar), a CalendarCommand will be created.
Step 3: CalendarCommand is executed, and that will set boolean showCalendar to be true, the boolean is then
pushed to MainWindow to call MainWindow#handleCalendar to show the CalendarWindow.
Step 4: CalendarWindow loaded by its fxml file and called CalendarWindow#show to show its shown
as a pop-up window for you.
Target user profile:
- has a need to manage exams, assignments and events deadlines
- prefer desktop apps over other types
- tend to forget upcoming events/exams
- is reasonably comfortable using CLI and GUI apps
Value proposition: Manage deadlines and events in list and calendar view format to remind forgetful users.
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * |
new user | see instructions help page | refer to help page when I forget how to use the App |
* * * |
user | exit the App | |
* * * |
student taking a module | add module | keep track of the module exams, assignments |
* * * |
student having assignments | add assignments to module | keep track of the assignment deadline |
* * * |
student having exams | add exams to module | keep track of the exam start time |
* * * |
user with friends | add person and their birthday | keep track of birthday and wish them happy birthday promptly |
* * * |
user | add general events | keep track of events happening outside school curriculum |
* * * |
student | edit a module | adjust module name if module name changes |
* * * |
student | edit a assignment | can adjust schedule when there is a change of plan |
* * * |
student | edit a exam | can adjust schedule when there is a change of plan |
* * * |
user | edit a person and birthday | fine tune person name and birthday according |
* * * |
user | edit a general event | adjust schedule when there is a change of plan |
* * * |
student | delete a module | |
* * * |
student | delete a assignment | |
* * * |
student | delete a exam | |
* * * |
user | delete a person and birthday | |
* * * |
user | delete a general event | |
* * |
student | find a module | quickly locate details for module |
* * |
user | find a person | quickly locate details for person |
* * |
user | find a general event | quickly locate details for event |
* * |
user | see all entries after finding command | |
* * |
student | mark my assignments as done | identify if assignments are done or not |
* * |
user | clear App | quickly delete all details in App |
* * |
student | clear modules | quickly delete all details for modules |
* * |
user | clear contacts | quickly delete all details for person |
* * |
user | clear general events | quickly delete all details for events |
* * |
user | view events in a calendar view | to have a better sense of the upcoming events |
* * |
forgetful student | be reminded about upcoming events | respond to upcoming events accordingly |
{More to be added}
(For all use cases below, the System is the RemindMe and the Actor is the user, unless specified otherwise)
MSS:
- User enters the command to view help.
- System shows help and url to copy to user guide webpage for more in depth help.
Use case ends.
Extensions:
- 1a. System detects an error in formatting of command.
- 1a1. System display error message.
Use case ends.
- 1a1. System display error message.
MSS:
- User enters the command to exit system.
- System exits by closing all relevant GUI.
Use case ends.
Extensions:
- 1a. System detects an error in formatting of command.
- 1a1. System display error message.
Use case ends.
- 1a1. System display error message.
MSS:
- User enters command to add a module.
- System adds module and displays module info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
- 1b. System detects that module is present in system.
- 1b1. System display duplicate module error message.
Use case ends.
- 1b1. System display duplicate module error message.
MSS:
- User enters command to add an assignment for a module.
- System adds assignment and displays assignments info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
- 1b. System detects that module for assignment is not present in the system.
- 1b1. System display module missing error message.
Use case ends.
- 1b1. System display module missing error message.
- 1c. System detects that assignment is present in the module.
- 1c1. System display duplicate assignment error message.
Use case ends.
- 1c1. System display duplicate assignment error message.
MSS:
- User enters command to add an exam for a module.
- System adds exam and displays exam info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
- 1b. System detects that module for exam is not present in the system.
- 1b1. System display module missing error message.
Use case ends.
- 1b1. System display module missing error message.
- 1c. System detects that exam is present in the module.
- 1c1. System display duplicate exam error message.
Use case ends.
- 1c1. System display duplicate exam error message.
MSS:
- User enters command to add a person and his/her birthday.
- System adds person with his/her birthday and displays person info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
- 1b. System detects that person is present in system.
- 1b1. System display duplicate person error message.
Use case ends.
- 1b1. System display duplicate person error message.
MSS:
- User enters command to add a general event.
- System adds general event and displays general event info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
- 1b. System detects that general event is present in system.
- 1b1. System display duplicate event error message.
Use case ends.
- 1b1. System display duplicate event error message.
MSS:
- User enters command to edit a module.
- System edits module and displays edited module info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to edit an assignment for a module.
- System edits assignment and displays edited assignment info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to edit an exam for a module.
- System edits exam and displays edited exam info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to edit the birthday of a person.
- System edits birthday and displays edited birthday info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to edit a general event.
- System edits general event and displays edited event info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to delete a module.
- System deletes module and displays deleted module info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to delete an assignment for a module.
- System deletes assignment and displays deleted assignment info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to delete an exam for a module.
- System deletes exam and displays deleted exam info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to delete a person.
- System deletes person and displays deleted person info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to delete a general event.
- System deletes general event and displays deleted event info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to find a module with keyword.
- System display modules found by the keyword.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to find a person with keyword.
- System display person found by the keyword.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
MSS:
- User enters command to find a general event with keyword.
- System display general event found by the keyword.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters list command.
- System display full list for module, person and events.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to mark an existing assignment as done.
- System marks assignment as done and displays assignment info.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to clear App.
- System clears the App.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to clear modules.
- System clear modules and displays empty module list.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to clear contacts (person).
- System clear contacts and displays empty person list.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters command to clear general events.
- System clear general events and displays empty event list.
Use case ends.
Extensions:
- 1a. System detects formatting error in command.
- 1a1. System display formatting error message.
Use case ends.
- 1a1. System display formatting error message.
MSS:
- User enters the command to view calendar.
- System shows calendar.
Use case ends.
Extensions:
- 1a. System detects an error in formatting of command.
- 1a1. System display error message.
Use case ends.
- 1a1. System display error message.
MSS:
- User starts the system.
- System shows upcoming events as a reminder.
Use case ends.
{More to be added}
- Should work on any mainstream OS as long as it has Java
11or above installed. - Should be able to hold up to 1000 persons and tasks without a noticeable sluggishness in performance for typical usage.
- A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
- RemindMe should be able to respond within one seconds.
- RemindMe should be usable by novice who has no prior experience with coding.
{More to be added}
- Mainstream OS: Windows, Linux, Unix, OS-X
- Module: A school module consisting of module name/module id.
- Examination: Consists of a start time and date which it occurs on under a relevant module.
- Event: Consists of a start time and date which it occurs on.
- Assignment: Consists of a deadline under a relevant module.
- GUI: Graphic User Interface, the visible interface the user sees for the application.
Given below are instructions to test the app manually.
-
Initial launch
-
Download the jar file and copy into an empty folder
-
Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
-
-
Saving window preferences
-
Resize the window to an optimum size. Move the window to a different location. Close the window.
-
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-
-
{ more test cases … }
-
Dealing with missing/corrupted data files
- {explain how to simulate a missing/corrupted file, and the expected behavior}
-
{ more test cases … }













