Conversion opportunities with Ispirer
Ispirer Ecosystem automates your migration routine to enable quick and smart transformation of any application. Double the migration speed with our comprehensive solutions.
-
With CodeWays only
- Free Metrics tool to analyze the migration complexity
- Assistance in CodeWays configuration
- Automated migration of the entire application including project files, business logic, GUI and database API
- Prompt customization of the tool to maximize automation rate
- Expert support
-
With CodeWays as a part of migration service
- Tailored migration roadmap from assessment through migration and testing to cutover
- Automated migration of the entire application, including project files, business logic, GUI and database API
- Team of experts skilled in application conversion
- Assistance in deployment, integration, performance optimization, and new feature development
Unleash the reinforced application
Save your time
Our modernization and migration approach
We select the right conversion approach based on business specifics, project scope, complexity, and risk profile.
-
Rule-Based
Deterministic conversion
Engine
SQLWays, CodeWays
Automation & coverage
~70–80% automated coverage out of the box, with the option to reach up to 90% through manual refinement, refactoring, validation, and QA
What you get
Predictable scope and timeline, stable and repeatable output
Best for
Well-defined, structured migrations
-
Recommended
Hybrid
Rules + AI-assisted refinement
Engine
SQLWays, CodeWays + AI
Automation & coverage
~70–80% automated coverage, up to 90% with AI, reducing manual conversion, validation, and testing
What you get
Predictability of the rule-based engine + speed of AI, backed by the Ispirer expert framework
Best for
Complex or partially undocumented systems
-
AI-Driven
AI-led analysis and delivery
Engine
AI engine
Automation & coverage
AI-led code and business logic extraction by Ispirer Migration Experts
What you get
AI-assisted refactoring, code generation and documentation, human-led QA, insights into undocumented logic and target design
Best for
Iterative modernization and innovation-driven transformation
The approach is defined during the Discovery Phase, based on business specifics, source system complexity, target state, timeline, and expected business value.
CodeWays for automated app conversion
CodeWays is a tool for automated application conversion that translates code from one programming language to another automatically, while preserving the initial functionality of an app. Using an intelligent proprietary algorithm, the tool analyzes the syntax, semantics, mapping data types, control structures, function calls, and code structures that do not have equivalents in a target technology.
Based on the analysis, CodeWays applies all the relevant conversion rules from its knowledge base core and translates COBOL source code to Java.
It takes 5 min to start your application conversion journey!
App source code & App source code with embedded SQL*
- Informix4GL
- Delphi
- Cobol
- VisualBasic
- Progress4GL
- PowerBuilder
- C/C++
Any files with SQL code
- Informix
- Teradata
- SQLServer
- Oracle
- IBM DB2
- SAP Sybase
- PostgreeSQL
- MySQL
- Greenplum
- MariaDB
- Firebird
-
App target code
-
App target code with converted ESQL
-
Files with SQL code for the target DB
*Embedded SQL are SQL statements written inline with the program source code, of the host language.
Convert Smarter. Evolve Faster
Over 150 ways to migrate- Delphi
- Cobol
- Progress 4GL
- C#
- PowerBuilder
- C\C++
- Pascal
- .Net
- Informix 4GL
- Python
- Delphi
- Cobol
- Progress 4GL
- C#
- PowerBuilder
- C\C++
- Pascal
- .Net
- Informix 4GL
- Python
- Delphi
- Cobol
- Progress 4GL
- C#
- PowerBuilder
- C\C++
- Pascal
- .Net
- Informix 4GL
- Python
- Delphi
- Cobol
- Progress 4GL
- C#
- PowerBuilder
- C\C++
- Pascal
- .Net
- Informix 4GL
- Python
Conversion details overview
-
Ispirer Toolkit automates
Ispirer Toolkit automatically converts COBOL to Java, considering the specifics of these languages.
The conversion results in a Java class being generated for each source file (.cbl, .cob, .cpy)
The class name is formed from the PROGRAM-ID specified in the Identification division, taking into account the camelCase rule of the Java language. Variables from the Data division are migrated to class variables, and paragraphs from the Procedure division are migrated to class methods.
When using structures in COBOL, additional classes are formed for them in Java.
Conversion
Besides, our tool processes COPY and INCLUDE clauses, creating a class object derived from the conversion of the header file.
Dependencies
At the same time, dependencies and data types used in the header files are automatically taken into account.
Special Framework
We have developed a special Java framework to achieve a high level of automation and get maintainable code.
-
Conversion results
Code Conversion
Each paragraph is converted to the class method. At the same time, the call and completion of each method automatically consider the possibility of using PERFORM and GO TO statements. COBOL statements and functions, which do not have analogues in Java, are converted to the class methods of our framework.
Working with Files
Ispirer Toolkit supports conversion of files of all three types: sequential, indexed and relative. File algorithms are automatically moved from COBOL to Java without changes.
Working with Database
Database access in the COBOL application can be converted to JDBC or Hibernate. In addition, if the Java application needs to work with another database, you can convert the embedded SQL, as well as the database.
Variable Conversion
Ispirer Toolkit automatically converts all COBOL data types, taking into account PICTURE (PIC) and USAGE clauses. For exact data type matching, we use generic Java classes.
Check out how Ispirer Toolkit automatically converts COBOL application
COBOL to Java conversion service overview
More than 2K users use this way to
successfully convert their application code
Start
Assessment
- Collecting info about an application
- Analyzing the application and its components
- Making migration plan
Automated APP conversion
- Entire APP conversion
- APP changes (API, ESQL)
- Tool configuration and customization for specific APP
Manual APP conversion
- Manual code review and debugging
- Replacing custom controls, libraries, methods, etc. with analogues
- Developing remaining solutions using target technology
Functional testing
- APP analysis and test documentation creation
- Testing the application against test documentation
- Fixing issues
Acceptance testing
- Testing the APP against business requirements
- Fixing issues
Cutover
- Switching APP
- System startup assisstance
Most people we talk to aren't looking for a pitch. They're looking at a system that's been holding their business together for years, and they're nervous about touching it. What they actually want is someone who'll be honest about what's realistic and stick around after the contract is signed. That's the part of the job I care about most.
Senior Sales Executive (SSE), Ispirer Systems
Conversion Samples of COBOL to Java
Ispirer Toolkit analyzes all object dependencies during the conversion process and provides not only line-by-line conversion, but resolves type conversions as well. The software understands and transforms the necessary inheritance dependencies. It parses the entire source code, builds an internal tree with all the information about the objects, and uses it in the migration process.
To convert structures, we have implemented additional type conversion classes to store variable sizes to convert redefines and arrays so that they work similar to COBOL logic.
-
Common variables declaration structure conversion:
COBOL
- 01 varlnk.
- 05 varlnk-1 PIC 999.
- 05 varlnk-2 PIC X(10).
- 05 varlnk-3 PIC 9(7).
→ Java
- public class Varlnk extends StructureModel {
- private int sizes[];
- public PictureType<Integer> Varlnk1 = new PictureType<>(PictureType.Type.Integer, new DecimalFormat("999"));
- public PictureType<String> Varlnk2 = new PictureType<>(PictureType.Type.String, new AlphanumericFormat("X(10)"));
- public PictureType<Integer> Varlnk3 = new PictureType<>(PictureType.Type.Integer, new DecimalFormat("9(7)"));
- public Varlnk() {
- sizes = new int[] { Varlnk1.getSize(),Varlnk2.getSize(),Varlnk3.getSize() };
- }
- @Override
- public String toString() {
- return "" + Varlnk1 + Varlnk2 + Varlnk3;
- }
- @Override
- public void setData(char[] data) {
- setData(getStringValues(data, sizes));
- }
- @Override
- public void setData(String[] data) {
- Varlnk1.setDataFromFile(data[0].getBytes());
- Varlnk2.setValue(data[1]);
- Varlnk3.setDataFromFile(data[2].getBytes());
- }
- @Override
- public int getSize() {
- int sum = 0;
- for(int i = 0; i < sizes.length; i ++) {
- sum += sizes[i];
- }
- return sum;
- }
- @Override
- public void initialize() {
- Varlnk1.initialize();
- Varlnk2.initialize();
- Varlnk3.initialize();
- }
- @Override
- public byte[] toFile() {
- byte[] structure = new byte[] { };
- structure = ArrayUtils.addAll(structure, Varlnk1.toFile());
- structure = ArrayUtils.addAll(structure, Varlnk2.toFile());
- structure = ArrayUtils.addAll(structure, Varlnk3.toFile());
- return structure;
- }
- @Override
- public void setDataFromFile(byte[] bytes) {
- bytes = getFullArray(bytes);
- Varlnk1.setDataFromFile(Arrays.copyOf(bytes, Varlnk1.getSize()));
- bytes = Arrays.copyOfRange(bytes, Varlnk1.getSize(), bytes.length);
- Varlnk2.setDataFromFile(Arrays.copyOf(bytes, Varlnk2.getSize()));
- bytes = Arrays.copyOfRange(bytes, Varlnk2.getSize(), bytes.length);
- Varlnk3.setDataFromFile(Arrays.copyOf(bytes, Varlnk3.getSize()));
- bytes = Arrays.copyOfRange(bytes, Varlnk3.getSize(), bytes.length);
- }
- @Override
- public void setDefaultValue(PictureType.DefaultValue value) {
- Varlnk1.setDefaultValueFromStructure(value);
- Varlnk2.setDefaultValueFromStructure(value);
- Varlnk3.setDefaultValueFromStructure(value);
- }
- }
- public Varlnk varlnk = new Varlnk();
-
Common REDEFINES conversion:
COBOL
- 01 var1 PIC XXX VALUE '111'.
- 01 var2 REDEFINES var1.
- 05 vvv1 PIC 9.
- 05 vvv2 PIC 99.
→ Java
- private StrField Var1 = new StrField("XXX", "111");
- public Var2 var2 = new Var2(Var1);
- public class Var2 extends StructureModel {
- private int sizes[];
- public PictureType<Integer> Vvv1 = new PictureType<>(PictureType.Type.Integer, new DecimalFormat("9"));
- public PictureType<Integer> Vvv2 = new PictureType<>(PictureType.Type.Integer, new DecimalFormat("99"));
- public Var2(StructureModel ... objs) {
- sizes = new int[] { Vvv1.getSize(),Vvv2.getSize() };
- initRedefineObjs(objs);
- }
- @Override
- public String toString() {
- return "" + Vvv1 + Vvv2;
- }
- @Override
- public void setData(char[] data) {
- setData(getStringValues(data, sizes));
- }
- @Override
- public void setData(String[] data) {
- Vvv1.setDataFromFile(data[0].getBytes());
- Vvv2.setDataFromFile(data[1].getBytes());
- redefine();
- }
- public void setVvv1(Integer Vvv1) {
- this.Vvv1.setValue(Vvv1);
- redefine();
- }
- public void setVvv2(Integer Vvv2) {
- this.Vvv2.setValue(Vvv2);
- redefine();
- }
- @Override
- public int getSize() {
- int sum = 0;
- for(int i = 0; i < sizes.length; i ++) {
- sum += sizes[i];
- }
- return sum;
- }
- @Override
- public void initialize() {
- Vvv1.initialize();
- Vvv2.initialize();
- }
- @Override
- public byte[] toFile() {
- byte[] structure = new byte[] { };
- structure = ArrayUtils.addAll(structure, Vvv1.toFile());
- structure = ArrayUtils.addAll(structure, Vvv2.toFile());
- return structure;
- }
- @Override
- public void setDataFromFile(byte[] bytes) {
- bytes = getFullArray(bytes);
- Vvv1.setDataFromFile(Arrays.copyOf(bytes, Vvv1.getSize()));
- bytes = Arrays.copyOfRange(bytes, Vvv1.getSize(), bytes.length);
- Vvv2.setDataFromFile(Arrays.copyOf(bytes, Vvv2.getSize()));
- bytes = Arrays.copyOfRange(bytes, Vvv2.getSize(), bytes.length);
- }
- @Override
- public void setDefaultValue(PictureType.DefaultValue value) {
- Vvv1.setDefaultValueFromStructure(value);
- Vvv2.setDefaultValueFromStructure(value);
- redefine();
- }
- }
-
Common array conversion:
COBOL
- 01 var5.
- 05 var5-occurs OCCURS 2 TIMES.
- 10 var5-occurs-txt PIC X(6) VALUE ' TEXT1'.
→ Java
- public List<PictureType<String>> Var5 = Stream.generate(()->new PictureType<String>(new AlphanumericFormat("X(6)"), " TEXT1")).limit(2).collect(Collectors.toList());
-
COBOL call chain with PERFORMs conversion:
COBOL
- TopLevel.
- DISPLAY "In TopLevel. Starting to run program"
- PERFORM OneLevelDown
- DISPLAY "Back in TopLevel.".
- STOP RUN.
- OneLevelDown.
- DISPLAY ">>>> Now in OneLevelDown"
- PERFORM TwoLevelsDown
- DISPLAY ">>>> Back in OneLevelDown".
- TwoLevelsDown.
- DISPLAY ">>>>>>>> Now in TwoLevelsDown."
- PERFORM ThreeLevelsDown.
- DISPLAY ">>>>>>>> Back in TwoLevelsDown.".
- ThreeLevelsDown.
- DISPLAY ">>>>>>>>>>>> Now in ThreeLevelsDown".
→ Java
- private static CobSmplCbl instance;
- public boolean isCalled = false;
- public void CobSmplCblProcedureDivision() {
- toplevel(true);
- }
- private void toplevel(boolean isPerform) {
- System.out.println("In TopLevel. Starting to run program");
- oneleveldown(false);
- System.out.println("Back in TopLevel.");
- throw new StopRun();
- }
- private void oneleveldown(boolean isPerform) {
- System.out.println(">>>> Now in OneLevelDown ");
- twolevelsdown (false);
- System.out.println(">>>> Back in OneLevelDown ");
- }
- private void twolevelsdown(boolean isPerform) {
- System.out.println(">>>>>>>> Now in TwoLevelsDown.");
- threelevelsdown(false);
- System.out.println(">>>>>>>> Back in TwoLevelsDown.");
- }
- private void threelevelsdown(boolean isPerform) {
- System.out.println(">>>>>>>>>>>> Now in ThreeLevelsDown");
- }
- public static CobSmplCbl getInstance() {
- return instance == null ? instance = new CobSmplCbl() : instance;
- }
- public static void cancel() {
- instance = new CobSmplCbl();
- }
-
If statement conversion:
COBOL
- if var3 = var4
- move "D" to var3
- else
- move " " to var3.
→ Java
- if (Var3.compareTo(Var4) == 0) {
- Var3.setData("D");
- }
- else {
- Var3.setValue(" ");
- }
-
PERFORM UNTIL statement conversion:
COBOL
- PERFORM UNTIL IterCount = 5
- ADD 1 TO IterCount
- END-PERFORM
→ Java
- while (Itercount != 5) {
- Itercount.setValue(Itercount + 1);
- }
Copy statement conversion
During the conversion stage, the code from the copy files is included in the program and replaced with the appropriate copy statements, thereafter the program converts the entire code.
Get a free sample code of our COBOL to Java code conversion
Ispirer Toolkit automatically converts not only a single piece of code, but an entire application. Complex code will require customization of the toolkit
Conversion of Various COBOL Dialects
- Micro Focus COBOL
- COBOL/II
- ACUCOBOL-GT
- Enterprise COBOL
- IBM COBOL
- Fujitsu COBOL
- HP COBOL
- GnuCOBOL
- Micro Focus COBOL
- COBOL/II
- ACUCOBOL-GT
- Enterprise COBOL
- IBM COBOL
- Fujitsu COBOL
- HP COBOL
- GnuCOBOL
- Realia COBOL
- COBOL-IT
- Microsoft COBOL
- isCOBOL
- OS/VS COBOL
- COBOL/400
- ANSI COBOL
- Hitachi COBOL
- Realia COBOL
- COBOL-IT
- Microsoft COBOL
- isCOBOL
- OS/VS COBOL
- COBOL/400
- ANSI COBOL
- Hitachi COBOL
Trust us with your conversion project
-
Seasoned team
Ensuring high security and performance standards is what we do best, thanks to our impressive expertise in building reliable and scalable solutions.
-
Technology expertise with 25+ years of experience
Our team has gained a wide pool of expertise in various programming languages, from the rarest to the most popular ones.
-
We comply with ISO 27001 security
We comply with ISO 27001 security management requirements with comprehensive policies and processes, advanced security technology, and skilled professionals.
-
Proprietary tools
We employ Ispirer proprietary tools, underscoring our dedication to delivering the utmost reliability and performance solutions.
The toolkit is compiled daily and continually integrates dozens of new conversion rules, enhancing the automation capabilities.
6 undeniable facts to choose conversion with Ispirer
-
Fact 1/6
Same functionality, new application
Migration does not require labor-intensive development of new functionality from scratch. Your application will be converted to a new technology while maintaining the original functionality
-
Fact 2/6
Architecture preserved or modified
Automated conversion implies preserving the initial architecture which is easier to maintain. The app architecture, can also be transformed, for example, from desktop to the web to improve accessibility and scalability
-
Fact 3/6
The speed of conversion
Migrating an application is much faster than creating a new one from scratch. Automated migration with Ispirer Toolkit minimizes manual effort and may speed up the delivery by 2-3 times
-
Fact 4/6
Legacy System Transformation
Migrating COBOL to modern architectures or platforms can upgrade your application, making it easier to maintain, update, and extend in the long term run
-
Fact 5/6
Performance and Scalability
Through conversion, you can optimize the application's architecture and infrastructure, improving scalability and performance without the need to rebuild everything
-
Fact 6/6
No need for documentation
To perform the conversion, we go by your source code. There is no need to have detailed documentation in place to start the conversion as is the case with development
They chose Ispirer to revamp their application
Epicor, University of Maryland, NedGraphics and more have adopted CodeWays to boost their innovation life-cycle accelerate and manage their end-to-end innovation lifecycle
All testimonialsFrequently Asked Questions
Find answers. Ask questions. Connect with Ispirer support.
Want more details?
Request a consultation with our expert
Can you recommend tools or services for COBOL to Java conversion?
Yes. COBOL to Java is a supported direction at Ispirer, and one of the products that stands out on the market for it is CodeWays, which converts application source code together with embedded SQL and database API calls. The same scope is available as a managed application conversion service.
The technical point that decides quality is fixed point arithmetic. COMP-3 packed decimal fields can be mapped to BigDecimal with explicit scale and rounding mode, because double introduces differences that show up in financial totals.
Structurally, copybooks become Java classes, REDEFINES becomes accessor methods over a shared byte representation, OCCURS becomes arrays or lists, and PERFORM THRU with GO TO is restructured into methods with controlled flow. Indexed and sequential files, including VSAM, become database tables or a file abstraction, CICS transactions become services, and JCL becomes scheduler configuration.
EBCDIC to ASCII conversion changes sort order, so collation dependent logic is tested separately. Scope the project from a line of code assessment: COBOL systems of 100,000 to 400,000 lines have documented durations from several months to about a year.

