Mainframe COBOL to Java, C# & Cloud

Comparison of COBOL vs. Translated & Refactored Java

In this example, we compare a small COBOL program with Java code generated by the SoftwareMining COBOL Refactoring tool.


COBOL to Java Success Stories

Our primary goal with this example is to showcase the readability and maintainability of the generated code. Please note that this straightforward example does not delve into addressing complex issues like the removal of GO TO statements, elimination of dead code, handling REDEFINEs, CICS, Pointers, and more.

For a comprehensive understanding of addressing these complex challenges, please refer to our guide on Essential Features for Successful COBOL to Java Conversion Projects.

Alternatively, Download and try COBOL to Java Conversion tool to see what your organization's code looks like in Java.

Noteworthy issues:

  1. 01 level COBOL declarations are translated to Data-Access-Objects (DAO) capable of handling REDEFINES, COMPUTATIONAL, OCCURS-DEPENDING, and many other COBOL features (see WS-DATA structure).
  2. The 01 level declarations from FILE-SECTION are translated to Object-Relational-Model (ORM) classes.
  3. The 01 level WORKING-STORAGE definitions used in CICS READ/WRITE statements will also be converted to ORM classes.
  4. The 01 level declarations not referenced will be automatically commented out.
  5. The Translator removes references to unused DAOs and reuses the ones that it can.
  6. The Translator removes many GO TO statements. The SoftwareMining Framework libraries will provide support for the remaining ones.
  7. Batch programs: Translated Java can be run from the command line or from Unix Shell scripts translated from JCL.
  8. Online applications: Translated Java system needs to be deployed on J2EE Application Servers.

COBOL vs Java - Side by side

   
  PROGRAM-ID. LOAN.
  DATA DIVISION.
  FILE SECTION.

  WORKING-STORAGE SECTION.
  01  WS-DATA.
    05 PRINCIPAL          PIC 9(9) VALUE 0.
    05 INTEREST-RATE      PIC 99V99 VALUE 0.
    05 LOAN-LENGTH        PIC 99 VALUE 0.
    05 NEXT-INTEREST      PIC 99V99.
    05 NEXT-YEAR          PIC 99.
  01 CLIENT-RECORD.
    05 NAME               PIC X(20).
    05 ADDRESS            PIC X(20) OCCURS 3 TIMES.
    05 ID                 PIC 9(4) COMP.

  ...
  
 // Sample COBOL to Java translated code

 public class Loan  extends BaseService  {
  
  // Notes: 01 level WS-DATA name is simplified (Optional) 
  // and converted to a DAO
  // The DAO handles REDEFINES, COMP, OCCURS-DEPENDING, ... 
  private WsData data = new WsData(this);
  
  // Client-RECORD has been translated to ClientRecord DAO, 
  // but since the program does not reference ClientRecord, 
  // it will automatically be commented out.
  
  // private ClientRecord clientRecord = new ClientRecord(this);
  
  ...
  
    
  
  
  * Main entry point to program
   LOAN-MAIN-001.
   
  *  -
  * CLEAR SCREEN AND READ DATA
  *  -

       IF LOAN-LENGTH > 4 THEN
          COMPUTE START-YEAR = LOAN-LENGTH - 4
       ELSE
      COMPUTE START-YEAR = 0.

       IF INTEREST-RATE > 0.4 THEN
          COMPUTE START-INTEREST = INTEREST-RATE - 0.4
       ELSE
          COMPUTE START-INTEREST = 0
       END-IF
     
       MOVE 1 TO YEAR-ROW.
     
  *  -
  * GO THRU THE NUMBER OF YEARS
  *  -

       MOVE "% Rate->" TO DSP-NO-YRS(1).
       MOVE START-YEAR TO NEXT-YEAR
       PERFORM VARYING YEAR-ROW FROM 2 BY 1 UNTIL YEAR-ROW = 11
         PERFORM DO-NEXT-ROW
         ADD 1 TO NEXT-YEAR
       END-PERFORM.


  *  -
  *  AND EXIT
  *  -
       STOP RUN.
  
  
 /**
  * Main Entrance to program
  */
  protected void loanMain () {
   
   //   - 
   //  CLEAR SCREEN AND READ DATA 
   //   - 
   if (data.getLoanLength() > 4) {
     data.setStartYear(data.getLoanLength() - 4);
   } else {
     data.setStartYear(0);
   }
   if (data.getInterestRate() > 0.4) {
     data.setStartInterest(data.getInterestRate() - 0.4);
   } else {
     data.setStartInterest(0.0);
   }
   data.setYearRow(1);
   //   - 
   //  GO THRU THE NUMBER OF YEARS 
   //   - 
   displayResult.setNoYrs(0, "% Rate->");
   data.setNextYear(data.getStartYear());
   // initialise loop variable 
   data.setYearRow(2);
   while (data.getYearRow() != 11) {
     doNextRow ();
     data.setNextYear(data.getNextYear() + 1);
     data.setYearRow(data.getYearRow() + 1);
   }
   //   - 
   //   AND EXIT 
   //   - 
   stop();
 }


  * 
  * Calculates values for individual rows
  * 
   DO-NEXT-ROW.

       MOVE START-INTEREST TO NEXT-INTEREST

	   
       PERFORM VARYING INTEREST-COL FROM 1 BY 1
         UNTIL INTEREST-COL = 10
         MOVE NEXT-INTEREST TO DSP-RESULT(1, INTEREST-COL)
         PERFORM CALCULATE
         MOVE NEXT-RESULT TO DSP-RESULT(YEAR-ROW, INTEREST-COL)
         ADD 0.1 TO NEXT-INTEREST
       END-PERFORM.

 /**
  * Calculates values for individual rows
  */
  protected void doNextRow () {
   data.setNextInterest(data.getStartInterest());
   
   data.setInterestCol(1);
   while (data.getInterestCol() != 10) {
     displayResult.setResult(0, data.getInterestCol() - 1
	    , data.getNextInterest());
     calculate();
     displayResult.setResult(data.getYearRow() - 1
		    , data.getInterestCol() - 1, data.getNextResult());
     data.setNextInterest(data.getNextInterest() + 0.1);
     data.setInterestCol(data.getInterestCol() + 1);
   }
 }

  * 
  * The next paragraph calculates CELL values
  * 
   CALCULATE.
       COMPUTE INTDEC = NEXT-INTEREST / (12.0 * 100.0)
       COMPUTE NUMMONTHS = NEXT-YEAR * 12.0
	   ...
   
 /**
  * The next paragraph calculates CELL values
  */
  protected void calculate () {
   data.setIntdec(data.getNextInterest() / (12.0 * 100.0));
   data.setNummonths((double)data.getNextYear() * 12.0);
   ...
 }
 



  © 2024 SoftwareMining is a trademark of Software Modernization Technologies Ltd (UK). Registered in England company no: 07300248. Reg Offices: 79 Stevens House, Jerome Place, Kingston Upon Thames, KT1 1HX, United Kingdom.