rpg-migration-analyzer について
AS/400やIBM i上のRPG III/IV/ILEアプリケーションをJavaへ刷新するチーム向けの移行分析スキルです。プログラムのロジック、データ、ファイル、依存関係を移行パターンとレポート向け計画に整理します。
主な機能
- 01RPG仕様とロジックの解析
- 02RPGデータ型からJavaへのマッピング
- 03ファイルI/OをJPAまたはJDBCのパターンに変換
- 04呼び出し、ファイル、依存関係の分析
- 05Java構造と移行レポートの生成
活用シーン
- 01モダナイゼーションに向けたRPGコードの評価
- 02AS/400またはIBM iからJavaへの移行計画
- 03RPGのファイルとデータ構造のマッピング
- 04移行の複雑さと工数の見積もり
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dauquangthanh/ hanoi-rainbow --skill rpg-migration-analyzerインストール後、Claude Code で/rpg-migration-analyzerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/java-class-template.javamigration-report-template.mdreferences/messaging-integration.mdperformance-patterns.mdpseudocode-common-rules.mdpseudocode-rpg-advanced.mdpseudocode-rpg-core-rules.mdpseudocode-rpg-data-structures.mdpseudocode-rpg-functions.mdpseudocode-rpg-migration-guide.mdpseudocode-rpg-patterns.mdpseudocode-rpg-rules.mdpseudocode-rpg-rules.md.backuptesting-strategy.mdtransaction-handling.mdscripts/analyze-dependencies.ps1analyze-dependencies.shestimate-complexity.pyextract-structure.pygenerate-java-classes.py詳細
RPG 移行アナライザー
AS/400 および IBM i システムのレガシー RPG プログラム(RPG III/IV/ILE)を分析し、ビジネスロジック、データ構造、ファイル操作を抽出して、最新の Java アプリケーションへの移行に向けた実行可能な戦略を生成します。
概要
このスキルは、RPG(Report Program Generator)アプリケーションの包括的な分析と移行計画を提供します。プログラム仕様を抽出し、RPG のデータ型を Java の同等型に変換し、ファイル操作を最新のデータベースアクセスパターンに対応付け、実装にすぐ使える Java コード構造を生成します。
主な移行対象:RPG から Java への移行において、パック10進数(BigDecimal)、データ構造(POJO)、ファイル操作(JPA/JDBC)、インディケーター(boolean 変数)を適切に処理し、ビジネスロジックを維持します。
このスキルを使用する場面
次の場合にこのスキルを使用します。
- 最新化に向けて RPG ソースファイル(.rpg、.rpgle、.RPGLE)を分析する場合
- AS/400 または IBM i システムから Java への移行を計画する場合
- RPG データ構造(D-specs)を Java クラスに変換する場合
- RPG ファイル操作(F-specs)をデータベースアクセスパターンに対応付ける場合
- RPG プログラムの依存関係と呼び出しチェーンを把握する場合
- RPG のビジネスロジックから Java の同等コードを生成する場合
- RPG 移行プロジェクトの複雑さと作業量を見積もる場合
- 移行ドキュメントと戦略レポートを作成する場合
- レガシーなメインフレームアプリケーションをマイクロサービスに最新化する場合
- ユーザーが RPG 分析、AS/400 移行、IBM i 最新化、Report Program Generator、パック10進数の変換について言及した場合
主な機能
1. プログラム分析
RPG プログラムのコンポーネントを抽出して分析します。
- 仕様の種類:H-spec(ヘッダー/制御)、F-spec(ファイル定義)、D-spec(データ定義)、C-spec(計算/ロジック)、P-spec(プロシージャ)
- データ構造:ネストされた構造、配列(DIM)、外部参照(EXTNAME)、修飾子(LIKEDS、QUALIFIED)を含む D-specs
- ファイル定義:物理ファイル、論理ファイル、画面ファイル(WORKSTN)、プリンターファイル
- ビジネスロジック:計算仕様、制御構造(IF/ELSE/DO/FOR)、式(EVAL)
- インディケーター:レガシーインディケーター(*IN01-*IN99)、組み込みインディケーター(*INLR,*INOF)
- 組み込み関数:文字列関数(%SUBST、%TRIM、%SCAN)、日付関数(%DATE、%DAYS)、数学関数(%DEC、%INT)、ファイルステータス(%EOF、%FOUND、%ERROR)
- エラー処理:%ERROR、%STATUS、ON-ERROR ブロック
2. データ構造のマッピング
RPG のデータ定義を Java の同等型に変換します。
- D-spec の変換:データ構造定義を Java クラス(POJO)に変換
- データ型のマッピング:
- パック10進数(P)→
BigDecimal(精度を維持) - ゾーン10進数(S)→
BigDecimal(符号付き10進数) - 文字(A)→
String - 日付(D)→
LocalDate - 時刻(T)→
LocalTime - タイムスタンプ(Z)→
LocalDateTime - インディケーター(N)→
boolean - バイナリ整数(I)→
intまたはlong
- パック10進数(P)→
- 配列(DIM):Java の
List<T>または配列T[]に変換 - ネストされたデータ構造:LIKEDS をネストされた Java クラスに変換
- 外部データ構造(EXTNAME):データベーステーブル定義から JPA エンティティを生成
- 初期化(INZ):Java のフィールド初期化子またはコンストラクターに対応付け
3. ファイル操作
RPG のファイル I/O を解析し、最新のデータベースアクセスに変換します。
- ファイルの種類:物理ファイル(DISK)、論理ファイル(キー指定アクセス)、画面ファイル(WORKSTN)、プリンターファイル(PRINTER)
- アクセス方法:順次(全件読み込み)、キー指定(キーによる直接アクセス)、到着順
- I/O 操作:
- READ/READE → JPA クエリメソッド、JDBC ResultSet の反復処理
- WRITE → JPA persist()、JDBC INSERT
- UPDATE → JPA merge()、JDBC UPDATE
- DELETE → JPA remove()、JDBC DELETE
- CHAIN → JPA findById()、Optional パターン
- SETLL/READE ループ → 順序指定の JPA findBy...() クエリ
- ファイルステータス:%EOF(ファイルの終端)、%FOUND(レコードが見つかった状態)、%ERROR(I/O エラー)→ Java の例外または Optional
- トランザクション境界:コミット境界(COMMIT オペレーションコード)を特定
4. Java 移行戦略
最新の Java 実装パターンを生成します。
- POJO:D-spec のデータ構造から Plain Old Java Object を生成します
- JPA エンティティ:データベーステーブルに @Entity アノテーションを付与します(EXTNAME ファイルから)
- リポジトリパターン:ファイル操作に Spring Data JPA リポジトリを使用します
- サービスメソッド:プロシージャやサブルーチンからビジネスロジックを作成します
- Bean Validation:RPG のフィールド検証から @NotNull、@Size、@DecimalMin/Max を使用します
- 例外処理:%ERROR パターンを、カスタム例外を使った try-catch ブロックに変換します
- コレクション:RPG の配列やデータ構造から Java Collections API(List、Map、Set)を使用します
- DTO:サービス境界に Data Transfer Object を使用します
- トランザクション管理:コミット境界に @Transactional アノテーションを使用します
5. 依存関係の分析
プログラムの関連性と外部依存関係を対応付けます。
- プログラム呼び出し:CALLB(バインドされたプロシージャの呼び出し)、CALLP(プロトタイプ宣言されたプロシージャの呼び出し)
- サービスプログラム:BNDDIR(バインディングディレクトリ)、*SRVPGM オブジェクト
- ファイル依存関係:プログラムがアクセスするすべての物理ファイル/論理ファイル
- データベーステーブル:参照される DB2 for i テーブル(EXTNAME)
- /COPY メンバー:インクルードファイル、コピーソースメンバー、プロトタイプ
- 呼び出しチェーン:呼び出し元と呼び出し先のプログラムを特定します
- 共有データエリア:*DTAARA の使用状況
- メッセージキュー:QMHSNDPM(プログラムメッセージの送信)
手順
RPG プログラムを分析して Java に移行するには、次の手順に従ってください。
ステップ 1:RPG ソースファイルを見つける
RPG ソースファイル(RPG III/IV/ILE の自由形式用の .rpg、.rpgle、.RPGLE 拡張子)を探します。
find . -name "*.rpg" -o -name "*.rpgle" -o -name "*.RPGLE"
ステップ 2:プログラム構造を分析する
仕様(H、F、D、C、P)、データ構造、ファイル定義、プロシージャ、依存関係を抽出します。
自動化:自動抽出には scripts/extract-structure.py を実行します。
ステップ 3:データ型を対応付ける
RPG の型を Java の型に変換します。重要:パック/ゾーン10進数には必ず BigDecimal を使用してください(float/double は使用しないでください)。
| RPG Type | Java Type | Key Notes |
|---|---|---|
nP m (packed) | BigDecimal | 精度を必ず保持してください |
nS m (zoned) | BigDecimal | 符号付き10進数 |
A (char) | String | 文字データ |
D/T/Z (date/time) | LocalDate/LocalTime/LocalDateTime | 日付フィールド |
N (indicator) | boolean | True/False フラグ |
I (integer) | int or long | バイナリ整数 |
DIM(n) (array) | List<T> or T[] | 配列 |
ステップ 4:コードパターンを変換する
RPG の演算を Java に変換します。主な変換は次のとおりです。
- 計算:EVAL 式 → BigDecimal の算術メソッド
- ファイル I/O:CHAIN → Optional を使った
findById()、READ → クエリメソッド - 配列:インデックスを RPG の 1 始まりから Java の 0 始まりに調整します
- 文字列:%SUBST(1 始まり)→ substring(0 始まり)
- インジケーター:*IN01 → 名前付き boolean 変数
包括的な変換パターンについては、pseudocode-rpg-rules.md を参照してください。
ステップ 5:Java 実装を生成する
次を作成します。
- D-spec のデータ構造から POJO を生成します(
scripts/generate-java-classes.py) - データベーステーブル用の JPA エンティティ
- リポジトリインターフェース(Spring Data JPA)
- ビジネスロジック用のサービスメソッド
- 例外処理と検証
ステップ 6:依存関係を分析する
プログラム呼び出し(CALLB/CALLP)、ファイル依存関係、/COPY メンバー、サービスプログラムを対応付けます。
自動化:scripts/analyze-dependencies.sh または .ps1 を実行します。
ステップ 7:移行レポートを作成する
プログラムの概要、依存関係、データのマッピング、Java の設計、複雑さの見積もりを記載したドキュメントを生成します。
テンプレート:assets/migration-report-template.md を使用します。
ステップ 8:検証してテストする
次の項目を確認します:BigDecimal の使用、インデックスの調整、トランザクション境界、エラー処理、AS/400 のデータサンプルを使ったユニットテスト。
クイックリファレンス
重大な移行ルール
- 必ず BigDecimal を使用すること:RPG のパック形式(P)およびゾーン形式(S)の小数には、必ず
BigDecimalを使用してください。float/double は使用しないでください。 - インデックスを調整すること:RPG の配列/文字列は 1 から始まりますが、Java では 0 から始まります。
- インジケーターを置き換えること:*IN01-*IN99 を説明的な boolean 変数に変換してください。
- ファイル操作:CHAIN → findById()、READ → Optional を使ったクエリメソッド
- 文字列関数:%SUBST(1:10) → substring(0, 10)。位置を調整してください。
- 日付操作:RPG の日付関数 → LocalDate/LocalTime API
- トランザクション:COMMIT 操作を特定し、@Transactional アノテーションを使用してください。
- エラー処理:%ERROR/%STATUS → カスタム例外を使った try-catch
例:データ構造から Java クラスへの変換
RPG D-spec:
D Employee DS
D EmpId 6 0
D EmpName 30 A
D Salary 63 2P
Java POJO:
public class Employee {
private int empId;
private String empName;
private BigDecimal salary; // 6 digits, 2 decimals
// getters/setters
}
例:ファイル操作の変換
RPG CHAIN:
C custId CHAIN CUSTFILE
C IF %FOUND(CUSTFILE)
JPA を使用した Java:
customerRepository.findById(custId).ifPresent(customer -> {
// process customer
});
// Service usage
public class CustomerService {
@Autowired
private CustomerRepository customerRepository;
public Optional<Customer> findCustomer(Integer custId) {
return customerRepository.findById(custId);
}
}
エッジケース
ケース 1:パック形式小数の精度
問題:double/float を使用すると、精度エラーが発生します。解決策:文字列リテラルから BigDecimal を必ず使用します:new BigDecimal("123.45")
ケース 2:配列インデックスのずれ
問題:RPG は 1 から始まり、Java は 0 から始まります。解決策:すべての配列/文字列インデックス参照を調整します。十分にテストしてください。
ケース 3:外部データ構造
問題:DDL ソースのない EXTNAME。解決策:DSPFFD コマンドを使用するか、DB2 SYSTABLES/SYSCOLUMNS を照会するか、実行時データからエンティティを作成します。
ケース 4:レガシーインジケーター
問題:制御フローに *IN01-*IN99 を使用しています。解決策:説明的な boolean に置き換えます:boolean invalidAmount = false;
ケース 5:日付の世紀処理
問題:2 桁の年(Y2K)。解決策:4 桁の年を使う LocalDate を使用し、世紀ウィンドウのロジックを適用して、前提を文書化します。
ガイドライン
- BigDecimal は必須:パック形式/ゾーン形式の小数に float/double を使用しないでください。
- 名前付き boolean:*IN01-99 を説明的な名前に置き換えてください。
- データベースアクセス:ファイル I/O を JPA/JDBC 操作に対応付けてください。
- JPA エンティティ:EXTNAME の物理ファイル定義から作成してください。
- 例外処理:%ERROR/%FOUND を例外/Optional に変換してください。
- AS/400 のデータでテスト:実際のレガシーシステムのデータで検証してください。
- トランザクション:COMMIT 操作を特定し、@Transactional を使用してください。
- ルールを文書化:暗黙的なビジネスロジックを抽出し、文書化してください。
- 文字エンコーディング:EBCDIC から Unicode への変換を確認してください。
- バッチ処理:バッチジョブを Spring Batch フレームワークに変換してください。
エラー処理
タイプ 1:ファイル I/O エラー
検出:%ERROR または %STATUS の確認。処理:カスタム例外(CustomerNotFoundException、DataAccessException)を使った try-catch を使用します。
タイプ 2:算術オーバーフロー
検出:フィールドサイズが不十分。処理:適切なスケール/精度を指定した BigDecimal を使用し、ArithmeticException を捕捉します。
タイプ 3:依存関係の不足
検出:/COPY メンバーの不足。処理:すべてのインクルードを追跡し、共有インターフェースを作成して、Maven/Gradle の依存関係を使用します。
追加リソース
詳細なドキュメントは references/ ディレクトリを参照してください。
RPG 翻訳ルール(トピック別)
RPG 翻訳ルールは、見つけやすいようにトピック別のファイルに整理されています。
- pseudocode-rpg-rules.md - クイックスタートガイドとファイルナビゲーションを含むマスターインデックス
- pseudocode-rpg-core-rules.md - 基礎:仕様、データ型、基本操作、ファイル I/O
- pseudocode-rpg-functions.md - 組み込み関数(BIF):文字列、日付/時刻、数学、配列関数
- pseudocode-rpg-data-structures.md - データ構造のパターン:QUALIFIED、LIKEDS、OVERLAY、I/O 仕様
- pseudocode-rpg-patterns.md - 一般的なイディオム、翻訳パターン、落とし穴、重要なルール
- pseudocode-rpg-advanced.md - ILE RPG、組み込み SQL、Web サービス、IFS、XML/JSON、スレッド処理
- pseudocode-rpg-migration-guide.md - 移行ワークフロー、ベストプラクティス、リファクタリング戦略
その他のリファレンスドキュメント
- pseudocode-common-rules.md - 擬似コードの一般的な構文と規約
- testing-strategy.md - RPG から Java への移行を検証するテストアプローチ
- transaction-handling.md - AS/400 のトランザクションパターンから Java のトランザクション管理への移行
- performance-patterns.md - 移行後のコード向けパフォーマンス最適化パターン
- messaging-integration.md - IBM i システム向けメッセージキューと統合のパターン
スクリプト
脚注/ 内の自動分析用 Python スクリプトとシェルスクリプト:
analyze-dependencies.sh/ps1- RPG ソースから CALLB、CALLP、/COPY をスキャンし、依存関係グラフを生成しますextract-structure.py- RPG 仕様(H、F、D、C、P)を解析し、構造化 JSON を出力しますgenerate-java-classes.py- 適切な型を使用して、RPG データ構造から Java POJO を作成しますestimate-complexity.py- 移行の複雑度スコアと工数の見積もりを算出します
テンプレート
- migration-report-template.md - 移行分析レポートの標準形式
- java-class-template.java - 生成する Java クラスのテンプレート
analyze-dependencies.sh / .ps1
- RPG ソースファイルから CALLB、CALLP、/COPY の参照をスキャンします
- JSON 形式で依存関係グラフを生成します
- 循環依存を特定します
使い方:
./scripts/analyze-dependencies.sh /path/to/rpg/source
extract-structure.py
- プログラム構造(H/F/D/C/P 仕様)を抽出します
- すべての変数、データ構造、ファイルを一覧表示します
- サブルーチンとプロシージャを特定します
- JSON 構造ファイルを出力します
使い方:
python scripts/extract-structure.py PROGRAM.rpgle --output structure.json
generate-java-classes.py
- RPG データ構造から Java POJO クラスを生成します
- 適切なフィールド型(パック10進数には BigDecimal)を作成します
- ゲッター、セッター、コンストラクターを追加します
- Bean Validation アノテーションを生成します
使い方:
python scripts/generate-java-classes.py structure.json --output-dir ./src/main/java
estimate-complexity.py
- 移行の複雑度スコアを算出します
- LOC、依存関係、ファイル操作を分析します
- 工数(時間/日数)を見積もります
- 優先度ランキングを生成します
使い方:
python scripts/estimate-complexity.py structure.json --report complexity-report.md
テンプレート
一貫性のあるドキュメントを作成するには、移行レポートテンプレートを使用してください。
- migration-report-template.md - 移行分析レポートの標準形式
- java-class-template.java - 適切な構造を備えた、生成する Java クラスのテンプレート
開発ツールとの統合
このスキルは、さまざまな開発ツールや分析ツールと統合されます。
IBM i / AS/400 ツール
- Source Entry Utility (SEU): AS/400 からソースコードを抽出します
- Programming Development Manager (PDM): メンバーリストとソースファイルにアクセスします
- WRKMBRPDM: ソースメンバーを操作します
- DSPFFD: データベース構造の分析用に、ファイルのフィールド記述を表示します
- DSPPGMREF: プログラムの参照と依存関係を表示します
データベースツール
- DB2 for i: システムカタログ(SYSTABLES、SYSCOLUMNS)を照会してメタデータを取得します
- IBM Data Studio: ビジュアルデータベース設計と SQL 開発を行います
- DBeaver: DB2 をサポートする汎用データベースツールです
モダンな開発環境
- IntelliJ IDEA: Spring Boot をサポートする Java 開発環境です
- Eclipse: JPA ツールを備えた Java IDE です
- VS Code: Java 拡張機能を備えた軽量エディターです
- Git: レガシーソースと新しい Java コードの両方を管理するバージョン管理ツールです
移行支援ツール
- Spring Initializr: Spring Boot プロジェクトを初期化します
- JPA Buddy: JPA エンティティを生成する IntelliJ プラグインです
- Liquibase/Flyway: データベース移行のバージョン管理を行います
- Maven/Gradle: ビルドの自動化と依存関係の管理を行います
テストと検証
- JUnit 5: 単体テストフレームワークです
- Spring Boot Test: 統合テストをサポートします
- Mockito: 単体テスト用のモックフレームワークです
- TestContainers: コンテナーを使用したデータベース統合テストを行います