Migrated Java Version of AWS COBOL CardDemo for Runtime Execution

CardDemo is an GitHub 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.

Execute CardDemo in Java

SoftwareMining Automatic Conversion Highlights

CardDemo: COBOL, Java, and C# Side-by-Side

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.

BMS Map Views Translated to JSP/HTML

The images below show design-time HTML views of BMS maps. At runtime, Java builds render as JSP; C# builds render as HTML.

BMS mapset Cocrdup.bms, map CCRDUPA

AWS CardDemo Cocrdup CCRDUPA

BMS mapset Coactup.bms, map CACTUPA

AWS CardDemo Coactup CACTUPA

Test drive the Java translation of CardDemo