CardDemo is an
open-source mainframe COBOL/CICS application from Amazon
.
It showcases modernization patterns including migration, testing, and service enablement. The app simulates a credit card system so teams can explore AWS-based strategies.
We used the SoftwareMining translator to convert the CardDemo CICS COBOL code to Java and C#. The Java build runs on AWS and is available below.
The sample (from program "COBIL00C") shows how the ACCOUNT-RECORD used in CICS READ is mapped to Object-Relational classes. It also shows how CICS/BMS fields become typed Field objects supporting operations such as setFocus() and setProtected. See BMS Program Cleanup for details.
READ-ACCTDAT-FILE. EXEC CICS READ DATASET (WS-ACCTDAT-FILE) INTO (ACCOUNT-RECORD) LENGTH (LENGTH OF ACCOUNT-RECORD) RIDFLD (ACCT-ID) KEYLENGTH (LENGTH OF ACCT-ID) UPDATE RESP (WS-RESP-CD) RESP2 (WS-REAS-CD) END-EXEC EVALUATE WS-RESP-CD WHEN DFHRESP(NORMAL) CONTINUE WHEN DFHRESP(NOTFND) MOVE 'Y' TO WS-ERR-FLG MOVE 'Account ID NOT found...' TO WS-MESSAGE MOVE -1 TO ACTIDINL OF COBIL0AI PERFORM SEND-BILLPAY-SCREEN WHEN OTHER DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD MOVE 'Y' TO WS-ERR-FLG MOVE 'Unable to lookup Account...' TO WS-MESSAGE MOVE -1 TO ACTIDINL OF COBIL0AI PERFORM SEND-BILLPAY-SCREEN END-EVALUATE.
private void readAcctdatFile() {
accountRecord.assignKeyLength(accountRecord.getAcctId().lengthOf());
accountRecord.assignResponseCodeField(variables.getWsRespCd());
accountRecord.read();
variables.setReasCd(accountRecord.getResponse2Code());
if (variables.getWsRespCd() == CicsCodes.NORMAL) {
// ok
} else if (variables.getWsRespCd() == CicsCodes.NOTFND) {
variables.setErrFlg("Y");
variables.setMessage("Account ID NOT found...");
cobil0ai.getActidin().setFocus();
sendBillpayScreen();
} else {
DisplayHelper.display(this, "RESP:" + variables.getWsRespCdAsStr()
+ " REAS:" + variables.getReasCdAsStr());
variables.setErrFlg("Y");
variables.setMessage("Unable to lookup Account...");
cobil0ai.getActidin().setFocus();
sendBillpayScreen();
}
}
private void ReadAcctdatFile() {
accountRecord.AssignKeyLength(accountRecord.AcctId.LengthOf());
accountRecord.AssignResponseCodeField(variables.WsRespCd);
accountRecord.Read()();
variables.ReasCd = accountRecord.GetResponse2Code();
if (variables.WsRespCd == CicsCodes.NORMAL) {
// ok
} else if (variables.WsRespCd == CicsCodes.NOTFND) {
variables.ErrFlg = "Y";
variables.Message = "Account ID NOT found...";
cobil0ai.Actidin.SetFocus();
SendBillpayScreen();
} else {
DisplayHelper.Display(this, "RESP:" + variables.WsRespCd
+ " REAS:" + variables.ReasCd);
variables.ErrFlg = "Y";
variables.Message = "Unable to lookup Account...";
cobil0ai.Actidin.SetFocus();
SendBillpayScreen();
}
}
This example shows OR mapping for ACCOUNT-RECORD and conversion of BMS fields to typed UI fields (for example, setFocus and setProtected). See the full guide: BMS Program Cleanup.
The images below show design-time HTML views of BMS maps. At runtime, Java builds render as JSP; C# builds render as HTML.