
Fujitsu Mainframe
- 18 installs
- 14 repo stars
- Updated January 23, 2026
- dauquangthanh/hanoi-rainbow
fujitsu-mainframe is a Hanoi Rainbow agent skill that analyzes Fujitsu mainframe COBOL, JCL, and SYMFOWARE assets so developers can plan and implement migrations to Java and cloud platforms.
About
The fujitsu-mainframe skill from Hanoi Rainbow guides analysis and migration of Fujitsu mainframe estates including FACOM, BS2000/OSD, OSIV, NetCOBOL, PowerCOBOL, Fujitsu JCL, and SYMFOWARE toward Java and cloud platforms. It walks through asset discovery, structure extraction, dependency mapping, and migration strategy documentation with reference patterns for COBOL-to-JPA and JCL-to-orchestration. Reach for it when you are modernizing Fujitsu legacy codebases and need agent-assisted parsing, mapping, and target architecture plans rather than generic cloud trivia.
- Parses NetCOBOL, PowerCOBOL, Fujitsu JCL, and SYMFOWARE SQL
- Maps SAM, PAM, ISAM, and GDG files to Java and database equivalents
- Builds dependency graphs for CALL chains, copybooks, and JCL sequences
- Produces Spring Boot and Kubernetes migration patterns from references
Fujitsu Mainframe by the numbers
- 18 all-time installs (skills.sh)
- Ranked #821 of 1,039 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dauquangthanh/hanoi-rainbow --skill fujitsu-mainframeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 18 |
|---|---|
| repo stars | ★ 14 |
| Last updated | January 23, 2026 |
| Repository | dauquangthanh/hanoi-rainbow ↗ |
How do you extract business logic and dependencies from Fujitsu mainframe programs before replatforming to Java or cloud?
Analyzes Fujitsu FACOM, BS2000, NetCOBOL, JCL, and SYMFOWARE assets and plans migration to Java, Spring Boot, and cloud-native deployments.
Who is it for?
Developers and architects modernizing Fujitsu FACOM, BS2000, or OSIV workloads who already have COBOL, JCL, or SDF sources in the workspace.
Skip if: Greenfield projects with no Fujitsu legacy assets or teams that only need generic cloud provisioning without mainframe source.
When should I use this skill?
Users mention Fujitsu mainframe migration, NetCOBOL, PowerCOBOL, Fujitsu JCL, SYMFOWARE, or FACOM modernization tasks.
What you get
Migration strategy notes, dependency maps, and Java or cloud target designs aligned to the skill reference frameworks.
Files
Fujitsu Mainframe Analyzer
Analyze and migrate Fujitsu mainframe systems (FACOM, BS2000/OSD, OSIV, NetCOBOL, PowerCOBOL, Fujitsu JCL, SYMFOWARE) to modern Java/cloud platforms.
Core Capabilities
1. Fujitsu COBOL Analysis
Extract NetCOBOL/PowerCOBOL programs, Fujitsu-specific verbs, proprietary file organizations (SAM/PAM/ISAM), SYMFOWARE embedded SQL, screen handling (ACCEPT/DISPLAY with CRT STATUS).
2. Fujitsu JCL Analysis
Parse JOB statements, STEP definitions, ASSIGN/FILEDEF statements, conditional execution, cataloged procedures, resource allocation.
3. BS2000/OSD System Analysis
Analyze ENTER statements, system commands, file handling (PAM, SAM, ISAM), job variables, SDF processing.
4. SYMFOWARE Database Migration
Extract embedded SQL, schemas, stored procedures, transactions. Migrate to PostgreSQL, Oracle, or SQL Server.
5. Migration to Modern Platforms
Generate Spring Boot microservices, REST APIs, cloud-native apps (AWS, Azure, GCP), containerized deployments (Docker, Kubernetes), CI/CD pipelines.
Workflow
Step 1: Discover Assets
find . -name "*.cbl" -o -name "*.CBL" -o -name "*.cob" # COBOL
find . -name "*.ncb" -o -name "*.NCB" # NetCOBOL
find . -name "*.fjcl" -o -name "*.jcl" # JCL
find . -name "*.cpy" -o -name "*.CPY" # Copybooks
find . -name "*.sdf" -o -name "*.SDF" # SDF filesStep 2: Analyze Structure
Extract divisions, data structures, file definitions, screen definitions, embedded SQL, Fujitsu-specific extensions. Key features:
- File organization: SEQUENTIAL, RELATIVE, INDEXED
- Screen handling: CRT STATUS, screen control
- Database: SYMFOWARE SQL
- Fujitsu verbs: ACCEPT OMITTED, INSPECT extensions
- Error handling: FILE STATUS, DECLARATIVES
Step 3: Map Dependencies
Build graphs: CALL hierarchies, copybook usage, file dependencies (FACOM), database access (SYMFOWARE), JCL sequences, screen definitions.
Step 4: Create Migration Strategy
Document architecture, Fujitsu-specific features, Java/cloud design, data migration, roadmap. Load `references/migration-strategy.md` for detailed framework.
Fujitsu-Specific Features
NetCOBOL Extensions
- Windowing, GUI support (PowerCOBOL)
- Enhanced ACCEPT/DISPLAY with positioning
- Object-oriented: CLASS definitions
- Extended exception handling
SYMFOWARE Database
- Embedded SQL: SELECT, INSERT, UPDATE, DELETE
- Cursors: DECLARE, OPEN, FETCH, CLOSE
- Transactions: COMMIT, ROLLBACK
- Migration: SYMFOWARE → PostgreSQL (cost), Oracle (enterprise), SQL Server
File Systems
| Type | Description | Java Equivalent |
|---|---|---|
| SAM | Sequential | BufferedReader/Writer |
| PAM | Partitioned | File directory |
| ISAM | Indexed | Database with index |
| GDG | Versioned | Timestamp naming |
Quick Patterns
COBOL → Java Spring Boot
Load `references/migration-patterns.md` for detailed examples. Quick overview:
Fujitsu COBOL:
SELECT EMPFILE ASSIGN TO "EMPDATA"
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS EMP-IDJava JPA:
@Entity
@Table(name = "employees")
public class Employee {
@Id
private Integer empId;
private String empName;
private BigDecimal empSalary;
}JCL → Shell + Kubernetes
Fujitsu JCL:
//STEP010 EXEC PGM=VALIDATE
//STEP020 EXEC PGM=PROCESS,COND=(0,EQ,STEP010)Shell:
./validate && ./processLoad `references/migration-patterns.md` for Kubernetes CronJob examples.
Data Type Mappings
Load `references/data-mappings.md` for comprehensive tables. Critical mappings:
| Fujitsu COBOL | Java | Notes |
|---|---|---|
PIC 9(n) | int, long, BigInteger | Size dependent |
PIC S9(n)V9(m) | BigDecimal | ALWAYS for decimals |
PIC X(n) | String | Alphanumeric |
COMP-3 | BigDecimal | NEVER float/double |
OCCURS n | List<T> | Prefer List over array |
| SYMFOWARE | PostgreSQL |
|---|---|
CHAR(n) | CHAR(n) |
VARCHAR(n) | VARCHAR(n) |
DECIMAL(p,s) | NUMERIC(p,s) |
TIMESTAMP | TIMESTAMP WITH TIME ZONE |
BLOB | BYTEA |
CLOB | TEXT |
Migration Strategies
Strangler Fig Pattern (Recommended)
Gradually replace functionality. Lower risk, learn and adjust. Load `references/migration-strategy.md` for detailed steps.
Big Bang
Complete rewrite, single cutover. Higher risk, clean architecture. For smaller systems.
Hybrid
Core services modernized first, periphery later. Balanced risk/reward.
Output Requirements
Analysis Report Structure
1. Executive Summary - Overview, business impact, recommendation 2. Current State - Inventory, architecture, technology, dependencies 3. Fujitsu Features - NetCOBOL/PowerCOBOL, SYMFOWARE, file systems, screens, JCL 4. Target Design - Architecture, tech stack, microservices, data model, APIs 5. Migration Plan - Approach, timeline, resources, risks, costs 6. Technical Appendix - Code samples, mappings, utilities, testing
Load `references/migration-strategy.md` for complete frameworks and templates.
Critical Best Practices
1. ALWAYS use BigDecimal for COMP-3 and decimals (NEVER float/double) 2. Preserve business logic - understand before changing 3. Test with production data - validate conversions 4. Document Fujitsu extensions - proprietary features need special handling 5. Plan parallel run - compare outputs before cutover 6. Automate testing - regression suite for validation 7. Monitor everything - logging, metrics, alerts 8. Security first - authentication, authorization, encryption
Common Challenges & Solutions
Fujitsu-Specific Features → Custom adapters, equivalent libraries, re-implementation Screen Handling → User requirements gathering, modern UX design File Processing → ETL tools, Spring Batch Performance → Caching (Redis), async processing, DB optimization Transactions → Spring @Transactional, Saga pattern
Reference Files
When detailed information needed:
- `references/migration-patterns.md` - Complete code examples for all migration patterns
- `references/data-mappings.md` - Comprehensive type mappings, REDEFINES, dates, best practices
- `references/migration-strategy.md` - Full framework: assessment, design, testing, cutover, costs
Load these files for in-depth guidance on specific topics.
Fujitsu Mainframe Data Type Mappings
Comprehensive mapping guide for converting Fujitsu mainframe data types to modern platforms.
Fujitsu COBOL to Java Type Mapping
| Fujitsu COBOL | Java Type | Notes | Example |
|---|---|---|---|
PIC 9(n) where n ≤ 9 | int | Unsigned numeric | PIC 9(6) → int |
PIC 9(n) where n ≤ 18 | long | Unsigned numeric | PIC 9(12) → long |
PIC 9(n) where n > 18 | BigInteger | Large unsigned | PIC 9(25) → BigInteger |
PIC S9(n) where n ≤ 9 | int | Signed numeric | PIC S9(6) → int |
PIC S9(n) where n ≤ 18 | long | Signed numeric | PIC S9(12) → long |
PIC S9(n)V9(m) | BigDecimal | Decimal with precision | PIC S9(7)V99 → BigDecimal(9,2) |
PIC 9(n)V9(m) | BigDecimal | Unsigned decimal | PIC 9(5)V99 → BigDecimal(7,2) |
PIC X(n) | String | Alphanumeric | PIC X(30) → String |
PIC A(n) | String | Alphabetic only | PIC A(20) → String |
PIC N(n) | String | National (Unicode) | PIC N(10) → String |
COMP / BINARY | int, long | Binary integer | Size dependent |
COMP-1 | float | Single precision | Use with caution |
COMP-2 | double | Double precision | Use with caution |
COMP-3 / PACKED-DECIMAL | BigDecimal | Packed decimal | Always use BigDecimal |
COMP-5 | int, long | Binary (Fujitsu) | Native binary |
POINTER | Reference/Object | Object reference | Context dependent |
OCCURS n | List<T>, T[] | Arrays/tables | Prefer List<T> |
OCCURS DEPENDING ON | List<T> | Variable arrays | Use dynamic list |
Critical Notes
1. Never use `float` or `double` for monetary values - always use BigDecimal 2. COMP-3 must be BigDecimal - financial calculations require precision 3. Preserve precision - don't lose decimal places during conversion 4. Unicode handling - PIC N requires proper encoding
SYMFOWARE to PostgreSQL Type Mapping
| SYMFOWARE Type | PostgreSQL Type | Notes | Size Limits |
|---|---|---|---|
CHAR(n) | CHAR(n) | Fixed length, space-padded | 1-10485760 |
VARCHAR(n) | VARCHAR(n) | Variable length | 1-10485760 |
NCHAR(n) | CHAR(n) | National char | 1-5242880 |
NVARCHAR(n) | VARCHAR(n) | National varchar | 1-5242880 |
INTEGER | INTEGER | 32-bit signed integer | -2147483648 to 2147483647 |
SMALLINT | SMALLINT | 16-bit signed integer | -32768 to 32767 |
BIGINT | BIGINT | 64-bit signed integer | Large range |
DECIMAL(p,s) | NUMERIC(p,s) | Exact numeric | p: 1-1000, s: 0-p |
NUMERIC(p,s) | NUMERIC(p,s) | Exact numeric | Same as DECIMAL |
REAL | REAL | Single precision float | 6 decimal digits |
FLOAT | DOUBLE PRECISION | Double precision float | 15 decimal digits |
DOUBLE PRECISION | DOUBLE PRECISION | Double precision float | 15 decimal digits |
DATE | DATE | Date only (YYYY-MM-DD) | 4713 BC to 5874897 AD |
TIME | TIME | Time without timezone | HH:MI:SS |
TIME WITH TIME ZONE | TIME WITH TIME ZONE | Time with timezone | |
TIMESTAMP | TIMESTAMP | Date and time | No timezone |
TIMESTAMP WITH TIME ZONE | TIMESTAMP WITH TIME ZONE | Date/time with zone | Recommended |
INTERVAL | INTERVAL | Time interval | Year/month/day/time |
BOOLEAN | BOOLEAN | True/false | PostgreSQL native |
BLOB | BYTEA | Binary large object | Up to 1GB |
CLOB | TEXT | Character large object | Unlimited |
NCLOB | TEXT | National CLOB | Unlimited |
BINARY(n) | BYTEA | Fixed binary | Fixed size |
VARBINARY(n) | BYTEA | Variable binary | Variable size |
PostgreSQL Advantages
1. TEXT vs VARCHAR: PostgreSQL's TEXT has no performance penalty 2. SERIAL types: Use SERIAL, BIGSERIAL for auto-increment 3. Arrays: PostgreSQL native array support: INTEGER[], TEXT[] 4. JSON: JSON and JSONB for semi-structured data 5. UUID: Native UUID type for globally unique identifiers
File System to Database Mapping
Fujitsu File Organizations
| Fujitsu File Type | Description | Modern Equivalent | Implementation |
|---|---|---|---|
| SAM (Sequential Access) | Sequential file processing | Sequential processing | BufferedReader/BufferedWriter |
| PAM (Partitioned Access) | Directory with members | File system directory | Files.list(), Files.walk() |
| ISAM (Indexed Sequential) | Indexed file access | Database table with index | JPA Entity with @Index |
| VSAM KSDS | Key-sequenced dataset | DB table primary key | @Id field in JPA |
| VSAM ESDS | Entry-sequenced dataset | DB table auto-increment | @GeneratedValue |
| VSAM RRDS | Relative record dataset | Array/list-like access | Rare; use indexed table |
| GDG (Generation Data Group) | Versioned datasets | Version control files | Timestamp-based naming |
Migration Strategy by File Type
Sequential Files (SAM):
// Option 1: Keep as file for batch processing
Files.lines(Paths.get("input.dat"))
.map(this::parseRecord)
.forEach(this::processRecord);
// Option 2: Load into database
@BatchSize(1000)
List<Record> records = readRecordsFromFile();
repository.saveAll(records);Indexed Files (ISAM):
// Always migrate to database table
@Entity
@Table(name = "indexed_data", indexes = {
@Index(name = "idx_key", columnList = "recordKey")
})
public class IndexedData {
@Id
private String recordKey;
private String data;
}Partitioned Files (PAM):
// Option 1: Keep as files
Path directory = Paths.get("members");
Files.list(directory).forEach(this::processMember);
// Option 2: Store in database with member name
@Entity
public class Member {
@Id
private String memberName;
@Lob
private String content;
}COBOL Data Structures to Java Classes
Simple Record
COBOL:
01 CUSTOMER-RECORD.
05 CUST-ID PIC 9(8).
05 CUST-NAME PIC X(40).
05 CUST-BALANCE PIC S9(9)V99 COMP-3.
05 CUST-STATUS PIC X.Java:
@Entity
@Table(name = "customers")
public class CustomerRecord {
@Id
@Column(name = "cust_id")
private Integer custId;
@Column(name = "cust_name", length = 40)
private String custName;
@Column(name = "cust_balance", precision = 11, scale = 2)
private BigDecimal custBalance;
@Column(name = "cust_status", length = 1)
private String custStatus;
}Nested Structure
COBOL:
01 ORDER-RECORD.
05 ORDER-ID PIC 9(10).
05 CUSTOMER-INFO.
10 CUST-ID PIC 9(8).
10 CUST-NAME PIC X(30).
05 ORDER-DATE PIC X(8).
05 ORDER-TOTAL PIC 9(9)V99.Java:
@Embeddable
public class CustomerInfo {
@Column(name = "cust_id")
private Integer custId;
@Column(name = "cust_name", length = 30)
private String custName;
}
@Entity
@Table(name = "orders")
public class OrderRecord {
@Id
@Column(name = "order_id")
private Long orderId;
@Embedded
private CustomerInfo customerInfo;
@Column(name = "order_date", length = 8)
private String orderDate; // Or use LocalDate
@Column(name = "order_total", precision = 11, scale = 2)
private BigDecimal orderTotal;
}Array/Table (OCCURS)
COBOL:
01 MONTHLY-SALES-RECORD.
05 YEAR PIC 9(4).
05 MONTHLY-DATA OCCURS 12 TIMES.
10 MONTH PIC 99.
10 SALES-AMOUNT PIC 9(9)V99.Java (Separate Entity):
@Entity
@Table(name = "monthly_sales")
public class MonthlySalesRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "year")
private Integer year;
@OneToMany(mappedBy = "salesRecord", cascade = CascadeType.ALL)
private List<MonthlyData> monthlyData;
}
@Entity
@Table(name = "monthly_data")
public class MonthlyData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "month")
private Integer month;
@Column(name = "sales_amount", precision = 11, scale = 2)
private BigDecimal salesAmount;
@ManyToOne
@JoinColumn(name = "sales_record_id")
private MonthlySalesRecord salesRecord;
}REDEFINES (Union Types)
COBOL:
01 TRANSACTION-RECORD.
05 TRANS-TYPE PIC X.
05 TRANS-DATA PIC X(50).
05 PAYMENT-DATA REDEFINES TRANS-DATA.
10 PAYMENT-AMT PIC 9(7)V99.
10 PAYMENT-DATE PIC X(8).
10 FILLER PIC X(33).
05 REFUND-DATA REDEFINES TRANS-DATA.
10 REFUND-AMT PIC 9(7)V99.
10 REFUND-DATE PIC X(8).
10 REASON PIC X(33).Java (Separate View Classes):
@Entity
@Table(name = "transactions")
public class TransactionRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "trans_type", length = 1)
private String transType;
@Column(name = "trans_data", length = 50)
private String transData;
// View as payment
public PaymentView asPayment() {
return new PaymentView(this.transData);
}
// View as refund
public RefundView asRefund() {
return new RefundView(this.transData);
}
}
public class PaymentView {
private BigDecimal paymentAmt;
private String paymentDate;
public PaymentView(String transData) {
// Parse transData into payment fields
}
}
public class RefundView {
private BigDecimal refundAmt;
private String refundDate;
private String reason;
public RefundView(String transData) {
// Parse transData into refund fields
}
}Date and Time Conversions
COBOL Date Formats to Java
| COBOL Format | Example | Java Type | Conversion |
|---|---|---|---|
PIC 9(8) (YYYYMMDD) | 20260115 | LocalDate | LocalDate.parse("20260115", DateTimeFormatter.ofPattern("yyyyMMdd")) |
PIC 9(6) (YYMMDD) | 260115 | LocalDate | Handle century properly |
PIC X(10) (YYYY-MM-DD) | 2026-01-15 | LocalDate | LocalDate.parse("2026-01-15") |
PIC 9(6) (HHMMSS) | 143025 | LocalTime | LocalTime.parse("143025", DateTimeFormatter.ofPattern("HHmmss")) |
PIC 9(14) (YYYYMMDDHHMMSS) | 20260115143025 | LocalDateTime | Combined parsing |
Date Arithmetic
COBOL:
COMPUTE WS-DAYS = FUNCTION INTEGER-OF-DATE(WS-END-DATE)
- FUNCTION INTEGER-OF-DATE(WS-START-DATE)Java:
long days = ChronoUnit.DAYS.between(startDate, endDate);Best Practices
1. Always use BigDecimal for money - never float/double 2. Use appropriate precision - match COBOL precision in database 3. Handle nulls properly - COBOL spaces vs Java null 4. Validate conversions - test with production data samples 5. Document mappings - create mapping tables for team reference 6. Consider performance - index columns used in WHERE clauses 7. Use constraints - NOT NULL, CHECK, FOREIGN KEY 8. Plan for Unicode - UTF-8 encoding throughout 9. Version control schemas - use Liquibase/Flyway 10. Test boundaries - max values, min values, edge cases
Fujitsu Mainframe Migration Patterns
Detailed migration examples and patterns for converting Fujitsu mainframe applications to modern platforms.
Pattern 1: Fujitsu COBOL to Java Spring Boot
Fujitsu COBOL Program Example
IDENTIFICATION DIVISION.
PROGRAM-ID. EMPMAINT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPFILE ASSIGN TO "EMPDATA"
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS EMP-ID
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD EMPFILE.
01 EMP-RECORD.
05 EMP-ID PIC 9(6).
05 EMP-NAME PIC X(30).
05 EMP-SALARY PIC 9(7)V99.
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC XX.
PROCEDURE DIVISION.
OPEN INPUT EMPFILE
MOVE 123456 TO EMP-ID
READ EMPFILE KEY IS EMP-ID
INVALID KEY
DISPLAY "EMPLOYEE NOT FOUND"
NOT INVALID KEY
DISPLAY EMP-NAME
END-READ
CLOSE EMPFILE
STOP RUN.Modern Java Spring Boot Implementation
Entity:
@Entity
@Table(name = "employees")
public class Employee {
@Id
private Integer empId;
@Column(length = 30)
private String empName;
@Column(precision = 9, scale = 2)
private BigDecimal empSalary;
// Constructors, getters, setters
}Repository:
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
}Service:
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository repository;
public Employee findEmployee(Integer empId) {
return repository.findById(empId)
.orElseThrow(() -> new EmployeeNotFoundException("Employee not found: " + empId));
}
}Controller:
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService service;
@GetMapping("/{empId}")
public ResponseEntity<Employee> getEmployee(@PathVariable Integer empId) {
Employee employee = service.findEmployee(empId);
return ResponseEntity.ok(employee);
}
}Pattern 2: Fujitsu JCL to Shell Script + Kubernetes
Fujitsu JCL Example
//DAILYJOB JOB (ACCT123),'DAILY PROCESS',CLASS=A,MSGCLASS=X
//STEP010 EXEC PGM=VALIDATE
//INFILE ASSIGN DSN=INPUT.DAILY.DATA,DISP=SHR
//OUTFILE ASSIGN DSN=VALID.DATA,DISP=(NEW,CATLG)
//STEP020 EXEC PGM=PROCESS,COND=(0,EQ,STEP010)
//INFILE ASSIGN DSN=VALID.DATA,DISP=SHR
//OUTFILE ASSIGN DSN=PROCESSED.DATA,DISP=(NEW,CATLG)
//STEP030 EXEC PGM=REPORT
//INFILE ASSIGN DSN=PROCESSED.DATA,DISP=SHRModern Shell Script
#!/bin/bash
set -e
LOG_FILE="/var/log/daily_job_$(date +%Y%m%d).log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
# Step 1: Validate
log "Starting validation..."
./validate --input="input_daily_data.csv" --output="valid_data.csv"
validate_rc=$?
if [ $validate_rc -ne 0 ]; then
log "Validation failed with RC=$validate_rc"
exit $validate_rc
fi
# Step 2: Process (only if validation succeeded)
log "Starting processing..."
./process --input="valid_data.csv" --output="processed_data.csv"
process_rc=$?
if [ $process_rc -ne 0 ]; then
log "Processing failed with RC=$process_rc"
exit $process_rc
fi
# Step 3: Generate report
log "Generating report..."
./report --input="processed_data.csv" --output="daily_report.pdf"
log "Job completed successfully"Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-job
namespace: production
spec:
schedule: "0 2 * * *" # Run at 2 AM daily
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
containers:
- name: daily-job
image: company/daily-job:latest
command: ["/scripts/daily_job.sh"]
env:
- name: ENV
value: "production"
volumeMounts:
- name: data-volume
mountPath: /data
- name: logs-volume
mountPath: /var/log
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: data-pvc
- name: logs-volume
persistentVolumeClaim:
claimName: logs-pvc
restartPolicy: OnFailurePattern 3: SYMFOWARE SQL to PostgreSQL with JPA
SYMFOWARE Embedded SQL
EXEC SQL
DECLARE EMP_CURSOR CURSOR FOR
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEES
WHERE DEPT_ID = :WS-DEPT-ID
ORDER BY EMP_NAME
END-EXEC.
EXEC SQL OPEN EMP_CURSOR END-EXEC.
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH EMP_CURSOR INTO :EMP-ID, :EMP-NAME, :SALARY
END-EXEC
IF SQLCODE = 0
PERFORM PROCESS-EMPLOYEE
END-IF
END-PERFORM.
EXEC SQL CLOSE EMP_CURSOR END-EXEC.Java JPA/Spring Data
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("SELECT e FROM Employee e WHERE e.deptId = :deptId ORDER BY e.empName")
List<Employee> findByDeptIdOrderByEmpName(@Param("deptId") Integer deptId);
// Using method naming convention
List<Employee> findByDeptIdOrderByEmpNameAsc(Integer deptId);
}
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository repository;
@Transactional(readOnly = true)
public void processEmployeesByDept(Integer deptId) {
List<Employee> employees = repository.findByDeptIdOrderByEmpName(deptId);
employees.forEach(this::processEmployee);
}
private void processEmployee(Employee employee) {
// Business logic here
System.out.println("Processing: " + employee.getEmpName());
}
}Pattern 4: Screen Handling - Terminal to Web
Fujitsu COBOL Screen Definition
01 EMPLOYEE-SCREEN.
05 BLANK SCREEN.
05 LINE 01 COLUMN 01 VALUE "*** EMPLOYEE MAINTENANCE ***".
05 LINE 03 COLUMN 01 VALUE "Employee ID: ".
05 LINE 03 COLUMN 15 PIC 9(6) TO EMP-ID.
05 LINE 05 COLUMN 01 VALUE "Name: ".
05 LINE 05 COLUMN 15 PIC X(30) TO EMP-NAME.
05 LINE 07 COLUMN 01 VALUE "Salary: ".
05 LINE 07 COLUMN 15 PIC Z(7)9.99 TO EMP-SALARY.
05 LINE 10 COLUMN 01 VALUE "F1=Help F3=Exit F5=Refresh F8=Update".
PROCEDURE DIVISION.
DISPLAY EMPLOYEE-SCREEN.
ACCEPT EMPLOYEE-SCREEN.Modern Web UI with React
import React, { useState } from 'react';
import axios from 'axios';
const EmployeeMaintenance = () => {
const [employee, setEmployee] = useState({
empId: '',
empName: '',
empSalary: ''
});
const handleChange = (e) => {
setEmployee({
...employee,
[e.target.name]: e.target.value
});
};
const handleSubmit = async (e) => {
e.preventDefault();
try {
const response = await axios.put(
`/api/employees/${employee.empId}`,
employee
);
alert('Employee updated successfully');
} catch (error) {
alert('Error updating employee: ' + error.message);
}
};
return (
<div className="container">
<h1>*** EMPLOYEE MAINTENANCE ***</h1>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label>Employee ID:</label>
<input
type="number"
name="empId"
value={employee.empId}
onChange={handleChange}
maxLength={6}
required
/>
</div>
<div className="form-group">
<label>Name:</label>
<input
type="text"
name="empName"
value={employee.empName}
onChange={handleChange}
maxLength={30}
required
/>
</div>
<div className="form-group">
<label>Salary:</label>
<input
type="number"
name="empSalary"
value={employee.empSalary}
onChange={handleChange}
step="0.01"
required
/>
</div>
<div className="button-group">
<button type="button" onClick={() => window.showHelp()}>
F1 - Help
</button>
<button type="button" onClick={() => window.close()}>
F3 - Exit
</button>
<button type="button" onClick={() => window.location.reload()}>
F5 - Refresh
</button>
<button type="submit">F8 - Update</button>
</div>
</form>
</div>
);
};
export default EmployeeMaintenance;Pattern 5: Batch Processing - File to Database
Fujitsu COBOL Batch File Processing
IDENTIFICATION DIVISION.
PROGRAM-ID. BATCHLOAD.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE ASSIGN TO "DATAFILE"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-INPUT-STATUS.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE.
01 INPUT-RECORD.
05 IN-CUST-ID PIC 9(8).
05 IN-CUST-NAME PIC X(40).
05 IN-AMOUNT PIC 9(9)V99.
WORKING-STORAGE SECTION.
01 WS-INPUT-STATUS PIC XX.
01 WS-RECORD-COUNT PIC 9(7) VALUE 0.
01 WS-ERROR-COUNT PIC 9(7) VALUE 0.
PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE
PERFORM UNTIL WS-INPUT-STATUS NOT = '00'
READ INPUT-FILE
AT END
CONTINUE
NOT AT END
PERFORM PROCESS-RECORD
END-READ
END-PERFORM
CLOSE INPUT-FILE
DISPLAY 'PROCESSED: ' WS-RECORD-COUNT
DISPLAY 'ERRORS: ' WS-ERROR-COUNT
STOP RUN.
PROCESS-RECORD.
ADD 1 TO WS-RECORD-COUNT
EXEC SQL
INSERT INTO CUSTOMERS (CUST_ID, CUST_NAME, AMOUNT)
VALUES (:IN-CUST-ID, :IN-CUST-NAME, :IN-AMOUNT)
END-EXEC
IF SQLCODE NOT = 0
ADD 1 TO WS-ERROR-COUNT
DISPLAY 'ERROR ON RECORD: ' IN-CUST-ID
END-IF.Modern Spring Batch
@Configuration
@EnableBatchProcessing
public class BatchLoadConfiguration {
@Bean
public Job batchLoadJob(JobBuilderFactory jobBuilderFactory,
Step batchLoadStep) {
return jobBuilderFactory.get("batchLoadJob")
.incrementer(new RunIdIncrementer())
.flow(batchLoadStep)
.end()
.build();
}
@Bean
public Step batchLoadStep(StepBuilderFactory stepBuilderFactory,
ItemReader<Customer> reader,
ItemProcessor<Customer, Customer> processor,
ItemWriter<Customer> writer) {
return stepBuilderFactory.get("batchLoadStep")
.<Customer, Customer>chunk(1000)
.reader(reader)
.processor(processor)
.writer(writer)
.faultTolerant()
.skipLimit(100)
.skip(DataIntegrityViolationException.class)
.listener(new JobExecutionListener() {
@Override
public void beforeJob(JobExecution jobExecution) {
log.info("Starting batch job");
}
@Override
public void afterJob(JobExecution jobExecution) {
log.info("Batch job completed");
log.info("Records processed: " + jobExecution.getStepExecutions()
.iterator().next().getWriteCount());
log.info("Errors: " + jobExecution.getStepExecutions()
.iterator().next().getSkipCount());
}
})
.build();
}
@Bean
public FlatFileItemReader<Customer> reader() {
return new FlatFileItemReaderBuilder<Customer>()
.name("customerReader")
.resource(new ClassPathResource("datafile.txt"))
.delimited()
.names("custId", "custName", "amount")
.fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
setTargetType(Customer.class);
}})
.build();
}
@Bean
public ItemProcessor<Customer, Customer> processor() {
return customer -> {
// Validation logic
if (customer.getCustId() == null || customer.getCustName() == null) {
throw new ValidationException("Invalid customer data");
}
return customer;
};
}
@Bean
public RepositoryItemWriter<Customer> writer(CustomerRepository repository) {
RepositoryItemWriter<Customer> writer = new RepositoryItemWriter<>();
writer.setRepository(repository);
writer.setMethodName("save");
return writer;
}
}Migration Strategy Best Practices
1. Start with Data Layer
- Migrate file structures to database tables first
- Validate data conversion with production samples
- Create ETL pipelines for ongoing sync during transition
2. Service Layer Next
- Extract business logic into services
- Maintain same inputs/outputs initially
- Add unit tests for each service
3. API Layer
- Expose services via REST/GraphQL APIs
- Document with OpenAPI/Swagger
- Version APIs for backward compatibility
4. UI Layer Last
- Modern web/mobile UI
- Progressive enhancement
- Parallel run with legacy screens
5. Testing Strategy
- Compare outputs: legacy vs new
- Performance benchmarking
- Load testing with production volumes
- User acceptance testing
6. Deployment Strategy
- Blue-green deployment
- Feature flags for gradual rollout
- Monitoring and alerting
- Rollback plan ready
Fujitsu Mainframe Migration Strategy Framework
Complete framework for planning and executing Fujitsu mainframe migrations to modern platforms.
1. Assessment Phase
1.1 Inventory Collection
Create comprehensive inventory of all mainframe assets:
COBOL Programs:
- Count by type: NetCOBOL, PowerCOBOL, standard COBOL
- Lines of code per program
- Complexity metrics (cyclomatic complexity)
- Dependencies (CALL hierarchies)
- Screen programs vs batch programs
Database Assets:
- SYMFOWARE databases and schemas
- Table counts and row counts
- Stored procedures and triggers
- Views and indexes
- Transaction volume
JCL Jobs:
- Job count and frequency
- Steps per job
- Dependencies between jobs
- Resource requirements
- Schedule information
File Systems:
- SAM, PAM, ISAM file usage
- File sizes and volumes
- GDG datasets
- Data retention requirements
Copybooks and Includes:
- Shared data structures
- Usage frequency
- Dependencies
1.2 Complexity Analysis
Program Complexity Scoring:
Score = (LOC / 1000) * 0.3
+ (ExternalCalls * 2) * 0.2
+ (FileOperations * 1.5) * 0.2
+ (SQLStatements * 1) * 0.15
+ (ScreenHandling * 2) * 0.15
Classification:
- Low: Score < 10
- Medium: Score 10-30
- High: Score 30-100
- Very High: Score > 100Fujitsu-Specific Complexity:
- NetCOBOL OO features usage
- PowerCOBOL GUI components
- SYMFOWARE-specific SQL
- BS2000/OSD system calls
- Custom Fujitsu extensions
1.3 Dependency Analysis
Build complete dependency graph:
- Program call hierarchies
- Shared copybooks
- Database table access patterns
- File dependencies
- Job scheduling dependencies
1.4 Business Impact Assessment
- Critical business functions
- Transaction volumes
- Performance requirements
- Availability requirements (24/7, business hours)
- Regulatory compliance needs
2. Target Architecture Design
2.1 Technology Stack Selection
Application Layer:
- Framework: Spring Boot (recommended), Quarkus, Micronaut
- Language: Java 17+ or Kotlin
- API: REST (Spring REST), GraphQL (Spring GraphQL)
- Async: Spring WebFlux for reactive
Data Layer:
- Primary DB: PostgreSQL (cost-effective), Oracle (enterprise), SQL Server
- Caching: Redis, Hazelcast
- Search: Elasticsearch (if needed)
- Message Queue: RabbitMQ, Kafka
Batch Processing:
- Spring Batch (enterprise)
- Apache Airflow (complex workflows)
- Kubernetes CronJobs (simple)
Frontend:
- Web: React, Angular, Vue.js
- Mobile: React Native, Flutter
- Desktop: Electron (if needed)
Infrastructure:
- Cloud: AWS, Azure, GCP
- Containers: Docker
- Orchestration: Kubernetes
- Service Mesh: Istio (optional)
2.2 Microservices Decomposition
Identify Bounded Contexts:
Example for banking:
- Customer Management Service
- Account Service
- Transaction Service
- Loan Service
- Reporting ServiceDesign Principles:
- Single Responsibility
- Loose Coupling
- High Cohesion
- Independent Deployability
- Database per Service
API Design:
- RESTful conventions
- Versioning strategy (URL, header)
- OpenAPI documentation
- Rate limiting
- Authentication/Authorization (OAuth2, JWT)
2.3 Data Architecture
Database Strategy:
- Separate databases per microservice
- Shared reference data strategy
- Event-driven data sync
- CQRS pattern (if needed)
Migration Patterns:
SYMFOWARE → PostgreSQL:
1. Schema conversion
2. Data type mapping
3. Stored procedure conversion
4. Trigger rewrite
5. Performance tuningFile to Database Migration:
ISAM Files → Database Tables:
- Create table with primary key
- Add appropriate indexes
- Migrate data with validation
- Update programs to use DB
Sequential Files → Keep or DB:
- Low frequency: Keep as files
- High frequency: Consider database
- Batch processing: File might be fine3. Migration Strategy Selection
3.1 Strangler Fig Pattern (Recommended)
Approach: Gradually replace functionality while keeping system operational.
Steps:
1. Identify first bounded context to migrate 2. Build new service with same interface 3. Route traffic to new service 4. Validate results in parallel 5. Cutover when confidence high 6. Repeat for next context
Advantages:
- Lower risk
- Continuous value delivery
- Learn and adjust
- Rollback easier
Disadvantages:
- Longer timeline
- Integration complexity
- Maintaining two systems
Best for:
- Large, complex systems
- Risk-averse organizations
- Limited migration team
3.2 Big Bang Migration
Approach: Complete rewrite, cutover at once.
Steps:
1. Build entire new system 2. Migrate all data 3. Extensive testing 4. Single cutover event
Advantages:
- Clean architecture
- Shorter calendar time (if successful)
- No hybrid complexity
Disadvantages:
- Very high risk
- Long time to value
- Difficult rollback
Best for:
- Smaller systems
- Greenfield opportunity
- Strong team with mainframe knowledge
3.3 Hybrid Approach
Approach: Core services modernized, periphery later.
Steps:
1. Identify core 20% delivering 80% value 2. Modernize core services 3. Keep peripheral functions on mainframe 4. Integrate via APIs 5. Gradually modernize peripheral
Advantages:
- Balanced risk/reward
- Quick wins possible
- Focus on high value
Disadvantages:
- Integration overhead
- Two platforms to maintain
Best for:
- Medium complexity
- Budget constraints
- Quick ROI needed
4. Data Migration Planning
4.1 Data Migration Strategy
Full Migration:
- All data moved at once
- Requires downtime
- Simpler approach
Incremental Migration:
- Data migrated in phases
- Minimal downtime
- Sync mechanism needed
Parallel Run:
- Both systems active
- Data synced bidirectionally
- Gradual cutover
4.2 Data Migration Steps
Phase 1: Analysis
1. Data profiling 2. Quality assessment 3. Mapping design 4. Transformation rules
Phase 2: Preparation
1. Create target schemas 2. Build ETL pipelines 3. Data cleansing 4. Validation rules
Phase 3: Migration
1. Initial bulk load 2. Incremental updates 3. Data reconciliation 4. Performance tuning
Phase 4: Validation
1. Row count validation 2. Checksum verification 3. Business rule validation 4. Sample data review
4.3 Data Migration Tools
ETL Tools:
- Talend
- Apache NiFi
- AWS Glue
- Azure Data Factory
Custom Scripts:
@Service
public class DataMigrationService {
@Transactional
public void migrateCustomers(String sourceFile) {
List<Customer> customers = readFromMainframe(sourceFile);
customers.stream()
.map(this::transform)
.forEach(customer -> {
validateAndSave(customer);
logMigration(customer);
});
}
private Customer transform(LegacyCustomer legacy) {
return Customer.builder()
.customerId(legacy.getCustId())
.name(legacy.getCustName().trim())
.balance(legacy.getBalance())
.build();
}
}5. Testing Strategy
5.1 Testing Levels
Unit Testing:
- JUnit 5
- Mockito for mocking
- TestContainers for integration
- Code coverage: 80%+ target
Integration Testing:
- API testing with REST Assured
- Database testing
- Message queue testing
- External service mocking
System Testing:
- End-to-end scenarios
- Performance testing
- Security testing
- Disaster recovery testing
UAT (User Acceptance Testing):
- Business user validation
- Real scenarios
- Production-like data
- Sign-off process
5.2 Migration Validation
Output Comparison:
# Run same input through both systems
./legacy_system < input.dat > legacy_output.txt
./new_system < input.dat > new_output.txt
# Compare outputs
diff legacy_output.txt new_output.txtParallel Run:
- Route requests to both systems
- Compare responses
- Alert on differences
- Build confidence over time
Shadow Mode:
- New system processes in background
- Doesn't affect live traffic
- Results logged for comparison
5.3 Performance Testing
Load Testing:
- JMeter, Gatling, K6
- Match production volumes
- Identify bottlenecks
- Capacity planning
Benchmarks:
- Response time vs legacy
- Throughput comparison
- Resource utilization
- Cost per transaction
6. Cutover Planning
6.1 Pre-Cutover Activities
1-2 Months Before:
- Complete UAT
- Performance testing passed
- Security audit completed
- Training completed
1-2 Weeks Before:
- Cutover rehearsal
- Final data migration test
- Rollback plan tested
- Communication plan ready
1 Day Before:
- Freeze legacy system
- Final backup
- Team on standby
6.2 Cutover Day
Timeline Example:
Friday 6:00 PM - Freeze legacy system
Friday 7:00 PM - Start final data migration
Saturday 12:00 AM - Data migration complete
Saturday 1:00 AM - Validation checks
Saturday 2:00 AM - Switch traffic to new system
Saturday 3:00 AM - Smoke tests
Saturday 6:00 AM - Monitor closely
Monday 8:00 AM - Business opens with new systemCutover Checklist:
- [ ] Legacy system frozen
- [ ] Final data migrated
- [ ] Data validation passed
- [ ] DNS/Load balancer updated
- [ ] Traffic flowing to new system
- [ ] Smoke tests passed
- [ ] Monitoring active
- [ ] Support team ready
- [ ] Rollback plan ready
6.3 Post-Cutover
First 24 Hours:
- War room active
- All hands on deck
- Monitor metrics closely
- Quick issue resolution
First Week:
- Daily team meetings
- Issue tracking
- Performance monitoring
- User feedback collection
First Month:
- Weekly reviews
- Optimization iterations
- Documentation updates
- Lessons learned
6.4 Rollback Plan
Triggers for Rollback:
- Critical business function failure
- Data corruption detected
- Performance below acceptable
- Security breach
Rollback Steps:
1. Announce rollback decision 2. Stop traffic to new system 3. Restore legacy system 4. Sync any changed data 5. Verify legacy system operational 6. Communicate to stakeholders
7. Risk Management
7.1 Key Risks
| Risk | Impact | Probability | Mitigation |
|---|---|---|---|
| Data loss during migration | High | Low | Backups, validation, rehearsals |
| Performance degradation | High | Medium | Load testing, tuning, monitoring |
| Extended downtime | High | Medium | Rehearsals, rollback plan |
| Functionality gaps | Medium | Medium | Thorough testing, UAT |
| Team knowledge gaps | Medium | High | Training, documentation, experts |
| Cost overrun | Medium | Medium | Phased approach, monitoring |
| Integration issues | Medium | Medium | Early integration testing |
| Security vulnerabilities | High | Low | Security testing, audits |
7.2 Risk Mitigation Strategies
Technical Risks:
- Proof of concepts early
- Prototype key components
- Load testing early and often
- Automated testing
People Risks:
- Training programs
- Knowledge transfer sessions
- External consultants
- Documentation
Process Risks:
- Clear governance
- Change management
- Regular checkpoints
- Escalation procedures
8. Success Metrics
8.1 Technical Metrics
Migration Progress:
- % programs migrated
- % data migrated
- % tests passing
- Code coverage
Quality Metrics:
- Defect density
- Mean time to repair (MTTR)
- Availability (99.9%+)
- Performance vs baseline
Operational Metrics:
- Deployment frequency
- Lead time for changes
- Change failure rate
- Time to restore service
8.2 Business Metrics
Value Delivery:
- Features delivered
- User satisfaction
- Business value realized
- ROI
Cost Metrics:
- Migration cost vs budget
- Ongoing operational cost
- Mainframe decommission savings
- TCO (Total Cost of Ownership)
8.3 KPIs
Phase-Based KPIs:
Assessment Phase:
- Inventory completeness: 100%
- Complexity scoring: Complete
Design Phase:
- Architecture approval: Yes
- Technology decisions: Final
Development Phase:
- Sprint velocity: Tracking
- Test coverage: 80%+
Testing Phase:
- UAT sign-off: Yes
- Performance targets: Met
Cutover Phase:
- Downtime: < target
- Data accuracy: 100%9. Cost Estimation
9.1 Cost Components
One-Time Costs:
- Assessment and planning
- Architecture and design
- Development (biggest component)
- Testing
- Data migration
- Training
- Cutover activities
Ongoing Costs:
- Cloud infrastructure
- Licenses (if any)
- Support and maintenance
- Monitoring tools
- Continuous improvement
9.2 Estimation Model
Development Effort:
Effort (person-days) =
(Low complexity programs * 2 days) +
(Medium complexity programs * 5 days) +
(High complexity programs * 15 days) +
(Very high complexity programs * 40 days)
Add 30% for:
- Testing
- Project management
- Documentation
- ContingencyCost Calculation:
Total Cost =
(Effort in person-days * Daily rate) +
Infrastructure costs +
Tool licenses +
Training costs +
Contingency (20%)10. Communication Plan
10.1 Stakeholder Management
Executive Sponsors:
- Monthly steering committee
- Progress reports
- Risk and issue escalation
- Budget tracking
Business Users:
- Regular demos
- UAT involvement
- Training sessions
- Change management
Technical Teams:
- Daily standups
- Sprint reviews
- Technical design sessions
- Knowledge sharing
10.2 Communication Frequency
Daily:
- Development team standup
- Issue tracking updates
Weekly:
- Project status report
- Risk and issue review
- Sprint planning
Monthly:
- Executive steering
- Budget review
- Milestone tracking
Ad-hoc:
- Critical issues
- Major decisions
- Scope changes
11. Knowledge Transfer
11.1 Documentation
Technical Documentation:
- Architecture diagrams
- API documentation
- Database schemas
- Deployment guides
- Runbooks
User Documentation:
- User guides
- Training materials
- FAQs
- Video tutorials
11.2 Training Program
Technical Training:
- New technology stack
- Architecture overview
- Development standards
- Deployment procedures
Business Training:
- New UI/UX
- Changed workflows
- Reporting changes
- Support procedures
12. Post-Migration Activities
12.1 Optimization
Performance Tuning:
- Database query optimization
- Caching improvements
- Code optimization
- Infrastructure scaling
Cost Optimization:
- Right-size resources
- Reserved instances
- Eliminate waste
- Monitor usage
12.2 Continuous Improvement
Technical Debt:
- Address shortcuts
- Refactor as needed
- Update dependencies
- Security patches
Feature Enhancements:
- User feedback
- New capabilities
- Modernization beyond parity
12.3 Mainframe Decommission
Steps:
1. Verify new system stable (3-6 months) 2. Archive mainframe data 3. Document retention requirements 4. Decommission hardware 5. Cancel licenses 6. Realize cost savings
Checklist:
- [ ] All functions verified in production
- [ ] No rollback scenarios remaining
- [ ] Data archived per policy
- [ ] Audit requirements met
- [ ] Stakeholder approval
- [ ] Contracts terminated
- [ ] Cost savings captured
Related skills
FAQ
Which Fujitsu platforms does it cover?
The skill covers FACOM, PRIMERGY, BS2000/OSD, OSIV/MSP, OSIV/XSP, NetCOBOL, and PowerCOBOL per its description.
What modern targets does it map to?
It targets Spring Boot microservices, REST APIs, and containerized deployments on AWS, Azure, or GCP.
How does analysis start?
The workflow begins by discovering .cbl, .ncb, .fjcl, .cpy, and .sdf files with documented find commands.