Produced by Araxis Merge on 11/14/2017 6:57:19 AM Central Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\job\fps | FpsDelegateMultiItemWriter.java | Thu Nov 9 14:19:54 2017 UTC |
| 2 | cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\job\fps | FpsDelegateMultiItemWriter.java | Tue Nov 14 12:26:20 2017 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 2 | 774 |
| Changed | 1 | 2 |
| Inserted | 0 | 0 |
| Removed | 0 | 0 |
| Whitespace | |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | package go v.va.cpss. job.fps; | |
| 2 | ||
| 3 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.JOB _FAILURE_K EY; | |
| 4 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.JOB _FAILURE_M ESSAGE_KEY ; | |
| 5 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.WRI TE_FAILURE _STATUS; | |
| 6 | import sta tic gov.va .cpss.job. fps.FpsPro cessingCon stants.PAT IENT_ID_KE Y; | |
| 7 | import sta tic gov.va .cpss.job. fps.FpsPro cessingCon stants.SIT E_ID_KEY; | |
| 8 | import sta tic gov.va .cpss.job. fps.FpsPro cessingCon stants.TOT AL_SITE_CO UNT_KEY; | |
| 9 | import sta tic gov.va .cpss.job. fps.FpsPro cessingCon stants.TOT AL_STATEME NT_COUNT_K EY; | |
| 10 | ||
| 11 | import jav a.util.Arr ayList; | |
| 12 | import jav a.util.Lis t; | |
| 13 | ||
| 14 | import org .apache.lo g4j.Logger ; | |
| 15 | import org .springfra mework.bat ch.core.Ex itStatus; | |
| 16 | import org .springfra mework.bat ch.core.It emWriteLis tener; | |
| 17 | import org .springfra mework.bat ch.core.Jo bExecution ; | |
| 18 | import org .springfra mework.bat ch.core.St epExecutio n; | |
| 19 | import org .springfra mework.bat ch.core.St epExecutio nListener; | |
| 20 | import org .springfra mework.bat ch.item.It emWriter; | |
| 21 | ||
| 22 | import gov .va.cpss.m odel.fps.P SDetails; | |
| 23 | import gov .va.cpss.m odel.fps.P SPatient; | |
| 24 | import gov .va.cpss.m odel.fps.P SRecord; | |
| 25 | import gov .va.cpss.m odel.fps.P SSite; | |
| 26 | import gov .va.cpss.s ervice.Fps Service; | |
| 27 | ||
| 28 | /** | |
| 29 | * Impleme ntation of ItemWrite r used to handle wri ting of ra w records when | |
| 30 | * process ing. | |
| 31 | * | |
| 32 | * @author DN S BROWNL | |
| 33 | */ | |
| 34 | public cla ss FpsDele gateMultiI temWriter | |
| 35 | impl ements Ite mWriter<PS Record>, I temWriteLi stener<PSR ecord>, St epExecutio nListener { | |
| 36 | ||
| 37 | /* | |
| 38 | * Flag to i ndicate th at the job has been forcefully stopped a nd should no | |
| 39 | * longer at tempt writ es. | |
| 40 | * / | |
| 41 | pr ivate bool ean forceS top = fals e; | |
| 42 | ||
| 43 | pr ivate fina l Logger w riterLogge r = Logger .getLogger (FpsDelega teMultiIte mWriter.cl ass.getCan onicalName ()); | |
| 44 | ||
| 45 | pr ivate JobE xecution j obExecutio n; | |
| 46 | ||
| 47 | pr ivate FpsS ervice fps Service; | |
| 48 | ||
| 49 | pr ivate Long siteId; | |
| 50 | pr ivate Long patientId ; | |
| 51 | ||
| 52 | /* | |
| 53 | * Delegate writer use d to take advantage of batch w riting pat ient detai ls | |
| 54 | * records. | |
| 55 | * / | |
| 56 | pr ivate Item Writer<PSD etails> ps DetailsDat abaseItemW riter; | |
| 57 | ||
| 58 | pu blic FpsSe rvice getF psService( ) { | |
| 59 | retu rn fpsServ ice; | |
| 60 | } | |
| 61 | ||
| 62 | pu blic void setFpsServ ice(FpsSer vice fpsSe rvice) { | |
| 63 | this .fpsServic e = fpsSer vice; | |
| 64 | } | |
| 65 | ||
| 66 | pu blic ItemW riter<PSDe tails> get PsDetailsD atabaseIte mWriter() { | |
| 67 | retu rn psDetai lsDatabase ItemWriter ; | |
| 68 | } | |
| 69 | ||
| 70 | pu blic void setPsDetai lsDatabase ItemWriter (ItemWrite r<PSDetail s> psDetai lsDatabase ItemWriter ) { | |
| 71 | this .psDetails DatabaseIt emWriter = psDetails DatabaseIt emWriter; | |
| 72 | } | |
| 73 | ||
| 74 | @O verride | |
| 75 | pu blic void write(List <? extends PSRecord> items) th rows Excep tion { | |
| 76 | ||
| 77 | writ erLogger.d ebug("Begi n Write"); | |
| 78 | ||
| 79 | // D o not atte mpt to wri te if forc ed stop. | |
| 80 | if ( forceStop) { | |
| 81 | return ; | |
| 82 | } | |
| 83 | ||
| 84 | try { | |
| 85 | ||
| 86 | // Lis t of detai ls that ca n be writt en using b atch write . | |
| 87 | List<P SDetails> detailsL = new Array List<>(); | |
| 88 | ||
| 89 | // Loo p through all of the statement s to write . | |
| 90 | for (O bject item : items) { | |
| 91 | ||
| 92 | // Updat e appropri ate object s with the appropria te FK valu es. | |
| 93 | // The a ssumption is the row s are orde red proper ly. | |
| 94 | ||
| 95 | // The d ata is pro cessed as: | |
| 96 | // PS, t hen subseq uent 1-* P H. | |
| 97 | // PH, t hen subseq uent 1-* P D. | |
| 98 | ||
| 99 | if (item instanceo f PSSite) { | |
| 100 | ||
| 101 | PSSite sit e = (PSSit e) item; | |
| 102 | ||
| 103 | // If a PS Site row t hen reset the child keys to nu ll to | |
| 104 | // prevent | |
| 105 | // erroneo us foreign key refer ences. | |
| 106 | resetSiteF K(); | |
| 107 | ||
| 108 | // Batch w on't retur n generate d keys so use DAO. | |
| 109 | writerLogg er.debug(" Saving PSS ite: " + s ite.toStri ng()); | |
| 110 | fpsService .saveSite( site); | |
| 111 | ||
| 112 | // Save th is record ID for lat er referen ce for chi ldren | |
| 113 | // PSPatie nt records . | |
| 114 | updateSite Processing Data(site. getId()); | |
| 115 | ||
| 116 | } else i f (item in stanceof P SPatient) { | |
| 117 | ||
| 118 | PSPatient patient = (PSPatient ) item; | |
| 119 | ||
| 120 | // The Sit eId FK nee ds to be s et in the associated PSPatient | |
| 121 | // object. | |
| 122 | // Save th e PSSite I D. | |
| 123 | if (jobExe cution.get ExecutionC ontext().c ontainsKey (SITE_ID_K EY)) { | |
| 124 | si teId = job Execution. getExecuti onContext( ).getLong( SITE_ID_KE Y); | |
| 125 | } | |
| 126 | ||
| 127 | // If a PS Patient ro w then res et the chi ld keys to null to | |
| 128 | // prevent | |
| 129 | // erroneo us foreign key refer ences. | |
| 130 | resetPatie ntFK(); | |
| 131 | ||
| 132 | if (siteId != null) { | |
| 133 | ||
| 134 | // For PSPat ient recor ds, set th e database | |
| 135 | // auto-gene rated | |
| 136 | // Site ID i n the pati ent record . | |
| 137 | pa tient.setP sSite(new PSSite(sit eId)); | |
| 138 | ||
| 139 | // Batch won 't return generated keys so us e service. | |
| 140 | wr iterLogger .debug("Sa ving PSPat ient: " + patient.to String()); | |
| 141 | fp sService.s avePatient (patient); | |
| 142 | ||
| 143 | // Save this record ID for later reference for child ren | |
| 144 | // PSDetails records. | |
| 145 | up datePatien tProcessin gData(pati ent.getId( )); | |
| 146 | } else { | |
| 147 | ||
| 148 | // Unrecover able error so stop t he job. | |
| 149 | st opJob(WRIT E_FAILURE_ STATUS, "A ttempted t o process PH row wit h a null P S FK"); | |
| 150 | br eak; | |
| 151 | } | |
| 152 | ||
| 153 | } else i f (item in stanceof P SDetails) { | |
| 154 | ||
| 155 | PSDetails details = (PSDetails ) item; | |
| 156 | ||
| 157 | // The Pat ientId FK needs to b e set in t he associa ted | |
| 158 | // PSDetai ls | |
| 159 | // object. | |
| 160 | // Save th e PSPatien t ID. | |
| 161 | if (jobExe cution.get ExecutionC ontext().c ontainsKey (PATIENT_I D_KEY)) { | |
| 162 | pa tientId = jobExecuti on.getExec utionConte xt().getLo ng(PATIENT _ID_KEY); | |
| 163 | } | |
| 164 | ||
| 165 | // At this point pat ientId FK should not be null. | |
| 166 | if (patien tId != nul l) { | |
| 167 | ||
| 168 | // For PSDet ails recor ds, set th e database | |
| 169 | // auto-gene rated | |
| 170 | // Patient I D in the d etails rec ord. | |
| 171 | de tails.setP sPatientId (patientId ); | |
| 172 | ||
| 173 | // Because w e don't ne ed generat ed keys so we can us e | |
| 174 | // the | |
| 175 | // batch for | |
| 176 | // this inse rt. They w ill be wri tten to th e database | |
| 177 | // after | |
| 178 | // the recor d loop has finished. | |
| 179 | de tailsL.add (details); | |
| 180 | } else { | |
| 181 | ||
| 182 | // Unrecover able error so stop t he job. | |
| 183 | st opJob(WRIT E_FAILURE_ STATUS, "A ttempted t o process PD row wit h a null P H FK"); | |
| 184 | br eak; | |
| 185 | } | |
| 186 | ||
| 187 | } else { | |
| 188 | ||
| 189 | // Unrecov erable err or so stop the job. | |
| 190 | stopJob(WR ITE_FAILUR E_STATUS, "Attempted to write unknown re cord"); | |
| 191 | break; | |
| 192 | } | |
| 193 | } | |
| 194 | ||
| 195 | // We can use ba tch to upd ate replac ed stateme nts. | |
| 196 | if (!f orceStop & & !details L.isEmpty( )) { | |
| 197 | writerLo gger.debug ("Saving l ist of CBS SiteTrans" ); | |
| 198 | psDetail sDatabaseI temWriter. write(deta ilsL); | |
| 199 | } | |
| 200 | ||
| 201 | } ca tch (Excep tion e) { | |
| 202 | ||
| 203 | String Builder er ror = new StringBuil der(); | |
| 204 | error. append("Er ror during write bec ause of ") ; | |
| 205 | error. append(e.g etClass(). getSimpleN ame()); | |
| 206 | error. append("\n Message: " ); | |
| 207 | error. append(e.g etMessage( )); | |
| 208 | if ((e .getCause( ) != null) && (e.get Cause().ge tMessage() != null)) { | |
| 209 | error.ap pend("\nCa use: "); | |
| 210 | error.ap pend(e.get Cause().ge tMessage() .trim()); | |
| 211 | } | |
| 212 | ||
| 213 | // Unr ecoverable error so stop the j ob. | |
| 214 | stopJo b(WRITE_FA ILURE_STAT US, error. toString() ); | |
| 215 | } | |
| 216 | ||
| 217 | writ erLogger.d ebug("End Write"); | |
| 218 | } | |
| 219 | ||
| 220 | /* * | |
| 221 | * Reset the site valu es from th e job exec ution to p repare to process ne xt | |
| 222 | * site. | |
| 223 | * / | |
| 224 | pr ivate void resetSite FK() { | |
| 225 | site Id = null; | |
| 226 | if ( jobExecuti on.getExec utionConte xt().conta insKey(SIT E_ID_KEY)) { | |
| 227 | jobExe cution.get ExecutionC ontext().r emove(SITE _ID_KEY); | |
| 228 | } | |
| 229 | ||
| 230 | rese tPatientFK (); | |
| 231 | } | |
| 232 | ||
| 233 | /* * | |
| 234 | * Reset the patient v alues from the job e xecution t o prepare to process | |
| 235 | * next pati ent. | |
| 236 | * / | |
| 237 | pr ivate void resetPati entFK() { | |
| 238 | pati entId = nu ll; | |
| 239 | if ( jobExecuti on.getExec utionConte xt().conta insKey(PAT IENT_ID_KE Y)) { | |
| 240 | jobExe cution.get ExecutionC ontext().r emove(PATI ENT_ID_KEY ); | |
| 241 | } | |
| 242 | } | |
| 243 | ||
| 244 | /* * | |
| 245 | * Update si te process ing metada ta. | |
| 246 | * / | |
| 247 | pr ivate bool ean update SiteProces singData(f inal Long primaryKey Result) { | |
| 248 | ||
| 249 | bool ean succes sful = tru e; | |
| 250 | ||
| 251 | writ erLogger.d ebug("Wrot e PS(" + p rimaryKeyR esult + ") "); | |
| 252 | jobE xecution.g etExecutio nContext() .putLong(S ITE_ID_KEY , primaryK eyResult); | |
| 253 | ||
| 254 | if ( jobExecuti on.getExec utionConte xt().conta insKey(TOT AL_SITE_CO UNT_KEY)) { | |
| 255 | jobExe cution.get ExecutionC ontext().p utLong(TOT AL_SITE_CO UNT_KEY, | |
| 256 | jobExecuti on.getExec utionConte xt().getLo ng(TOTAL_S ITE_COUNT_ KEY) + 1); | |
| 257 | } el se { | |
| 258 | setFai lureMessag e("Unable to increme nt total s ite count" ); | |
| 259 | succes sful = fal se; | |
| 260 | } | |
| 261 | ||
| 262 | retu rn success ful; | |
| 263 | } | |
| 264 | ||
| 265 | /* * | |
| 266 | * Update pa tient proc essing met adata. | |
| 267 | * / | |
| 268 | pr ivate bool ean update PatientPro cessingDat a(final Lo ng primary KeyResult) { | |
| 269 | ||
| 270 | bool ean succes sful = tru e; | |
| 271 | ||
| 272 | writ erLogger.d ebug("Wrot e PH(" + p rimaryKeyR esult + ") "); | |
| 273 | jobE xecution.g etExecutio nContext() .putLong(P ATIENT_ID_ KEY, prima ryKeyResul t); | |
| 274 | ||
| 275 | if ( jobExecuti on.getExec utionConte xt().conta insKey(TOT AL_STATEME NT_COUNT_K EY)) { | |
| 276 | jobExe cution.get ExecutionC ontext().p utLong(TOT AL_STATEME NT_COUNT_K EY, | |
| 277 | jobExecuti on.getExec utionConte xt().getLo ng(TOTAL_S TATEMENT_C OUNT_KEY) + 1); | |
| 278 | } el se { | |
| 279 | setFai lureMessag e("Unable to increme nt total s tatement c ount"); | |
| 280 | succes sful = fal se; | |
| 281 | } | |
| 282 | ||
| 283 | retu rn success ful; | |
| 284 | } | |
| 285 | ||
| 286 | @O verride | |
| 287 | pu blic void beforeWrit e(List<? e xtends PSR ecord> ite ms) { | |
| 288 | forc eStop = fa lse; | |
| 289 | if ( jobExecuti on.getExec utionConte xt().conta insKey(JOB _FAILURE_K EY)) { | |
| 290 | writer Logger.err or("System failure d etected.") ; | |
| 291 | forceS top = true ; | |
| 292 | } | |
| 293 | } | |
| 294 | ||
| 295 | @O verride | |
| 296 | pu blic void afterWrite (List<? ex tends PSRe cord> item s) { | |
| 297 | // D o not need to do any thing. | |
| 298 | } | |
| 299 | ||
| 300 | @O verride | |
| 301 | pu blic void onWriteErr or(Excepti on e, List <? extends PSRecord> items) { | |
| 302 | ||
| 303 | writ erLogger.e rror("Writ er encount ered syste m error an d forced s top"); | |
| 304 | ||
| 305 | Stri ngBuilder error = ne w StringBu ilder(); | |
| 306 | erro r.append(" Unable to write item because o f "); | |
| 307 | erro r.append(e .getClass( ).getSimpl eName()); | |
| 308 | erro r.append(" \nMessage: "); | |
| 309 | erro r.append(e .getMessag e()); | |
| 310 | if ( (e.getCaus e() != nul l) && (e.g etCause(). getMessage () != null )) { | |
| 311 | error. append("\n Cause: "); | |
| 312 | error. append(e.g etCause(). getMessage ().trim()) ; | |
| 313 | } | |
| 314 | ||
| 315 | // S et failure and messa ge. | |
| 316 | stop Job(WRITE_ FAILURE_ST ATUS, "Unr ecoverable writer er ror"); | |
| 317 | } | |
| 318 | ||
| 319 | @O verride | |
| 320 | pu blic void beforeStep (StepExecu tion stepE xecution) { | |
| 321 | writ erLogger.i nfo("Befor e Step Exe cution"); | |
| 322 | // S ave the jo b executio n at the b eginning o f the step . | |
| 323 | // T he executi on context will be u sed to set key value s as data is | |
| 324 | // p rocessed. | |
| 325 | jobE xecution = stepExecu tion.getJo bExecution (); | |
| 326 | } | |
| 327 | ||
| 328 | @O verride | |
| 329 | pu blic ExitS tatus afte rStep(Step Execution stepExecut ion) { | |
| 330 | writ erLogger.i nfo("After Step Exec ution"); | |
| 331 | // D o not need to do any thing afte r step. | |
| 332 | retu rn null; | |
| 333 | } | |
| 334 | ||
| 335 | /* * | |
| 336 | * Forcefull y stop the job proce ssing beca use a fail ure was de tected. | |
| 337 | * | |
| 338 | * @param st atus | |
| 339 | * The stat us for the failure. | |
| 340 | * @param me ssage | |
| 341 | * The mess age associ ated with the status failure. | |
| 342 | * / | |
| 343 | pr ivate void stopJob(f inal Strin g status, final Stri ng message ) { | |
| 344 | ||
| 345 | // S et the fla g to indic ate the jo b has been forcefull y stopped. | |
| 346 | forc eStop = tr ue; | |
| 347 | ||
| 348 | // L og message . | |
| 349 | writ erLogger.e rror("Writ er executi on encount ered unrec overable e rror and f orced stop "); | |
| 350 | ||
| 351 | // S et failure and messa ge. | |
| 352 | setF ailureStat us(status) ; | |
| 353 | ||
| 354 | // S et failure message. | |
| 355 | setF ailureMess age(messag e); | |
| 356 | } | |
| 357 | ||
| 358 | /* * | |
| 359 | * Set the f ailure in the job ex ecution co ntext. | |
| 360 | * | |
| 361 | * @param st atus | |
| 362 | * The fail ure status . | |
| 363 | * / | |
| 364 | pr ivate void setFailur eStatus(fi nal String status) { | |
| 365 | ||
| 366 | // L og job fai lure statu s. | |
| 367 | writ erLogger.e rror("Job failed wit h status: " + status ); | |
| 368 | ||
| 369 | // S et job fai lure. | |
| 370 | jobE xecution.g etExecutio nContext() .putString (JOB_FAILU RE_KEY, st atus); | |
| 371 | } | |
| 372 | ||
| 373 | /* * | |
| 374 | * Set the f ailure mes sage in th e job exec ution cont ext. | |
| 375 | * | |
| 376 | * @param me ssage | |
| 377 | * The mess age to ass ociate wit h the erro r status. | |
| 378 | * / | |
| 379 | pr ivate void setFailur eMessage(f inal Strin g message) { | |
| 380 | ||
| 381 | // L og job fai lure messa ge. | |
| 382 | writ erLogger.e rror("Job failure me ssage: " + message); | |
| 383 | ||
| 384 | // S et job fai lure messa ge. | |
| 385 | jobE xecution.g etExecutio nContext() .putString (JOB_FAILU RE_MESSAGE _KEY, mess age); | |
| 386 | } | |
| 387 | ||
| 388 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993-2016 Araxis Ltd (www.araxis.com). All rights reserved.