add documentation

This commit is contained in:
2025-09-19 20:23:02 -04:00
parent e37852c3e7
commit f74c6970e7
3 changed files with 437 additions and 483 deletions

View File

@@ -1,113 +1,105 @@
digraph LodgeReservationSystem {
// Graph settings
// Graph attributes
rankdir=TB;
node [shape=record, fontname="Arial", fontsize=10];
edge [arrowhead="empty", fontname="Arial", fontsize=9];
edge [fontname="Arial", fontsize=9];
// Package clusters
// Package clustering
subgraph cluster_data {
label="lodge.data";
style=dashed;
color=blue;
style=filled;
color=lightgrey;
// Account class
Account [label="{Account|+ Account()\l+ Account(String, String, Address, EmailAddress)\l+ Account(String, Address, EmailAddress)\l|+ toString(): String\l+ add(Reservation): boolean\l+ Write(Account): void\l+ getAccount_number(): String\l+ setAccount_number(String): void\l+ getPhone_number(): String\l+ setPhone_number(String): void\l+ getMailing_address(): Address\l+ setMailing_address(Address): void\l+ getEmail_address(): EmailAddress\l+ setEmail_address(EmailAddress): void\l+ findReservation(String): Reservation\l+ update(Account): void\l+ getAllReservations(): ListIterator\<IReservation\>\l+ hashCode(): int\l+ equals(Object): boolean\l}"];
// Data classes
Account [label="{Account|+ account_number: String\l+ phone_number: String\l+ mailing_address: Address\l+ email_address: EmailAddress\l- reservations: AccountReservationList\l|+ Account()\l+ Account(String, String, Address, EmailAddress)\l+ Account(String, Address, EmailAddress)\l+ add(Reservation): boolean\l+ findReservation(String): Reservation\l+ getAllReservations(): ListIterator\<IReservation\>\l+ update(Account): void\l+ toString(): String\l+ static Write(Account): void\l}"];
// AccountList class
AccountList [label="{AccountList|+ AccountList()\l|+ accountSerial(String, Address, EmailAddress): String\l+ add(Account): boolean\l+ save(Account): void\l+ find(String): Account\l+ getListOfReservations(): List\<? extends IReservation\>\l+ showReservationList(): void\l}"];
AccountList [label="{AccountList|extends ArrayList\<Account\>|+ static accountSerial(...): String\l+ add(Account): boolean\l+ save(Account): void\l+ find(String): Account\l+ getListOfReservations(): List\<? extends IReservation\>\l+ showReservationList(): void\l}"];
// AccountReservationList class
AccountReservationList [label="{AccountReservationList|+ AccountReservationList()\l|- reservationSerial(Reservation): String\l|+ add(IReservation): boolean\l+ toString(): String\l+ find(String): Reservation\l+ update(AccountReservationList): void\l}"];
Address [label="{Address|+ street: String\l+ city: String\l+ state: String\l+ zip: String\l|+ Address(String, String, String, String)\l+ getters/setters\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"];
// Address class
Address [label="{Address|- Address()\l+ Address(String, String, String, String)\l|+ getStreet(): String\l+ setStreet(String): void\l+ getCity(): String\l+ setCity(String): void\l+ getState(): String\l+ setState(String): void\l+ getZip(): String\l+ setZip(String): void\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"];
// EmailAddress class
EmailAddress [label="{EmailAddress|+ EmailAddress(String)\l|+ getEmail_address(): String\l+ setEmail_address(String): void\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"];
// Exception classes
DuplicateObjectException [label="{DuplicateObjectException|+ DuplicateObjectException()\l+ DuplicateObjectException(String)\l}"];
IllegalOperationException [label="{IllegalOperationException|+ IllegalOperationException()\l+ IllegalOperationException(String)\l}"];
EmailAddress [label="{EmailAddress|+ email_address: String\l|+ EmailAddress(String)\l+ getEmail_address(): String\l+ setEmail_address(String): void\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l}"];
// Enums
KitchenTypeEnum [label="{«enumeration»\lKitchenTypeEnum|None\lKitchenette\lFullKitchen\l}"];
ReservationStatusEnum [label="{«enumeration»\lReservationStatusEnum|Draft\lCanceled\lCompleted\l}"];
KitchenTypeEnum [label="{KitchenTypeEnum|\<\<enumeration\>\>|None\lKitchenette\lFullKitchen\l}"];
ReservationStatusEnum [label="{ReservationStatusEnum|\<\<enumeration\>\>|Draft\lCanceled\lCompleted\l}"];
// Exceptions
DuplicateObjectException [label="{DuplicateObjectException|extends RuntimeException|+ DuplicateObjectException()\l+ DuplicateObjectException(String)\l}"];
IllegalOperationException [label="{IllegalOperationException|extends RuntimeException|+ IllegalOperationException()\l+ IllegalOperationException(String)\l}"];
subgraph cluster_reservation {
label="lodge.reservation";
style=filled;
color=lightblue;
// Interface
IReservation [label="{IReservation|\<\<interface\>\>|+ ReservationType(): String\l+ static copy(String): Reservation\l+ getReservation_number(): String\l+ getAccountNumber(): String\l+ getPhysical_address(): Address\l+ getPricePerNight(): float\l+ calculatePrice(): float\l+ checkValid(): boolean\l}"];
// Abstract class
Reservation [label="{Reservation|\<\<abstract\>\>|# type: char\l# reservation_number: String\l# physical_address: Address\l# mailing_address: Address\l# reservation_start_date: ZonedDateTime\l# reservation_end_date: ZonedDateTime\l# reservation_status: ReservationStatusEnum\l# kitchen: KitchenTypeEnum\l# numberOfBeds: Integer\l# numberOfBedRooms: Integer\l# numberOfBathRooms: Integer\l# numberOfFloors: Integer\l# squareFeet: Integer\l# price: Float\l# accountNumber: String\l|# Reservation()\l+ getters/setters\l+ Write(Reservation): void\l+ Change(Reservation, ReservationStatusEnum): void\l+ update(Reservation): void\l+ abstract ReservationType(): String\l}"];
// Reservation List
AccountReservationList [label="{AccountReservationList|extends ArrayList\<IReservation\>|- static reservationSerial(Reservation): String\l+ add(IReservation): boolean\l+ find(String): Reservation\l+ update(AccountReservationList): void\l+ toString(): String\l}"];
}
}
subgraph cluster_reservation {
label="lodge.reservation";
style=dashed;
color=green;
// IReservation interface
IReservation [label="{«interface»\lIReservation|+ ReservationType(): String\l+ copy(String): Reservation\l+ getReservation_number(): String\l+ getAccountNumber(): String\l+ getPhysical_address(): Address\l+ getPricePerNight(): float\l+ calculatePrice(): float\l+ checkValid(): boolean\l}"];
// Reservation abstract class
Reservation [label="{«abstract»\lReservation|# Reservation()\l|+ setReservation_number(String): void\l+ getReservation_number(): String\l+ getAccountNumber(): String\l+ setAccountNumber(String): void\l+ setPhysical_address(Address): void\l+ mailing_address(): Address\l+ setMailing_address(Address): void\l+ setReservation_start_date(ZonedDateTime): void\l+ setReservation_end_date(ZonedDateTime): void\l+ setReservation_status(ReservationStatusEnum): void\l+ getKitchen(): KitchenTypeEnum\l+ setKitchen(KitchenTypeEnum): void\l+ setNumberOfBeds(Integer): void\l+ numberOfBedRooms(): Integer\l+ setNumberOfBedRooms(Integer): void\l+ setNumberOfBathRooms(Integer): void\l+ setNumberOfFloors(Integer): void\l+ setSquareFeet(Integer): void\l+ setPrice(Float): void\l+ getType(): char\l+ setType(char): void\l+ getPhysical_address(): Address\l+ getMailing_address(): Address\l+ getReservation_start_date(): ZonedDateTime\l+ getReservation_end_date(): ZonedDateTime\l+ getReservation_status(): ReservationStatusEnum\l+ getNumberOfBeds(): Integer\l+ getNumberOfBedRooms(): Integer\l+ getNumberOfBathRooms(): Integer\l+ getNumberOfFloors(): Integer\l+ getSquareFeet(): Integer\l+ getPrice(): Float\l+ hashCode(): int\l+ equals(Object): boolean\l+ toString(): String\l+ Write(Reservation): void\l+ Change(Reservation, ReservationStatusEnum): void\l+ update(Reservation): void\l+ ReservationType(): String\l}"];
}
subgraph cluster_reservationsystem {
label="lodge.reservationsystem";
style=dashed;
color=red;
style=filled;
color=lightyellow;
// Concrete reservation classes
CabinReservation [label="{CabinReservation|+ CabinReservation()\l+ CabinReservation(Address)\l|+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
CabinReservation [label="{CabinReservation|+ CabinReservation()\l+ CabinReservation(Address)\l+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
HotelReservation [label="{HotelReservation|+ HotelReservation()\l+ HotelReservation(Address)\l|+ copy(String): Reservation\l+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
HotelReservation [label="{HotelReservation|+ HotelReservation()\l+ HotelReservation(Address)\l+ static copy(String): Reservation\l+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
HouseReservation [label="{HouseReservation|+ HouseReservation()\l+ HouseReservation(Address)\l|+ copy(String): Reservation\l+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
HouseReservation [label="{HouseReservation|+ HouseReservation()\l+ HouseReservation(Address)\l+ static copy(String): Reservation\l+ ReservationType(): String\l+ checkValid(): boolean\l+ getPricePerNight(): float\l+ calculatePrice(): float\l}"];
// AccommodationManager class
AccomodationManager [label="{AccomodationManager|- AccomodationManager()\l+ AccomodationManager(String)\l|+ setDataStoreRoot(String): void\l+ loadAll(): void\l+ load(Path): void\l+ retrieveLoadedAccounts(): List\<Account\>\l+ retrieveAccount(String): Account\l+ AddAccount(Account): void\l+ UpdateAccount(Account): void\l+ newAccount(String, Address, EmailAddress): Account\l+ addReservation(Account, Reservation): boolean\l+ findReservation(String): Reservation\l+ getReservationList(): List\<? extends IReservation\>\l+ showReservationList(): void\l}"];
AccomodationManager [label="{AccomodationManager|- accounts: AccountList\l|+ AccomodationManager(String)\l+ setDataStoreRoot(String): void\l+ loadAll(): void\l+ load(Path): void\l+ retrieveLoadedAccounts(): List\<Account\>\l+ retrieveAccount(String): Account\l+ AddAccount(Account): void\l+ UpdateAccount(Account): void\l+ newAccount(...): Account\l+ addReservation(Account, Reservation): boolean\l+ findReservation(String): Reservation\l+ getReservationList(): List\<? extends IReservation\>\l+ showReservationList(): void\l}"];
// DataRepository class
DataRepository [label="{DataRepository|# getInstance(): DataRepository\l|+ setDataStoreRoot(String): void\l+ getPath(): String\l+ Reservation(String): Reservation\l+ WalkFileSystemTree(AccomodationManager, Path): void\l+ LoadAccount(Path): Account\l- loadReservationRefList(JsonReader, Account): void\l- loadReservation(Account, String, String): void\l}"];
DataRepository [label="{DataRepository|\<\<singleton\>\>|- directoryPath: String\l- static instance: DataRepository\l|+ static getInstance(): DataRepository\l+ static setDataStoreRoot(String): void\l+ static getPath(): String\l+ static Reservation(String): Reservation\l+ static WalkFileSystemTree(...): void\l+ static LoadAccount(Path): Account\l}"];
}
subgraph cluster_main {
subgraph cluster_lodge {
label="lodge";
style=dashed;
color=purple;
style=filled;
color=lightcoral;
TestReservations [label="{TestReservations|+ main(String[]): void\l}"];
getRepositoryConfig [label="{getRepositoryConfig|+ getPath(): String\l}"];
TestReservations [label="{TestReservations|+ static main(String[]): void\l+ static class getRepositoryConfig\l}"];
}
// Inheritance relationships
AccountList -> "ArrayList<Account>" [arrowhead=empty, style=solid];
AccountReservationList -> "ArrayList<IReservation>" [arrowhead=empty, style=solid];
Reservation -> IReservation [arrowhead=empty, style=dashed, label="implements"];
CabinReservation -> Reservation [arrowhead=empty, style=solid];
HotelReservation -> Reservation [arrowhead=empty, style=solid];
HouseReservation -> Reservation [arrowhead=empty, style=solid];
DuplicateObjectException -> RuntimeException [arrowhead=empty, style=solid];
IllegalOperationException -> RuntimeException [arrowhead=empty, style=solid];
CabinReservation -> Reservation [arrowhead=empty, label="extends"];
HotelReservation -> Reservation [arrowhead=empty, label="extends"];
HouseReservation -> Reservation [arrowhead=empty, label="extends"];
// Composition relationships (filled diamond)
Account -> AccountReservationList [arrowhead=none, arrowtail=diamond, style=solid, label="1"];
Account -> Address [arrowhead=none, arrowtail=diamond, style=solid, label="2"];
Account -> EmailAddress [arrowhead=none, arrowtail=diamond, style=solid, label="1"];
AccomodationManager -> AccountList [arrowhead=none, arrowtail=odiamond, style=solid, label="1"];
// Composition relationships
Account -> AccountReservationList [arrowhead=diamond, label="contains"];
Account -> Address [arrowhead=diamond, label="mailing_address"];
Account -> EmailAddress [arrowhead=diamond, label="email_address"];
AccountList -> Account [arrowhead=diamond, label="contains"];
AccountReservationList -> IReservation [arrowhead=odiamond, label="contains 0..*"];
Reservation -> Address [arrowhead=diamond, label="physical_address\nmailing_address"];
Reservation -> KitchenTypeEnum [arrowhead=diamond, label="kitchen"];
Reservation -> ReservationStatusEnum [arrowhead=diamond, label="reservation_status"];
AccomodationManager -> AccountList [arrowhead=diamond, label="accounts"];
// Aggregation relationships (empty diamond)
AccountList -> Account [arrowhead=none, arrowtail=odiamond, style=solid, label="*"];
AccountReservationList -> IReservation [arrowhead=empty, arrowtail=odiamond, style=solid, label="0..*"];
// Association relationships
Reservation -> Address [arrowhead=none, style=solid, label="uses"];
Reservation -> KitchenTypeEnum [arrowhead=none, style=solid, label="uses"];
Reservation -> ReservationStatusEnum [arrowhead=none, style=solid, label="uses"];
AccomodationManager -> Account [arrowhead=none, arrowtail=odiamond, label="manages"];
AccomodationManager -> Reservation [arrowhead=none, style=dashed, label="manages"];
DataRepository -> AccomodationManager [arrowhead=none, style=dashed, label="uses"];
TestReservations -> AccomodationManager [arrowhead=none, style=dashed, label="uses"];
TestReservations -> getRepositoryConfig [arrowhead=none, style=dashed, label="uses"];
// Dependency relationships
Account -> DuplicateObjectException [arrowhead=open, style=dashed, label="throws"];
AccountList -> DuplicateObjectException [arrowhead=open, style=dashed, label="throws"];
// Dependencies
AccomodationManager -> DataRepository [arrowhead=open, style=dashed, label="uses"];
DataRepository -> Account [arrowhead=open, style=dashed, label="creates"];
DataRepository -> CabinReservation [arrowhead=open, style=dashed, label="creates"];
DataRepository -> HotelReservation [arrowhead=open, style=dashed, label="creates"];
DataRepository -> HouseReservation [arrowhead=open, style=dashed, label="creates"];
TestReservations -> AccomodationManager [arrowhead=open, style=dashed, label="uses"];
TestReservations -> CabinReservation [arrowhead=open, style=dashed, label="creates"];
TestReservations -> HotelReservation [arrowhead=open, style=dashed, label="creates"];
TestReservations -> HouseReservation [arrowhead=open, style=dashed, label="creates"];
AccountReservationList -> DuplicateObjectException [arrowhead=open, style=dashed, label="throws"];
Reservation -> IllegalOperationException [arrowhead=open, style=dashed, label="throws"];
}
}