1+ @startuml UserLoginClassDiagram
2+
3+ !define CONTROLLER_COLOR #E8F4FD
4+ !define SERVICE_COLOR #E8F8E8
5+ !define DAO_COLOR #FFF2E8
6+ !define MODEL_COLOR #F8E8F8
7+ !define UTIL_COLOR #F0F0F0
8+ !define EXCEPTION_COLOR #FFE8E8
9+
10+ package "Frontend Layer (JavaFX Controllers)" CONTROLLER_COLOR {
11+ class SignInUserController {
12+ -mainPane: Pane
13+ -ssnField: TextField
14+ -passwordField: TextField
15+ +initialize(): void
16+ +clickedSignInButton(): void
17+ -prefillTestData(): void
18+ -handleValidationException(ValidationException): void
19+ -highlightField(TextField): void
20+ -navigateToUserHome(String): void
21+ -isValidSSNFormat(String): boolean
22+ -showErrorAlert(String, String): void
23+ -clearFields(): void
24+ }
25+
26+ class StartViewGuestController {
27+ -mainPane: Pane
28+ +clickedSearchMenuGuest(): void
29+ +clickedSignInMenuGuest(): void
30+ }
31+
32+ class StartViewBorrowerController {
33+ +initialize(): void
34+ }
35+
36+ class StartViewLibrarianController {
37+ +initialize(): void
38+ }
39+ }
40+
41+ package "Service Layer" SERVICE_COLOR {
42+ class AuthenticationService {
43+ -emf: EntityManagerFactory
44+ -em: EntityManager
45+ -userDAO: LibraryUserDAO
46+ +authenticate(String, String): AuthenticationResult
47+ +initializeTestDataHash(): int
48+ +countUsersWithPlaceholderPasswords(): long
49+ +validateLoginInput(String): void
50+ +validatePassword(String): void
51+ +logout(): void
52+ +isUserLoggedIn(): boolean
53+ +getCurrentUser(): LibraryUser
54+ -normalizeLoginInput(String): String
55+ +close(): void
56+ }
57+
58+ class AuthenticationResult {
59+ -success: boolean
60+ -message: String
61+ -user: LibraryUser
62+ +success(LibraryUser, String): AuthenticationResult
63+ +failure(String): AuthenticationResult
64+ +isSuccess(): boolean
65+ +getMessage(): String
66+ +getUser(): LibraryUser
67+ +getUserRole(): String
68+ }
69+
70+ class ValidationResult<T> {
71+ -success: boolean
72+ -data: T
73+ -message: String
74+ -fieldErrors: Map<String, String>
75+ +success(T): ValidationResult<T>
76+ +failure(String): ValidationResult<T>
77+ +failure(Map<String, String>, String): ValidationResult<T>
78+ +isSuccess(): boolean
79+ +getData(): T
80+ +getMessage(): String
81+ +getFieldErrors(): Map<String, String>
82+ +hasFieldErrors(): boolean
83+ }
84+ }
85+
86+ package "Data Access Layer" DAO_COLOR {
87+ class LibraryUserDAO {
88+ -entityManager: EntityManager
89+ +save(LibraryUser): LibraryUser
90+ +findById(Integer): Optional<LibraryUser>
91+ +findByUsername(String): Optional<LibraryUser>
92+ +findByEmail(String): Optional<LibraryUser>
93+ +findBySsn(String): Optional<LibraryUser>
94+ +findByUserRole(String): List<LibraryUser>
95+ +authenticate(String, String): Optional<LibraryUser>
96+ +authenticateAlternative(String, String): Optional<LibraryUser>
97+ +initializeAllPasswords(): int
98+ +countUsersWithPlaceholderPasswords(): long
99+ +existsByUsername(String): boolean
100+ +existsByEmail(String): boolean
101+ +existsBySsn(String): boolean
102+ }
103+ }
104+
105+ package "Model Layer" MODEL_COLOR {
106+ class LibraryUser {
107+ -id: Integer
108+ -ssn: String
109+ -username: String
110+ -passwordHash: String
111+ -email: String
112+ -userRole: String
113+ -borrowerProfile: BorrowerProfile
114+ -loans: List<Loan>
115+ +hashPassword(String): String
116+ +verifyPassword(String): boolean
117+ +setRawPassword(String): void
118+ +getId(): Integer
119+ +getSsn(): String
120+ +getUsername(): String
121+ +getUserRole(): String
122+ +getPasswordHash(): String
123+ +getEmail(): String
124+ }
125+
126+ class BorrowerProfile {
127+ -id: Integer
128+ -firstName: String
129+ -lastName: String
130+ -phoneNumber: String
131+ -address: String
132+ }
133+
134+ class Loan {
135+ -id: Integer
136+ -loanDate: LocalDate
137+ -returnDate: LocalDate
138+ -returnedDate: LocalDate
139+ }
140+ }
141+
142+ package "Utility Layer" UTIL_COLOR {
143+ class MenuNavigationHelper {
144+ -currentControllerName: String
145+ +menuClickGuest(Pane, String): void
146+ +menuClickBorrower(Pane, String): void
147+ +menuClickLibrarian(Pane, String): void
148+ +buttonClickBorrower(Pane, String): void
149+ +buttonClickLibrarian(Pane, String): void
150+ +getCurrentControllerName(): String
151+ -navigateToView(Pane, String, String, Object): void
152+ }
153+
154+ class UserSession {
155+ -currentUser: LibraryUser {static}
156+ +setCurrentUser(LibraryUser): void {static}
157+ +getCurrentUser(): LibraryUser {static}
158+ +isLoggedIn(): boolean {static}
159+ +logout(): void {static}
160+ +getCurrentUserRole(): String {static}
161+ +getCurrentUserId(): Integer {static}
162+ +getCurrentUsername(): String {static}
163+ }
164+
165+ class ViewLoader {
166+ +loadToStage(Pane, String, String, Object): void {static}
167+ }
168+ }
169+
170+ package "Exception Layer" EXCEPTION_COLOR {
171+ class ValidationException {
172+ -fieldErrors: Map<String, String>
173+ +ValidationException(String)
174+ +ValidationException(String, String)
175+ +ValidationException(String, Map<String, String>)
176+ +hasFieldErrors(): boolean
177+ +getFieldErrors(): Map<String, String>
178+ +addFieldError(String, String): void
179+ }
180+ }
181+
182+ package "JPA/Persistence" {
183+ interface EntityManager {
184+ +find(Class<T>, Object): T
185+ +createQuery(String, Class<T>): TypedQuery<T>
186+ +getTransaction(): EntityTransaction
187+ +persist(Object): void
188+ +merge(T): T
189+ +close(): void
190+ }
191+
192+ interface EntityManagerFactory {
193+ +createEntityManager(): EntityManager
194+ +close(): void
195+ }
196+
197+ class Persistence {
198+ +createEntityManagerFactory(String): EntityManagerFactory {static}
199+ }
200+ }
201+
202+ ' Relationships
203+ SignInUserController --> AuthenticationService : uses
204+ SignInUserController --> MenuNavigationHelper : uses
205+ SignInUserController --> ValidationException : catches
206+
207+ AuthenticationService --> LibraryUserDAO : uses
208+ AuthenticationService --> LibraryUser : returns
209+ AuthenticationService --> AuthenticationResult : creates
210+ AuthenticationService --> ValidationException : throws
211+ AuthenticationService --> UserSession : sets
212+ AuthenticationService --> EntityManager : uses
213+ AuthenticationService --> EntityManagerFactory : uses
214+ AuthenticationService --> Persistence : uses
215+
216+ LibraryUserDAO --> EntityManager : uses
217+ LibraryUserDAO --> LibraryUser : queries/returns
218+
219+ AuthenticationResult --> LibraryUser : contains
220+
221+ LibraryUser --> BorrowerProfile : has
222+ LibraryUser --> Loan : has many
223+
224+ UserSession --> LibraryUser : stores
225+
226+ MenuNavigationHelper --> ViewLoader : uses
227+ MenuNavigationHelper --> StartViewBorrowerController : navigates to
228+ MenuNavigationHelper --> StartViewLibrarianController : navigates to
229+ MenuNavigationHelper --> StartViewGuestController : navigates to
230+
231+ ValidationException --> ValidationResult : related to
232+
233+ note top of SignInUserController : "Entry point for user login\nHandles UI interactions"
234+ note top of AuthenticationService : "Core business logic\nPassword validation\nSession management"
235+ note top of LibraryUserDAO : "Data access abstraction\nDatabase queries\nUser authentication"
236+ note top of LibraryUser : "Domain model\nPassword hashing\nUser data"
237+ note top of UserSession : "Session management\nStatic singleton pattern"
238+
239+ @enduml
0 commit comments