Project: DonnaFin.io

DonnaFin.io is a desktop address book application used by financial advisors to keep track of their client information and related tasks. This is a Java program with about 10 kloc with a JavaFX GUI. The ‘.io’ in our name is a reflection of our belief that you deserve a faster workflow for input and output. If you can type fast, you can use our CLI-like commands to manage and view your notes, upcoming meetings and todo lists much faster than your typical customer relationship manager apps.

Given below are my contributions to the project.

  • Support passing instructions to Ui from Commands
    • Uses functional programming to hand a callback from the result of command execution (CommandResult.uiAction : Consumer<Ui>) that can perform the necessary side effect in Ui
    • Our application’s front end is getting steadily more complex and our commands need to be able to execute actual functions on Ui. However, other solutions would require global variables or drilling down a reference to Ui into Command. A simpler and cleaner workaround was to use functions as a first class object to instruct Ui on the appropriate actions (show help / exit / show client view, etc)
    • Created when it was necessary to implement the ClientView mode in UI (Showing a single client’s information in a dedicated view for the user to edit and interact with). #67


  • Allow user to edit information directly in the Client View
    • The user must be able to cycle through the different attributes (presented in a row format), and edit as necessary.
      • Heavily refactor ClientPanel to support actual interactions with the AttributePanels #90
      • Support user focus (highlight row when tabbing through) #92
      • Show user in an alert whenever edit fails, and for what field (e.g. put letters in the phone number field) #95
    • As this is a critical part of our functionality, we need this to be intuitive and easy to use.
    • Using EventHandlers to great effect within text fields to support highlighting outer parent elements.


  • Add SwitchTabCommand that allows for CLI navigation through the different tabs. #148
    • User must easily be able to cycle through contact information, policy table, asset table etc
    • Needs to be a simple and easy to use command in the command bar.


  • Create a generic class to create tables for Client View tabs on Polices, Assets, Liabilities to support future extension. #125, #154, #156, #195, #250, #268, #361, #190
    • Create a JavaFX component that can create a fully functional and rich table for any data class.
    • Made the entire front end for the yet-to-be-completed Policy, Asset and Liability classes as they all share a similar format of being represented in a table.
    • Makes good use of software engineering principles:
      • Open-Closed Principle: Open for configuring and extension but closed to modification. All instances of AttributeTable is configured by TableConfig and ColumnConfig and Aggregator to accept any manner of data classes.
      • Encapsulate and support creation of configuration data class in a manner similar to many open source modules (e.g. JavaScript modules like axios);
    • Add a bare bones automated GUI testing with TestFX to ensure the class can be loaded, with a proper Attribute stub that can be used to populate values


  • Re-organise application architecture by separating Storage and Logic #18, #17
    • Improves overall architecture by decoupling Storage and Logic ensuring all Storage calls go through Model layer to follow the layered architecture style. (See: O’ Reilly Chapter 1. Layered Architecture)
    • The layered architecture design pattern was chosen over the current Model-View-Controller architecture in a previous team meeting to reduce complexity, simplify working on components and improve testability.


  • Support Policy, Asset, and Liability with monetary values with a Money class. #182, #141
    • Create a class that keeps track of monetary values, support arithmetic and can be converted to a valid ‘$’ formatted string.
    • Update the attributes that require it to support these fields
    • Highlights
      • Integration Tests: Ensure that an attribute created with the invalid monetary formats should throw correctly: #193, #311


  • Add automated GUI tests for DonnaFin
    • Automated checks can be run on Gradle builds Github CI/CD to confirm validity of .fxml files and GUI logic.
    • Prevents unusable GUI changes from being added to the codebase.
    • Required spending a significant amount of time learning and understanding Java GUI testing with TestFx, adapting boilerplate and common functions from SE-EDU AB4. At all steps, this needed to support the new file structure and dependencies. #132, #134, #352, #353
    • Adapted from the SE-EDU: Address Book 4 codebase



  • Project management:
    • Manage CI / CD to consistently check and ensure repo code quality and automated testing success
      • Gradle improvements:
        • Have Gradle test commands run only if code / CI changes. #1
        • Enable assertions for every Gradle run #151
        • Have Gradle automatically wipe the ./data/ folder to ensure clean starts #135, #299
      • Conduct the minimal repo-wide checks for non-code changes (EOF, EOL, illegal characters) #37
      • Update Github CI / CD to support feature / branch workflow #35


  • Enhancements to existing features:

    • Improve UI for user.
      • Enable responsive resizing of AttributePanel when window size changes in ClientView #99
      • Show the user a focus indicator when the tabs are being selected in ClientView #101
      • Have the ‘button-like’ tab buttons trigger the ‘switch tab’ command (e.g. clicking ‘Policies’ tab should be same as typing tab p) #148
      • Fix weird and obscure JavaFX lab with use of asynchronous programming #166
    • Add additional tests
      • For notes #123, policies, assets, liabilities #196
      • For SampleDataUtils to ensure poisoned clean starts / data inputs will be caught early #177, #290
      • For commands: append #194, edit #199, #327, #344, #183
    • Additional changes that help developers
      • Make a Money data class (very similar to the existing Index class) #141
      • Add static configurations for AttributeTable to be easily called for Asset, Liability and Policy #146
      • Work on cohesion #321, #322
    • Squash numerous bugs (e.g #250, #293)


  • Documentation:
    • User Guide:
      • Update commands #27, #42
      • Info on the tabs and how to use it #341
    • Developer Guide:
      • Storage - Logic link updates: Sequence diagrams, Class Diagrams, #21
      • PersonAdapter, Person, Architecture Sequence Diagram, cleanup #103
      • Update UML class for v1.2b - v1.3 #165
      • New sequence diagrams for SwitchTabCommand #170
      • Minor changes #191, #192
      • Explain commons package and uses for such classes (wrt to good SE practices) #360,
      • Update matters of CI & Testing #351


  • Community:
    • Explaining why I think Java’s Stream implementation makes using multiple Scanners very bug-prone (#78)
    • Clarifying the difference between Platform.exit() and System.exit in JavaFX (#174)
    • Optimising CI tasks to run only on Linux where helpful (#200)
    • Reminding people of checkstyle gaps (#169)
    • Offering a tip for people who like to make many commits (#139)
    • Provided constructive feedback to PRs in my team repo:
      • Improving code quality #69, #57, #157
      • Minor changes for CheckStyle & CI #63
      • Constructive feedback on code quality #179
      • Pair programming & support for difficult tasks #155,


  • Tools:
    • Used Figma to wireframe the user pathway to ‘single client view’.
    • Automatically trim trailing spaces with a Github action #111