|
| 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