Overview
My first substantial project, and the backend for the UMD Course Web project. It pulls every course at the university from the umd.io API and builds a directed graph out of them (nodes are courses, edges are relationships like prerequisites) as the foundation for visualizing the whole catalog.
The interesting problem isn’t fetching the data. It’s that prerequisites arrive as free-text strings (“CMSC216 with a C or better, and permission of the department”), and a graph needs them as typed structure instead.
How it works
- Requisite modeling: Parsed prerequisite strings are modeled behind
a
Requisiteabstraction with concrete types (CourseReq,CreditReq,DepartmentReq,OtherReq) and aReqTypeenum, so the graph never touches raw text. - Factory pattern throughout:
CourseFactory,CourseGraphFactory, andRequisiteFactoryown construction, keeping parsing and assembly out of the domain objects. - Layered packages:
courses/,courses/graph/,courses/relationship/requisites/,departments/, and autility/layer separate HTTP reading, object loading, and validation. - Tested: A JUnit suite across 5 test classes covers the factories, the graph, and the HTTP layer.
Result
69 commits and 23 Java files, with an architecture diagram and an honest known-issues list in the README. Looking back, the feature set is modest, but the instincts weren’t: layered structure, design patterns, and tests on a first project. It’s still the repo I’d hand someone who asks how I think about code structure.