Produced by Araxis Merge on 11/14/2017 6:57:20 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\sendbill | SendBillProcessFileCompletionTasklet.java | Thu Nov 9 14:19:54 2017 UTC |
| 2 | cbs.zip\cbs\cbs\src\main\java\gov\va\cpss\job\sendbill | SendBillProcessFileCompletionTasklet.java | Tue Nov 14 12:26:31 2017 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 2 | 588 |
| 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.sendbi ll; | |
| 2 | ||
| 3 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.DAT A_ERROR_ST ATUS; | |
| 4 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.JOB _FAILURE_K EY; | |
| 5 | import sta tic gov.va .cpss.job. CbssJobPro cessingCon stants.WRI TE_FAILURE _STATUS; | |
| 6 | import sta tic gov.va .cpss.job. sendbill.S endBillDat aProcessin gConstants .SEND_BILL _ID_KEY; | |
| 7 | import sta tic gov.va .cpss.job. sendbill.S endBillDat aProcessin gConstants .SEND_BILL _OUTPUT_FI LE_NAME_KE Y; | |
| 8 | import sta tic gov.va .cpss.job. sendbill.S endBillDat aProcessin gConstants .SEND_BILL _OUTPUT_RE SOURCE_KEY ; | |
| 9 | //import s tatic gov. va.cpss.jo b.sendcbs. SendCBSPro cessingCon stants.CBS _TOTAL_PAT IENTS_INCL UDED_KEY; | |
| 10 | import sta tic gov.va .cpss.job. sendbill.S endBillDat aProcessin gConstants .TOTAL_BIL L_PATIENT_ DATA_PROCE SSED; | |
| 11 | ||
| 12 | import org .springfra mework.bat ch.core.Jo bExecution ; | |
| 13 | import org .springfra mework.bat ch.core.sc ope.contex t.ChunkCon text; | |
| 14 | ||
| 15 | import gov .va.cpss.j ob.CbssJob BaseTransa ctionTaskl et; | |
| 16 | import gov .va.cpss.m odel.Proce ssStatus; | |
| 17 | import gov .va.cpss.s ervice.Sen dBillDataS ervice; | |
| 18 | import gov .va.cpss.s ervice.Sft pService; | |
| 19 | import gov .va.cpss.t ime.TimeUt ils; | |
| 20 | ||
| 21 | /** | |
| 22 | * Complet e processi ng by tran sferring f ile to sft p server w ith tempor ary name, | |
| 23 | * setting appropria te message status an d statemen t status, and renami ng | |
| 24 | * tempora ry file on sftp serv er with co rrect name . If any e rrors occu r the | |
| 25 | * databas e updates are rolled back and the batch job status is set to error | |
| 26 | * conditi on. | |
| 27 | * | |
| 28 | * @author DN S BROWNL | |
| 29 | */ | |
| 30 | public cla ss SendBil lProcessFi leCompleti onTasklet extends Cb ssJobBaseT ransaction Tasklet { | |
| 31 | ||
| 32 | pr ivate fina l String T IMESTAMP_F ORMAT = "H H_mm_ss"; | |
| 33 | ||
| 34 | pr ivate Stri ng tempFil enamePostf ix; | |
| 35 | ||
| 36 | pr ivate Stri ng serverT argetDirec tory; | |
| 37 | ||
| 38 | pr ivate Sftp Service sf tpService; | |
| 39 | ||
| 40 | pr ivate Send BillDataSe rvice send BillDataSe rvice; | |
| 41 | ||
| 42 | pu blic Strin g getTempF ilenamePos tfix() { | |
| 43 | retu rn tempFil enamePostf ix; | |
| 44 | } | |
| 45 | ||
| 46 | pu blic void setTempFil enamePostf ix(String tempFilena mePostfix) { | |
| 47 | this .tempFilen amePostfix = tempFil enamePostf ix; | |
| 48 | } | |
| 49 | ||
| 50 | pu blic Strin g getServe rTargetDir ectory() { | |
| 51 | retu rn serverT argetDirec tory; | |
| 52 | } | |
| 53 | ||
| 54 | pu blic void setServerT argetDirec tory(Strin g serverTa rgetDirect ory) { | |
| 55 | this .serverTar getDirecto ry = serve rTargetDir ectory; | |
| 56 | } | |
| 57 | ||
| 58 | pu blic SftpS ervice get SftpServic e() { | |
| 59 | retu rn sftpSer vice; | |
| 60 | } | |
| 61 | ||
| 62 | pu blic void setSftpSer vice(SftpS ervice sft pService) { | |
| 63 | this .sftpServi ce = sftpS ervice; | |
| 64 | } | |
| 65 | ||
| 66 | pu blic SendB illDataSer vice getSe ndBillData Service() { | |
| 67 | retu rn sendBil lDataServi ce; | |
| 68 | } | |
| 69 | ||
| 70 | pu blic void setSendBil lDataServi ce(SendBil lDataServi ce sendBil lDataServi ce) { | |
| 71 | this .sendBillD ataService = sendBil lDataServi ce; | |
| 72 | } | |
| 73 | ||
| 74 | @O verride | |
| 75 | pr otected bo olean exec uteLogic(C hunkContex t chunkCon text) { | |
| 76 | ||
| 77 | bool ean succes sful = tru e; | |
| 78 | ||
| 79 | task letLogger. info("File Completio n Tasklet Running!") ; | |
| 80 | ||
| 81 | // S ave the jo bExecution for refer ence. | |
| 82 | JobE xecution j obExecutio n = chunkC ontext.get StepContex t().getSte pExecution ().getJobE xecution() ; | |
| 83 | ||
| 84 | // O btain the temporary local file path as i t will be needed reg ardless | |
| 85 | // o f failure. | |
| 86 | fina l String s endBillOut putResourc eLocalTemp FilePath = jobExecut ion.getExe cutionCont ext() | |
| 87 | .getStri ng(SEND_BI LL_OUTPUT_ RESOURCE_K EY); | |
| 88 | ||
| 89 | // I f an error getting t he local f ile path t hen just r eturn. | |
| 90 | if ( (sendBillO utputResou rceLocalTe mpFilePath != null) && !sendBi llOutputRe sourceLoca lTempFileP ath.isEmpt y()) { | |
| 91 | ||
| 92 | taskle tLogger.in fo("cbsOut putResourc eLocalTemp FilePath: " + sendBi llOutputRe sourceLoca lTempFileP ath); | |
| 93 | ||
| 94 | } el se { | |
| 95 | ||
| 96 | // Thi s is an un expected a nd unrecov erable err or. | |
| 97 | final String err or = "Coul d not obta in the pat h to the t emporary l ocal outpu t file"; | |
| 98 | setFai lureStatus (jobExecut ion, DATA_ ERROR_STAT US, error) ; | |
| 99 | ||
| 100 | // Ret urn now! | |
| 101 | return false; | |
| 102 | } | |
| 103 | ||
| 104 | // I f the job has been s uccessful then trans fer file t o server a nd | |
| 105 | // a ttempt to set approp riate fina l statemen t and mess age status es. | |
| 106 | if ( !jobExecut ion.getExe cutionCont ext().cont ainsKey(JO B_FAILURE_ KEY)) { | |
| 107 | ||
| 108 | // Get filename values fro m the jobE xecution o r jobParam eters. | |
| 109 | ||
| 110 | // The output fi lename. | |
| 111 | final String sen dBillOutpu tFileName = jobExecu tion.getJo bParameter s() | |
| 112 | .getString (SEND_BILL _OUTPUT_FI LE_NAME_KE Y); | |
| 113 | if ((s endBillOut putFileNam e != null) && !sendB illOutputF ileName.is Empty()) { | |
| 114 | ||
| 115 | taskletL ogger.info ("cbsOutpu tFileName: " + sendB illOutputF ileName); | |
| 116 | ||
| 117 | } else { | |
| 118 | ||
| 119 | // This is an unex pected and unrecover able error . | |
| 120 | final St ring error = "Rollba ck Trigger ed - Could not obtai n the outp ut file na me"; | |
| 121 | setFailu reStatus(j obExecutio n, DATA_ER ROR_STATUS , error); | |
| 122 | ||
| 123 | // Flag to do roll back. | |
| 124 | successf ul = false ; | |
| 125 | } | |
| 126 | ||
| 127 | // The temporary filename used to tr ansfer to the sftp s erver. | |
| 128 | final String sen dBillTarge tTemporary FileName = getTempor aryFilenam e(sendBill OutputFile Name); | |
| 129 | if (su ccessful & & (sendBil lTargetTem poraryFile Name != nu ll)) { | |
| 130 | ||
| 131 | taskletL ogger.info ("cbsTarge tTemporary FileName: " + sendBi llTargetTe mporaryFil eName); | |
| 132 | } else { | |
| 133 | ||
| 134 | // This is an unex pected and unrecover able error . | |
| 135 | final St ring error = "Rollba ck Trigger ed - Could not creat e a tempor ary server filename" ; | |
| 136 | setFailu reStatus(j obExecutio n, DATA_ER ROR_STATUS , error); | |
| 137 | ||
| 138 | // Flag to do roll back. | |
| 139 | successf ul = false ; | |
| 140 | } | |
| 141 | ||
| 142 | // Get latest Pa tAcntBalMs g ID from the jobExe cution con text. | |
| 143 | if(suc cessful) | |
| 144 | { | |
| 145 | final Lo ng msgId = jobExecut ion.getJob Parameters ().getLong (SEND_BILL _ID_KEY); | |
| 146 | ||
| 147 | if ((msg Id == null ) || (msgI d < 1)) { | |
| 148 | ||
| 149 | // This is an unexpe cted and u nrecoverab le error. | |
| 150 | final Stri ng error = "Rollback Triggered - Could n ot obtain a valid me ssage ID: " + msgId; | |
| 151 | setFailure Status(job Execution, DATA_ERRO R_STATUS, error); | |
| 152 | ||
| 153 | // Flag to do rollba ck. | |
| 154 | successful = false; | |
| 155 | } else { | |
| 156 | successful = updateS tatusToCom plete(succ essful, jo bExecution , msgId); | |
| 157 | //Update P atAcntBalM sgID for S ITEBAL - | |
| 158 | sendBillDa taService. updateSite BalPatAcnt BalMsgId(m sgId); | |
| 159 | //Update t otal Numbe r of Patie nts | |
| 160 | taskletLog ger.info(" Number Of Patients L ogged in c ompletion Tasklet: " +jobExecut ion.getExe cutionCont ext().getL ong(TOTAL_ BILL_PATIE NT_DATA_PR OCESSED)); | |
| 161 | sendBillDa taService. updateTota lPatientPr ocessed(jo bExecution .getExecut ionContext ().getLong (TOTAL_BIL L_PATIENT_ DATA_PROCE SSED), msg Id); | |
| 162 | } | |
| 163 | } | |
| 164 | ||
| 165 | // Sen d file wit h temporar y filename (with tim estamp ext ension). | |
| 166 | // Exa mple: | |
| 167 | // 'CB S-06022016 .txt' woul d be tempo rarily sen t as | |
| 168 | // 'CB S-06022016 .txt.<time stamp>.sen dcbs' | |
| 169 | if (su ccessful & & sftpServ ice.ftpFil eToServerW ithName(se ndBillOutp utResource LocalTempF ilePath, | |
| 170 | sendBillTa rgetTempor aryFileNam e, serverT argetDirec tory)) { | |
| 171 | ||
| 172 | taskletL ogger.info ("Sent fil e to serve r sucessfu lly: " + s endBillTar getTempora ryFileName ); | |
| 173 | } else { | |
| 174 | ||
| 175 | // This is an unex pected and unrecover able error . | |
| 176 | final St ring error = "Rollba ck Trigger ed - Unsuc cessful fi le transfe r: " | |
| 177 | + sendBillTa rgetTempor aryFileNam e; | |
| 178 | setFailu reStatus(j obExecutio n, WRITE_F AILURE_STA TUS, error ); | |
| 179 | ||
| 180 | // Flag to do roll back. | |
| 181 | successf ul = false ; | |
| 182 | } | |
| 183 | ||
| 184 | // Ren ame the fi le on the server (by removing the tempor ary | |
| 185 | // '.< timestamp> .sendbill' extension ). | |
| 186 | if (su ccessful & & sftpServ ice.ftpRen ameFileInD irectory(s endBillTar getTempora ryFileName , | |
| 187 | sendBillOu tputFileNa me, server TargetDire ctory)) { | |
| 188 | ||
| 189 | taskletL ogger.info ("Renamed file on se rver suces sfully: " + sendBill OutputFile Name); | |
| 190 | ||
| 191 | } else { | |
| 192 | ||
| 193 | // This is an unex pected and unrecover able error . | |
| 194 | final St ring error = "Rollba ck Trigger ed - Unsuc cessful fi le rename: " + sendB illOutputF ileName; | |
| 195 | setFailu reStatus(j obExecutio n, WRITE_F AILURE_STA TUS, error ); | |
| 196 | ||
| 197 | // Flag to do roll back. | |
| 198 | successf ul = false ; | |
| 199 | } | |
| 200 | ||
| 201 | // Sen d a done f ile to the server. | |
| 202 | final String sen dBillOutpu tDoneFileN ame = getD oneFilenam e(sendBill OutputFile Name); | |
| 203 | if (su ccessful | |
| 204 | && sftpSer vice.ftpEm ptyFileToS erverWithN ame(sendBi llOutputDo neFileName , serverTa rgetDirect ory)) { | |
| 205 | ||
| 206 | taskletL ogger.info ("Transfer done file to server sucessful ly: " + se ndBillOutp utDoneFile Name); | |
| 207 | ||
| 208 | } else { | |
| 209 | ||
| 210 | // This is an unex pected and unrecover able error . | |
| 211 | final St ring error = "Rollba ck Trigger ed - Unsuc cessful do ne file tr ansfer: " | |
| 212 | + sendBillOu tputDoneFi leName; | |
| 213 | setFailu reStatus(j obExecutio n, WRITE_F AILURE_STA TUS, error ); | |
| 214 | ||
| 215 | // Flag to do roll back. | |
| 216 | successf ul = false ; | |
| 217 | } | |
| 218 | ||
| 219 | // If successful then save final sta tistics. | |
| 220 | if (su ccessful) { | |
| 221 | taskletL ogger.info ("Successf ul SFTP!") ; | |
| 222 | // TODO? | |
| 223 | // // Sa ve batch j ob complet ion result s. | |
| 224 | ||
| 225 | } | |
| 226 | } | |
| 227 | ||
| 228 | // R egardless of failure or succes sful batch run, dele te local C BS file | |
| 229 | // i f exists. | |
| 230 | if ( sendBillDa taService. deleteBill DataOutput Resource(s endBillOut putResourc eLocalTemp FilePath)) { | |
| 231 | ||
| 232 | taskle tLogger.in fo("Delete d temporar y local fi le sucessf ully: " + sendBillOu tputResour ceLocalTem pFilePath) ; | |
| 233 | } el se { | |
| 234 | ||
| 235 | // Don 't make th is a failu re in case transfer had alread y been | |
| 236 | // suc cessful. | |
| 237 | taskle tLogger.wa rn("Unable to delete the tempo rary local file: " + sendBillO utputResou rceLocalTe mpFilePath ); | |
| 238 | } | |
| 239 | ||
| 240 | retu rn success ful; | |
| 241 | } | |
| 242 | ||
| 243 | pr ivate bool ean update StatusToCo mplete(boo lean succe ssful, Job Execution jobExecuti on, final Long msgId ) { | |
| 244 | if(s endBillDat aService.s etMessageS tatus(msgI d, Process Status.Sta tus.SUCCES S)) | |
| 245 | { | |
| 246 | taskle tLogger.in fo("Update d message status to success fo r message ID: " + ms gId); | |
| 247 | } | |
| 248 | else | |
| 249 | { | |
| 250 | // Thi s is an un expected a nd unrecov erable err or. | |
| 251 | final String err or = "Roll back Trigg ered - Uns uccessful attempting to update message s tatus to s uccess for message I D: " | |
| 252 | + msgId; | |
| 253 | setFai lureStatus (jobExecut ion, DATA_ ERROR_STAT US, error) ; | |
| 254 | ||
| 255 | // Fla g to do ro llback. | |
| 256 | succes sful = fal se; | |
| 257 | } | |
| 258 | retu rn success ful; | |
| 259 | } | |
| 260 | ||
| 261 | /* * | |
| 262 | * Build a t emporary f ilename fo r use on t he target sftp serve r. The for mat | |
| 263 | * of the te mporary fi lename: Gi ven filena me: 'CBS-0 6022016.tx t' would | |
| 264 | * return te mporary fi lename: 'C BS-0602201 6.txt.<tim estamp>.se ndcbs' | |
| 265 | * | |
| 266 | * @param fi lename | |
| 267 | * The base filename. | |
| 268 | * @return T he tempora ry filenam e. | |
| 269 | * / | |
| 270 | pr ivate Stri ng getTemp oraryFilen ame(final String fil ename) { | |
| 271 | if ( (filename != null) & & !filenam e.isEmpty( )) { | |
| 272 | String Builder te mpFilename = new Str ingBuilder (filename) ; | |
| 273 | tempFi lename.app end("."); | |
| 274 | tempFi lename.app end(TimeUt ils.getTim estamp(TIM ESTAMP_FOR MAT)); | |
| 275 | tempFi lename.app end("."); | |
| 276 | tempFi lename.app end(tempFi lenamePost fix); | |
| 277 | return tempFilen ame.toStri ng(); | |
| 278 | } | |
| 279 | retu rn null; | |
| 280 | } | |
| 281 | ||
| 282 | /* * | |
| 283 | * Get the d one filena me based o n the outp ut filenam e. The don e filename is | |
| 284 | * the same base filen ame but wi th ".don" extension instead of ".txt" | |
| 285 | * | |
| 286 | * @param fi lename | |
| 287 | * The outp ut filenam e. | |
| 288 | * @return T he done fi lename. | |
| 289 | * / | |
| 290 | pr ivate Stri ng getDone Filename(f inal Strin g filename ) { | |
| 291 | ||
| 292 | retu rn filenam e.substrin g(0, filen ame.lastIn dexOf(".tx t")) + ".d on"; | |
| 293 | } | |
| 294 | ||
| 295 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993-2016 Araxis Ltd (www.araxis.com). All rights reserved.