SKILL.md
COBOL to Java Conversion
Overview
Comprehensive guide for converting COBOL mainframe applications to modern Java, preserving business logic while adopting cloud-native architecture patterns. This skill is specifically tailored for the CardDemo application but provides general best practices applicable to any COBOL modernization effort.
When to Use This Skill
- Converting COBOL online CICS programs to Java Spring Boot REST services
- Migrating COBOL batch programs to Java scheduled jobs or Spring Batch
- Translating COBOL copybooks to Java POJOs
- Migrating VSAM files to SQL databases
- Modernizing DB2/IMS data access to JPA/JDBC
Prerequisites
Knowledge Required
- Understanding of COBOL syntax and mainframe concepts (CICS, VSAM, JCL)
- Java development experience (Spring Boot, JPA, REST APIs)
- Database knowledge (SQL, transactions, data modeling)
Tools Required
- AWS Transform (optional but recommended for automated analysis)
- IDE: IntelliJ IDEA or Eclipse with COBOL plugin
- Build Tools: Maven or Gradle
- Database: PostgreSQL, MySQL, or Oracle
- Testing: JUnit 5, Mockito, Spring Test
Environment Setup
- Clone this repository
- Review
mappings/*.mdfiles for conversion patterns - Install copybook-to-POJO converters (see Tools section)
- Set up local database for testing
Conversion Workflow
Phase 1: Analysis & Planning
1.1 Analyze COBOL Program
# Run analysis script
./scripts/analyze-cobol.sh app/cbl/COSGN00C.cbl
Output includes:
- Program dependencies (COPY statements, CALL statements)
- File I/O operations (VSAM, DB2)
- CICS commands (SEND MAP, RECEIVE, LINK, etc.)
- Complex data structures (REDEFINES, OCCURS)
1.2 Identify Conversion Pattern
Refer to decision tree:
| COBOL Type | Conversion Target | Reference |
|---|---|---|
| CICS Online Transaction | Spring Boot REST Controller | mappings/cics-to-spring.md |
| Batch Program (Sequential) | Spring Batch Job | examples/batch-conversion-example.md |
| Copybook | Java POJO / Record | examples/copybook-conversion-example.md |
| VSAM KSDS | SQL Table with Primary Key | mappings/vsam-to-sql.md |
| DB2 Embedded SQL | JPA Entity / JDBC Template | mappings/data-types.md |
1.3 Review Pre-Conversion Checklist
- Business logic documented
- All dependencies identified
- Test data prepared
- Conversion pattern selected
- Target Java architecture designed
See checklists/pre-conversion.md for complete checklist.
Phase 2: Data Structure Conversion
2.1 Convert Copybooks to POJOs
COBOL Copybook Example:
01 CUSTOMER-RECORD.
05 CUST-ID PIC 9(10).
05 CUST-NAME PIC X(50).
05 CUST-BALANCE PIC S9(13)V99 COMP-3.
05 CUST-STATUS PIC X(01).
Java POJO (Converted):
@Entity
@Table(name = "CUSTOMER")
public class Customer {
@Id
private Long custId;
@Column(length = 50)
private String custName;
@Column(precision = 15, scale = 2)
private BigDecimal custBalance; // Note: BigDecimal for COMP-3
private String custStatus;
// Getters, setters, constructors
}
⚠️ Critical: Data Type Mappings
| COBOL Type | Java Type | Notes |
|---|---|---|
PIC 9(n) |
Long or Integer |
Use Long for n > 9 |
PIC X(n) |
String |
Trim trailing spaces |
PIC S9(n)V99 COMP-3 |
BigDecimal |
Always use BigDecimal for financial data |
PIC S9(n) COMP |
Integer or Long |
Binary integer |
PIC S9(n) COMP-5 |
Long |
Binary long |
See mappings/data-types.md for complete table.
Phase 3: Business Logic Conversion
3.1 CICS Transaction → Spring Boot REST Service
COBOL CICS Program Structure:
IDENTIFICATION DIVISION.
PROGRAM-ID. COSGN00C.
*> Signon transaction
WORKING-STORAGE SECTION.
01 WS-USER-ID PIC X(08).
01 WS-USER-PWD PIC X(08).
PROCEDURE DIVISION.
EXEC CICS RECEIVE MAP('COSGN0A')
MAPSET('COSGN00')
INTO(WS-MAP-AREA)
END-EXEC.
*> Validate user credentials
PERFORM VALIDATE-USER.
*> Read security file
EXEC CICS READ FILE('USRSEC')
RIDFLD(WS-USER-ID)
INTO(WS-USER-RECORD)
END-EXEC.
Converted Java Spring Boot:
@RestController
@RequestMapping("/api/auth")
public class AuthenticationController {
@Autowired
private UserSecurityService userSecurityService;
@PostMapping("/signin")
public ResponseEntity<SigninResponse> signin(
@RequestBody @Valid SigninRequest request) {
// Validate user credentials (business logic preserved)
User user = userSecurityService.validateUser(
request.getUserId(),
request.getPassword()
);
if (user == null) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
.body(new SigninResponse("Invalid credentials"));
}
// Generate token (modern approach vs CICS commarea)
String token = jwtService.generateToken(user);
return ResponseEntity.ok(
new SigninResponse(token, user)
);
}
}
Key Conversion Patterns:
- CICS RECEIVE MAP →
@PostMappingwith@RequestBody - CICS SEND MAP →
ResponseEntitywith JSON - CICS FILE READ → JPA repository
findById() - CICS LINK → Service method call or REST client
- COMMAREA → DTOs passed between methods
See mappings/cics-to-spring.md for complete patterns.
3.2 Batch Program → Spring Batch
COBOL Batch Structure:
PROGRAM-ID. CBTRN02C.
*> Post daily transactions
PROCEDURE DIVISION.
OPEN INPUT DALYTRAN-FILE
OPEN I-O TRANSACT-FILE
PERFORM UNTIL EOF
READ DALYTRAN-FILE
PERFORM PROCESS-TRANSACTION
WRITE TRANSACT-FILE FROM WS-TRANSACTION
END-PERFORM.
Java Spring Batch:
@Configuration
public class TransactionPostingBatchJob {
@Bean
public Job postTransactionsJob(JobRepository jobRepository,
Step processTransactionStep) {
return new JobBuilder("postTransactions", jobRepository)
.start(processTransactionStep)
.build();
}
@Bean
public Step processTransactionStep(
JobRepository jobRepository,
PlatformTransactionManager txManager,
ItemReader<DailyTransaction> reader,
ItemProcessor<DailyTransaction, Transaction> processor,
ItemWriter<Transaction> writer) {
return new StepBuilder("processTransactionStep", jobRepository)
.<DailyTransaction, Transaction>chunk(100, txManager)
.reader(reader) // Read from staging table
.processor(processor) // Business logic
.writer(writer) // Write to main table
.build();
}
}
See examples/batch-conversion-example.md for complete example.
Phase 4: Data Migration
4.1 VSAM to SQL
Refer to mappings/vsam-to-sql.md for:
- Schema design patterns
- Index strategies (KSDS primary key → SQL PRIMARY KEY, AIX → SQL INDEX)
- Data extraction scripts
- Bulk load strategies
4.2 Data Type Transformations
# Use provided script for data migration
python3 scripts/generate-test-data.py \
--copybook app/cpy/CUSTOMER.cpy \
--output test-data.json \
--records 1000
See checklists/data-migration.md for complete process.
Phase 5: Testing & Validation
5.1 Unit Testing
Create equivalent test cases:
@SpringBootTest
class SigninServiceTest {
@Test
void testValidCredentials_Success() {
// Given
String userId = "USER0001";
String password = "PASSWORD";
// When
User user = signinService.authenticate(userId, password);
// Then
assertNotNull(user);
assertEquals(userId, user.getUserId());
}
@Test
void testInvalidPassword_ThrowsException() {
// Test invalid credentials
assertThrows(InvalidCredentialsException.class, () -> {
signinService.authenticate("USER0001", "WRONG");
});
}
}
5.2 Integration Testing
Use TestRestTemplate to test full flow:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SigninControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
void testSigninFlow_EndToEnd() {
SigninRequest request = new SigninRequest("USER0001", "PASSWORD");
ResponseEntity<SigninResponse> response = restTemplate
.postForEntity("/api/auth/signin", request, SigninResponse.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
assertNotNull(response.getBody().getToken());
}
}
5.3 Data Validation
Compare COBOL output vs Java output using provided scripts.
See checklists/post-conversion-validation.md for complete checklist.
Common Pitfalls & Solutions
1. Numeric Precision Loss
❌ Problem:
double balance = 123.45; // Can cause rounding errors
✅ Solution:
BigDecimal balance = new BigDecimal("123.45"); // Precise decimal
2. JOBOL Anti-Pattern
❌ Problem: Direct line-by-line translation
// Bad: Procedural COBOL-style Java
public class SignonProgram {
public void main() {
receiveMap();
if (eibaid == DFHENTER) {
processEnterKey();
}
}
}
✅ Solution: Object-oriented Java
@RestController
public class AuthenticationController {
@PostMapping("/signin")
public ResponseEntity<SigninResponse> signin(@RequestBody SigninRequest req) {
// Clean, RESTful design
}
}
3. Ignoring CICS Transaction Context
⚠️ Remember: CICS is pseudo-conversational. Don't try to maintain server-side state.
✅ Solution: Use JWT tokens or session management
4. EBCDIC Encoding Issues
✅ Solution: Always specify encoding when reading mainframe data:
String data = new String(bytes, Charset.forName("IBM037")); // EBCDIC
See references/common-pitfalls.md for complete list.
AWS Transform Integration
Using AWS Transform for Automated Analysis
# Upload COBOL source to S3
aws s3 cp app/cbl/ s3://my-bucket/cobol-source/ --recursive
# Start AWS Transform project
aws transform create-project \
--name carddemo-modernization \
--source-location s3://my-bucket/cobol-source/
# Get analysis results
aws transform get-analysis --project-id <project-id>
AWS Transform provides:
- Dependency graphs
- Complexity analysis
- Automated refactoring suggestions
- Test case generation
See references/aws-transform-guide.md for setup instructions.
Tools & Resources
Recommended Tools
- Copybook Converters:
- cobol2java-copybook-converter (GitHub: manuelscurti/cobol2java-copybook-converter) - JRecord (GitHub: bmTas/JRecord) - cb2java (Dynamic parser)
- Testing:
- JUnit 5 - Spring Test - TestContainers (for database testing)
- AWS Services:
- AWS Transform - AWS Mainframe Modernization - AWS Blu Age
Reference Documentation
- AWS Mainframe Modernization
- Spring Boot Documentation
- Spring Batch
- COBOL Language Reference (IBM)
Verification Checklist
Before marking conversion complete:
- All business logic tests pass
- Performance meets or exceeds COBOL baseline
- Data integrity validated (checksums, record counts)
- Error handling implemented
- Logging added for troubleshooting
- Security reviewed (authentication, authorization)
- Documentation updated
- Code review completed
- Integration tests pass
- Deployment tested in staging
Examples
See examples/ directory for:
- Complete CICS-to-Spring conversion
- Batch program migration
- Copybook-to-POJO examples
Iterative Approach
Recommended order for CardDemo conversion:
- Phase 1: Data structures (copybooks → POJOs)
- Phase 2: Simple CICS transactions (COSGN00C signon)
- Phase 3: Complex transactions (account updates, transactions)
- Phase 4: Batch programs (statement generation)
- Phase 5: Optional modules (DB2, IMS, MQ)
Each phase allows testing and validation before proceeding.
Support & Collaboration
- Review existing sessions for patterns discovered by team
- Document new patterns in this skill as they emerge
- Update mappings when edge cases are found
- Share learnings via pull requests
Maintenance
This skill should be updated as:
- New COBOL patterns are discovered
- Java best practices evolve
- AWS Transform capabilities expand
- Team identifies additional pitfalls