Skip to content

Commit 5899101

Browse files
authored
Merge pull request #11 from lfir/feat/docs-uml
Update mailgun-java to v2.3
2 parents 5639ec8 + ecab177 commit 5899101

File tree

4 files changed

+264
-1
lines changed

4 files changed

+264
-1
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<dependency>
4242
<groupId>com.mailgun</groupId>
4343
<artifactId>mailgun-java</artifactId>
44-
<version>2.1.1</version>
44+
<version>2.3</version>
4545
</dependency>
4646
<dependency>
4747
<groupId>io.jsonwebtoken</groupId>

src/docs/asciidocs/index.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@ and the parts that need more attention.
2828

2929
* https://github.com/lfir/http-validator/network/dependencies[Dependency graph]
3030

31+
**UML diagram**
32+
33+
* https://raw.githubusercontent.com/lfir/http-validator/refs/heads/main/src/docs/classDiagram.png[Class Diagram]
3134

3235
==== Thank you for using the HTTP Validator!

src/docs/classDiagram.png

234 KB
Loading

src/docs/classDiagram.txt

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
@startuml classDiagram
2+
3+
title HTTP Validator - Class Diagram
4+
5+
' Main Application Entry Point
6+
class HTTPValidatorWebApp {
7+
- RUN_SCHEDULE_PROPERTY: String
8+
- context: ConfigurableApplicationContext
9+
--
10+
+ main(args: String[]): void
11+
+ restartAppContextWithNewRunSchedule(cronExpression: String): void
12+
- setContext(context: ConfigurableApplicationContext): void
13+
}
14+
15+
' Controllers (REST endpoints)
16+
class AppInfoController {
17+
- START_TIME_KEY: String
18+
- TIME_ELAPSED_KEY: String
19+
- TASKS_TOTAL_KEY: String
20+
- TASKS_OK_KEY: String
21+
- TASKS_FAILED_KEY: String
22+
- TASKS_ERRORS_KEY: String
23+
- NO_LASTRUN_DATA_ERROR_MSG: String
24+
- STATUS_ENDPOINT: String
25+
- LAST_RUN_ENDPOINT: String
26+
- ERROR_VALUE: String
27+
- OK_VALUE: String
28+
- DATAFILE_STATUS_KEY: String
29+
- CONFIG_STATUS_KEY: String
30+
- dao: XMLValidationTaskDao
31+
- mailServ: EmailNotificationService
32+
- valServ: ValidationService
33+
- eventServ: EventListenerService
34+
--
35+
+ informLastRunData(): ResponseEntity<Map<String,String>>
36+
+ informWebAppStatus(): ResponseEntity<Map<String,String>>
37+
}
38+
39+
class AppConfigurationController {
40+
- UPD_RUN_SCHEDULE_ENDPOINT: String
41+
- UPD_DATA_FILE_ENDPOINT: String
42+
- CRON_EXPRESSION_KEY: String
43+
- INVALID_CRON_EXPRESSION_ERROR_MSG: String
44+
- INVALID_DATA_FILE_ERROR_MSG: String
45+
- UPD_DATA_FILE_ERROR_MSG: String
46+
- valServ: ValidationService
47+
- dao: XMLValidationTaskDao
48+
--
49+
+ updateValidatorDataFile(file: MultipartFile): ResponseEntity<Map<String,String>>
50+
+ updateValidatorRunSchedule(body: Map<String,String>): ResponseEntity<Map<String,String>>
51+
}
52+
53+
' Services
54+
class ValidationService {
55+
- HEADER_KEY_VALUE_DELIMITER: String
56+
- CONNECT_TIMEOUT_SECONDS: Duration
57+
- REQUEST_TIMEOUT_SECONDS: Duration
58+
- lrTimeElapsed: Duration
59+
- lrStartDateTime: String
60+
- lrTaskCounts: int[]
61+
- client: HttpClient
62+
- logger: Logger
63+
- notificationService: EmailNotificationService
64+
- taskReader: XMLValidationTaskDao
65+
- env: Environment
66+
- mapper: ObjectMapper
67+
--
68+
+ buildAndExecuteRequests(tasks: List<ValidationTask>): List<HttpSendOutcomeWrapper>
69+
+ execValidations(): void
70+
+ getLastRunInfo(): Map<String,String>
71+
+ isValidConfig(): boolean
72+
+ isValidCronExpression(cronExpr: String): boolean
73+
+ processRequestResultsAndNotify(tasks: List<ValidationTask>, results: List<HttpSendOutcomeWrapper>): int[]
74+
- setClient(client: HttpClient): void
75+
- setNotificationService(service: EmailNotificationService): void
76+
- setTaskReader(taskReader: XMLValidationTaskDao): void
77+
- setLogger(logger: Logger): void
78+
- setEnv(env: Environment): void
79+
- setObjectMapper(mapper: ObjectMapper): void
80+
}
81+
82+
class EventListenerService {
83+
- startDateTime: String
84+
- mailServ: EmailNotificationService
85+
--
86+
+ getCurrentDateTime(): String
87+
+ getStartDateTime(): String
88+
+ notifyThatAppTerminated(): void
89+
+ setAppStartTime(): void
90+
- setNotificationService(service: EmailNotificationService): void
91+
}
92+
93+
class EmailNotificationService {
94+
- BODY_LINE1: String
95+
- BODY_LINE2: String
96+
- BODY_LINE3: String
97+
- APIKEY_PROPERTY: String
98+
- FROM_PROPERTY: String
99+
- TO_PROPERTY: String
100+
- client: MailgunMessagesApi
101+
- logger: Logger
102+
- env: Environment
103+
--
104+
+ isValidConfig(): boolean
105+
+ sendAppTerminatedNotification(endTime: String): void
106+
+ sendVTaskErrorsNotification(mailBody: List<String[]>): void
107+
- EmailNotificationService(apiKey: String)
108+
- buildMailBody(contents: List<String[]>): String
109+
- getApiKey(): String
110+
- getFrom(): String
111+
- getTo(): String
112+
- sendPlainTextEmail(subject: String, body: String): void
113+
- setClient(cl: MailgunMessagesApi): void
114+
- setEnv(env: Environment): void
115+
- setLogger(logger: Logger): void
116+
}
117+
118+
class JwtAuthenticationService {
119+
- BEARER_PREFIX: String
120+
- SECRET_PROPERTY: String
121+
- logger: Logger
122+
- env: Environment
123+
--
124+
+ getNewEncodedSigningKey(): String
125+
+ getNewTokenValidFor(hours: int): String
126+
+ isValidToken(authorizationHeader: String): boolean
127+
- extractAllClaims(token: String): Jws<Claims>
128+
- getSecretKey(): SecretKey
129+
- setEnv(env: Environment): void
130+
- setLogger(logger: Logger): void
131+
}
132+
133+
' Persistence
134+
class XMLValidationTaskDao {
135+
- URL_TAG: String
136+
- RES_TAG: String
137+
- REQ_BODY_TAG: String
138+
- HEADER_TAG: String
139+
- VALIDATION_TAG: String
140+
- REQ_METHOD_ATTR: String
141+
- RES_SC_ATTR: String
142+
- DATAFILE_PROPERTY: String
143+
- SCHEMA_FILENAME: String
144+
- xmlParser: DocumentBuilder
145+
- logger: Logger
146+
- tasks: List<ValidationTask>
147+
- lastModifiedTime: long
148+
- env: Environment
149+
- mapper: ObjectMapper
150+
--
151+
+ getAll(): List<ValidationTask>
152+
+ isDataFileStatusOk(): boolean
153+
+ updateDataFile(file: MultipartFile): void
154+
- createVTaskFromNodes(validation: NodeList): ValidationTask
155+
- getDataFilePath(): Path
156+
- getDocData(): Document
157+
- parseXMLInput(inputStream: InputStream): Document
158+
- setEnv(env: Environment): void
159+
- setLogger(logger: Logger): void
160+
- setLastModifiedTime(time: long): void
161+
- setObjectMapper(mapper: ObjectMapper): void
162+
- setXmlParser(xmlParser: DocumentBuilder): void
163+
}
164+
165+
class XMLErrorHandler {
166+
- logger: Logger
167+
- logmsg: String
168+
--
169+
+ error(ex: SAXParseException): void
170+
+ fatalError(ex: SAXParseException): void
171+
+ parseInputOrThrow(f: ThrowingFunction, arg: Object, logger: Logger, msg: String): Object
172+
+ warning(ex: SAXParseException): void
173+
- setLogger(logger: Logger): void
174+
}
175+
176+
' Filters
177+
class JwtRequestFilter {
178+
- AUTHORIZATION_HEADER_KEY: String
179+
- authServ: JwtAuthenticationService
180+
--
181+
# doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, chain: FilterChain): void
182+
- setAuthenticationService(authenticationService: JwtAuthenticationService): void
183+
}
184+
185+
' Models
186+
class ValidationTask {
187+
- reqMethod: MethodType
188+
- reqURL: String
189+
- reqHeaders: List<String>
190+
- reqBody: JsonNode
191+
- validStatusCode: int
192+
- validBody: String
193+
--
194+
+ equals(obj: Object): boolean
195+
+ hashCode(): int
196+
+ isValid(statusCode: int, body: String): boolean
197+
}
198+
199+
' Utilities
200+
class HttpSendOutcomeWrapper {
201+
- NET_ERR_CODE: int
202+
- NET_ERR_MSG: String
203+
- res: HttpResponse<String>
204+
- ex: Throwable
205+
--
206+
+ getBody(): String
207+
+ getStatusCode(): int
208+
+ HttpSendOutcomeWrapper(ex: Throwable)
209+
+ HttpSendOutcomeWrapper(res: HttpResponse<String>)
210+
+ isWholeResponse(): boolean
211+
- setResponse(res: HttpResponse<String>): void
212+
}
213+
214+
' Relationships
215+
HTTPValidatorWebApp --> ValidationService : uses
216+
HTTPValidatorWebApp --> EventListenerService : uses
217+
218+
AppInfoController --> ValidationService : depends
219+
AppInfoController --> XMLValidationTaskDao : depends
220+
AppInfoController --> EmailNotificationService : depends
221+
AppInfoController --> EventListenerService : depends
222+
223+
AppConfigurationController --> ValidationService : depends
224+
AppConfigurationController --> XMLValidationTaskDao : depends
225+
226+
ValidationService --> ValidationTask : manages
227+
ValidationService --> XMLValidationTaskDao : uses
228+
ValidationService --> HttpSendOutcomeWrapper : returns
229+
ValidationService --> EmailNotificationService : uses
230+
231+
EventListenerService --> EmailNotificationService : uses
232+
233+
JwtRequestFilter --> JwtAuthenticationService : uses
234+
235+
XMLValidationTaskDao --> ValidationTask : creates
236+
XMLValidationTaskDao --> XMLErrorHandler : uses
237+
238+
' Notes and patterns
239+
note right of HTTPValidatorWebApp
240+
**Key Patterns**:
241+
- Orchestrator (HTTPValidatorWebApp)
242+
- Service layer (ValidationService, EmailNotificationService)
243+
- DAO for XML data (XMLValidationTaskDao)
244+
- Filter-based auth (JwtRequestFilter + JwtAuthenticationService)
245+
end note
246+
247+
note right of ValidationService
248+
**Core Validation Engine**
249+
- Loads tasks from XMLValidationTaskDao
250+
- Executes HTTP requests asynchronously
251+
- Aggregates results and notifies via EmailNotificationService
252+
end note
253+
254+
note right of XMLValidationTaskDao
255+
**Persistence / XML loader**
256+
- Parses and validates XML datafile against validations.xsd
257+
- Exposes `getAll()` and `updateDataFile()` for controllers
258+
end note
259+
260+
@enduml

0 commit comments

Comments
 (0)