Overview
The Real App is an enhanced desktop address book designed primarily for real estate agents. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.
Summary of contributions
- 
Major Enhancement: Added the ability to archive/unarchive contacts - 
Related commands: archive,archivelist,archiveselect,archiveclear,unarchive
- 
What it does: - 
Allows the user to archive existing contacts which are deleted from the main working contact book, but kept as storage which can be displayed, or even unarchived when needed in the future. 
 
- 
- 
Justification: - 
This feature improves the product significantly because users who want to remove their contacts can remove them from their main contact book without permanently deleting them. 
- 
They can keep these contacts in a separate archive storage in case of future need, and these archived contacts can be restored back into the main contact book when needed. 
 
- 
- 
Highlights: - 
This enhancement affects almost all existing commands and new commands to be added in future. Each command has be to defined whether the main address book list or the archive list is displayed before and/or after the execution of the command. 
- 
It required an in-depth analysis of design alternatives. 
- 
The implementation too was challenging as it required modifications to existing commands, especially the undo/redo commands. 
 
- 
- 
Credits: - 
Existing implementation of the AddressBook storage in AddressBook-Level4 was used to create the ArchiveBook storage. 
 
- 
 
- 
- 
Minor Enhancements: - 
Added a Google Maps query in the browser panel that allows the user to view the location of a selected contact’s address on Google Maps. 
- 
Refined the selection of contacts across all features. 
 
- 
- 
Code contributed: [Project Code Dashboard] 
- 
Other contributions: - 
Project management: - 
Managed releases v1.1-v1.4(4 releases) on GitHub
- 
Tracked issues and milestones on GitHub 
 
- 
- 
Enhancements to existing features: 
- 
Documentation: 
- 
Community: 
 
- 
Contributions to the User Guide
| Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. The following only contains an abbreviated version of the  | 
Archiving a contact : archive
Moves the specified contact from the main contact book to the archive book.
Archived contacts can only be accessed through the archivelist command.
Format: archive INDEX
| Archived contacts cannot be pinned, deleted individually or displayed in a sorted list. | 
Examples:
- 
list
 archive 2
 Archives the 2nd contact in the contact book.
- 
search James
 archive 1
 Archives the 1st contact in the results of thesearchcommand.
- 
search seller
 archive 3
 Archives the 3rd contact in the results of thesearchcommand.
Screenshots for 1st example:
- 
Enter list:
 
- 
Main contact list is successfully displayed: 
 
- 
Enter archive 2:
 
- 
The 2nd contact, Bernard Chan, in the main contact list has been successfully archived: 
 
Listing all archived contacts : archivelist
Lists all the contacts in the archive book, in their archived chronological order.
Format: archivelist
Screenshots (following the 1st example of archive) :
- 
Enter archivelist:
 
- 
The archive list is successfully displayed (and the contact archived, Bernard Chan, can be found!): 
 
Selecting an archived contact : archiveselect
Selects the archived contact identified by the index number used in the displayed archive list.
Format: archiveselect INDEX
| Go to Displaying location on Google Maps™ for more details on the Google Maps™ display. | 
Examples:
- 
archivelist
 archiveselect 2
 Selects the 2nd contact in the archive book.
Selecting a contact : select
Selects the contact identified by the index number used in the displayed contact list.
Format: select INDEX
| Go to Displaying location on Google Maps™ for more details on the Google Maps™ display. | 
Examples:
- 
list
 select 2
 Selects the 2nd contact in the contact book.
- 
search James
 select 1
 Selects the 1st contact in the results of thesearchcommand.
- 
search seller
 select 3
 Selects the 3rd contact in the results of thesearchcommand.
Displaying location on Google Maps™
Double-clicking the contact will also select the contact and display the address location of the associated property on the Google Maps™ browser window panel.
| 
 | 
The screenshot below shows how selecting a contact using any of the select commands will work:
 
Contributions to the Developer Guide
| Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. The following only shows extracts of the User Stories and Use Cases related to the features I implemented. I also added Instructions for Manual Testing in Appendix F. Refer to the full Developer Guide for more details. | 
Archive features
Current Implementation
This section explains the implementation of all archive related features.
To implement the archive features, an archiveBook is created in the Model and Storage to facilitate the archiving of contacts. The archiveBook implements the AddressBook class in the Model since it works similarly, and has its own ArchiveBookStorage class in the Storage to facilitate the storage of a separate data file.
Archive/Unarchive
The following sequence diagram shows how the archive command operation works:
 
