1. PROJECT: SaveIt


2. Overview

This document is to summarize and elaborate all my contributions to the project. Our project, SaveIt, is a issue tracker application which is morphed from AddressBook4.

SaveIt dedicates to providing a platform for storing, managing and viewing their programming related issues during daily practice for the programmers. Its main features include adding new issue and solution, managing existing issues as well as finding existing issues. It is especially designed for the user who prefers command line interface (CLI) as all the commands require command line input. It also preserves the benefits of a Graphical User Interface (GUI) at the same time. If you can type fast, SaveIt can help you search the same issue that save previously faster than traditional GUI apps.

The project is implemented for applying and showing the learning outcomes of CS2103T, and it is done by a group of five CS2103T students including myself.

3. Summary of contributions

This section is to summarize and explain my contributions towards this project.

  • Major enhancement: add the solution filed to model structure along with enable adding solution or issue

    • What it does: It constitutes the basic model structure by adding new issue and new solution into SaveIt. This allows all the following features to be carried out in SaveIt.

    • Justification: This feature improves the product significantly as a user can now add more issues and solutions to the application. This is the most important and fundamental function our application aims to achieve.

    • Highlights: This enhancement involves not only model component but also GUI, storage components in the application and it requires a lot of effort to build it properly. The add command on the other hand needs to handle different requests in different directories.

  • Minor enhancement:

    • Implement basic autosuggestion feature for find and findByTag command. #107

    • Refactor autosuggestion component. #168

    • Add retrieve command to copy the solution link to system clipboard. #85

    • Refactor the application from AddressBook Level 4 to SaveIt. #4 #56 #68

  • Code contributed: [Functional code]

  • Other contributions:

    • Project management:

      • Manage milestones and check issue status on GitHub

    • Improve JUnit tests:

      • Rewrite existing failing tests and add new tests: #219, #233, #253

    • Enhancements to existing features:

      • Update the Auto-Suggestion window(Pull requests #168)

      • Update ArgumentMultimap to enable hashing the prefix with its relative position(Pull requests #165)

      • Write additional tests for existing features to increase coverage from 79% to 81% (Pull requests #219, #223)

    • Documentation:

      • Modify the undo/redo implementation diagrams to fit current edition of Developer Guide: (Pull requests #243)

    • Community:

4. 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.

4.1. Adding: (a)add

Adds an issue to the SaveIt App.

Format: add i/ISSUE_STATEMENT d/DESCRIPTION [t/TAG]…​

Adds a solution to an existing issue in SaveIt App.

Format: add s/SOLUTION_LINK r/REMARK

  • Select an issue before adding a solution

  • The link validation check only provides most basic format checking

Examples:

  • add i/ArrayIndexOutOfBound d/issue description t/unsolved
    Adds a new issue which has a issue statment called ArrayIndexOutOfBounds and issue description called issue description

AddingNewIssue
Figure 1. Add new issue to the issue list
  • select 3

  • add s/www.stackoverflow.com r/use functional programming
    Adds a new solution which has a solution link called www.stackoverflow.com and a solution remark called use functional programming

AddingNewSolution
Figure 2. Add new solution to the third issue in the issue list
  • The order of the issues may be updated if the user uses sort command.

  • If multiple identical prefixes are entered, the last prefix value will be accepted

  • An issue can have only one statement and description

  • An issue can have any number of tags (including 0)

  • The index refers to the index number shown in the displayed issue list.

  • The index must be a positive integer and 1, 2, 3, …​

  • The index cannot be bigger than the number of issues.

  • User needs to select the issue index to add a solution to that issue

  • A solution contains one solution link and one remark

  • User can add solutions to the same issue continuously

Retrieves the solution link so that the link is copied to the system clipboard

Format: retrieve INDEX

  • Select an issue before retrieving solution link

Examples:

  • retrieve 1

  • The index refers to the index number on the solution list of a certain issue.

  • The index must be a positive integer 1, 2, 3, …​

  • The index cannot be bigger than the number of solutions of a certain issue.

4.3. Autosuggesting existing issue in find command

To prevent the issue list is so large such that user can hardly remember all the issues, whenever user types in any keyword in find command, SaveIt will auto suggest any related issue name according to the keyword entered.

Example:

FindIssueAutoSuggestion
Figure 3. Autosuggesting of exsiting issues statements

5. 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.

5.1. Add feature

The add command can add both issue and solution to SaveIt. It includes two levels:

  • Root level

    • Issue statement

    • Issue description

    • Issue tags

  • Issue level

    • Solution link

    • Solution remark

5.1.1. Add issue

Adding a new issue can only happen at the root level

Current implementation

The SaveItParser is used to call AddCommandParser so as to pass the entered issue. In order to build a new Issue object, a dummy solution link and dummy solution remark will be used. After that, AddCommand is invoked which will ask model to add the issue to the Model component. In order to store the new issue inside the SaveIt, VersionedSaveIt will be invoked and it will add issue to the UniqueIssueList.

The following sequence diagram illustrates how the add new issue feature functions:

AddNewIssue
Figure 4. Add Issue Command Sequence Diagram

This diagram gives a clear procedure that how the user input is passed step by step by calling different methods and objects in different sequences.

5.1.2. Add solution to existing issue

Adding a new solution can only happen at the issue level

Current implementation

The SaveItParser is used to call AddCommandParser just like how adding issue feature functions as above mentioned. However, this time, the new solution link and solution remark is provided to AddCommand instead. In order to build a new Issue object, dummy issue statement and dummy issue description will be used. During execution, addSolution method, which was newly added, in Model component will be invoked to add the solution. The detailed implementation of addSolution in model component is quite simple. Since the list stored in application is immutable, each time, a new issue will be created with original statement and description, then the new solution will be added to that particular issue. Finally, updateIssue method will be called to replace the issue in versionedSaveIt.

The following sequence diagram illustrates how the add solution feature functions

AddNewSolution
Figure 5. Add Solution Command Sequence Diagram

This diagram shows the sequence that how add solution command is executed. It could be also noticed that it is basically similar to that of add new issue feature besides it invokes updateIssue method in Model component rather than addIssue method.

5.1.3. Design Considerations

Aspect: How add solutions executes
  • Alternative 1 (current choice): Combine AddIssue and AddSolution together and distinguish them at the stage of AddCommandParser

    • Pros: Consistent syntax between the two features, so the command is more user-friendly.

    • Cons: Need to put more effort on distinguishing the difference between these two requests, AddCommandParser is relatively complex compared to the other parser component.

  • Alternative 2: Build a new command especially for adding solution

    • Pros: Easy to implement.

    • Cons: The command set becomes too complex for the user.

Aspect: How add command distinguishes between adding solution and adding issue
  • Alternative 1 (current choice): Pass a newly created issue with dummy issue statement or dummy solution link

    • Pros: Consistent coding style and less change on logic structure

    • Cons: Quite complex implementation compared to other command

  • Alternative 2: Overload Issue constructor so that different issues will be passed to AddCommand accordingly.

    • Pros: Relatively easier to implement

    • Cons: Lots of changes on structure.

5.2. Retrieve Feature

The retrieve feature allows user to choose a solution link and copy it to the system clipboard.

5.2.1. Current Implementation

The retrieve feature basically takes the user entered index and call getFilteredAndSortedList method in Model to get the selected solution. Then Java Toolkit package is used to copy the url link of solution to the system clipboard.

5.3. Suggestion Feature

The suggestion feature allows user to quickly complete commands by showing a drop-down window of suggested values when the user input matches a specific keyword or identifier.

5.3.1. Current Implementation

The figure below shows a basic relationship between each class. The SuggestionLogicManager implements SuggestionLogic interface and overrides the evaluate method. Similarly, IssueNameSuggestion, TagNameSuggestion and CopyExistingSuggestion implement Suggestion interface and override evaluate method.

SuggestionClassUML
Figure 6. SuggestionLogic Class Diagram