The unarchive command does the opposite — it calls addPerson(p) of the versionedAddressBook and removePerson(p) of the versionedArchiveBook instead.
Archive List
The archivelist command displays the list of persons in the archiveBook. This has to be carefully implemented to work hand-in-hand with the list of persons in the addressBook, as well as the list command.
More importantly, to have a separate archive list that can be swapped back and forth with the main list in the UI display requires careful designs and implementations in the Logic and Ui components.
Archive Select
The archiveselect command is implemented the same as 'select'.
When unarchive is performed on a person that has been selected by archiveselect, archiveselect is set to be null, so no person will be selected.
Archive Clear
The archiveclear command is implemented the same as clear where a new empty archiveBook is created by calling Model#setArchiveBook(new AddressBook()).
Select feature
Current Implementation
The select feature requires careful implementation:
- 
As there are 3 separate lists (main contact list, archive list, pin list) that can be selected from, having a unique command for each list (i.e. select,archiveselect,pinselect) ensures that the person is selected from the correct list.
- 
Only at most 1 person can be selected at any point in time from each list. - 
However, having 3 separate lists means that there will be overlapping selections which will cause errors in the Uicomponent in displaying the browser panel.
- 
To avoid overlapping of selections from each of the select commands, previous selections from another list are set to null. 
 
- 
- 
Adding and editing a person will select that person. 
- 
Deleting, archiving and unarchiving a selected contact will set the selection to null. 
- 
Changing lists will set the selected person in the list that is swapped away to be set to null. 
- 
Selection of a pinned person will remain regardless of which of the two lists are displayed. 
Appendix A: User Stories
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… | 
|---|---|---|---|
| 
 | clean user | archive contacts when I currently do not need them | keep contacts for later use | 
| 
 | efficient user | see the list of contacts which I have archived | check which contacts I have in my archive | 
| 
 | real estate agent | unarchive contacts | retrieve contacts which I need again | 
Appendix B: Use Cases
(For all use cases below, the System is the TheRealApp and the Actor is the User, unless specified otherwise)
Use case: Archive contact
MSS
- 
User requests to list contacts. 
- 
TheRealApp shows a list of contacts. 
- 
User requests to archive a specific contact in the list. 
- 
TheRealApp archives the contact. Use case ends. 
Extensions
- 
2a. The contact list is empty. Use case ends. 
- 
3a. The given index is invalid. - 
3a1. TheRealApp shows an error message. Use case resumes at step 3. 
 
- 
Use case: Display archived contact list
MSS
- 
User requests to list archived contacts. 
- 
TheRealApp shows a list of archived contacts. Use case ends. 
Extensions
- 
1a. The archived contact list is empty. Use case ends. 
Use case: Select archived contact
MSS
- 
User requests to select an archived contact. 
- 
TheRealApp selects the contact and shows the information of the archived contact. Use case ends. 
Extensions
- 
1a. The given index is invalid. - 
1a1. TheRealApp shows an error message. Use case resumes at step 1. 
 
- 
- 
1b. The list displayed is invalid. - 
1b1. TheRealApp shows an error message. 
- 
1b2. User requests for the valid list. 
- 
1b3. TheRealApp displays the requested list. Use case resumes at step 1. 
 
- 
Use case: Search for archived contact
MSS
- 
User requests to search for an archived contact by entering keyword(s). 
- 
TheRealApp shows a list of archived contacts with information containing the keywords(s). Use case ends. 
Extensions
- 
1a. The keyword(s) is invalid. - 
1a1. The RealApp shows an error message. Use case resumes from step 1. 
 
- 
- 
1b. The list displayed is invalid. - 
1b1. TheRealApp shows an error message. 
- 
1b2. User requests for the valid list. 
- 
1b3. TheRealApp displays the requested list. Use case resumes at step 1. 
 
- 
Use case: Unarchive contact
MSS
- 
User requests to list archived contacts. 
- 
TheRealApp shows a list of archived contacts. 
- 
User requests to unarchive a specific contact in the archived list. 
- 
TheRealApp unarchives the contact. Use case ends. 
Extensions
- 
2a. The archived contact list is empty. Use case ends. 
- 
3a. The given index is invalid. - 
3a1. TheRealApp shows an error message. Use case resumes at step 3. 
 
- 
Use case: Clear archived contact list
MSS
- 
User requests to clear the archived contact list. 
- 
TheRealApp clears the entire archived contact list. Use case ends. - 
1a. The list displayed is invalid. - 
1a1. TheRealApp shows an error message. 
- 
1a2. User requests for the valid list. 
- 
1a3. TheRealApp displays the requested list. Use case resumes at step 1. 
 
- 
 
-