mcpField
R
rpg-migration-analyzer

rpg-migration-analyzer

github.com/dauquangthanh開発1737 回インストール40 週間前に更新
リポジトリ

rpg-migration-analyzer について

AS/400やIBM i上のRPG III/IV/ILEアプリケーションをJavaへ刷新するチーム向けの移行分析スキルです。プログラムのロジック、データ、ファイル、依存関係を移行パターンとレポート向け計画に整理します。

主な機能

  1. 01RPG仕様とロジックの解析
  2. 02RPGデータ型からJavaへのマッピング
  3. 03ファイルI/OをJPAまたはJDBCのパターンに変換
  4. 04呼び出し、ファイル、依存関係の分析
  5. 05Java構造と移行レポートの生成

活用シーン

  1. 01モダナイゼーションに向けたRPGコードの評価
  2. 02AS/400またはIBM iからJavaへの移行計画
  3. 03RPGのファイルとデータ構造のマッピング
  4. 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.java
migration-report-template.md
references/
messaging-integration.md
performance-patterns.md
pseudocode-common-rules.md
pseudocode-rpg-advanced.md
pseudocode-rpg-core-rules.md
pseudocode-rpg-data-structures.md
pseudocode-rpg-functions.md
pseudocode-rpg-migration-guide.md
pseudocode-rpg-patterns.md
pseudocode-rpg-rules.md
pseudocode-rpg-rules.md.backup
testing-strategy.md
transaction-handling.md
scripts/
analyze-dependencies.ps1
analyze-dependencies.sh
estimate-complexity.py
extract-structure.py
generate-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
  • 配列(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 TypeJava TypeKey Notes
nP m (packed)BigDecimal精度を必ず保持してください
nS m (zoned)BigDecimal符号付き10進数
A (char)String文字データ
D/T/Z (date/time)LocalDate/LocalTime/LocalDateTime日付フィールド
N (indicator)booleanTrue/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 実装を生成する

次を作成します。

  1. D-spec のデータ構造から POJO を生成します(scripts/generate-java-classes.py)
  2. データベーステーブル用の JPA エンティティ
  3. リポジトリインターフェース(Spring Data JPA)
  4. ビジネスロジック用のサービスメソッド
  5. 例外処理と検証
ステップ 6:依存関係を分析する

プログラム呼び出し(CALLB/CALLP)、ファイル依存関係、/COPY メンバー、サービスプログラムを対応付けます。

自動化:scripts/analyze-dependencies.sh または .ps1 を実行します。

ステップ 7:移行レポートを作成する

プログラムの概要、依存関係、データのマッピング、Java の設計、複雑さの見積もりを記載したドキュメントを生成します。

テンプレート:assets/migration-report-template.md を使用します。

ステップ 8:検証してテストする

次の項目を確認します:BigDecimal の使用、インデックスの調整、トランザクション境界、エラー処理、AS/400 のデータサンプルを使ったユニットテスト。

クイックリファレンス

重大な移行ルール
  1. 必ず BigDecimal を使用すること:RPG のパック形式(P)およびゾーン形式(S)の小数には、必ず BigDecimal を使用してください。float/double は使用しないでください。
  2. インデックスを調整すること:RPG の配列/文字列は 1 から始まりますが、Java では 0 から始まります。
  3. インジケーターを置き換えること:*IN01-*IN99 を説明的な boolean 変数に変換してください。
  4. ファイル操作:CHAIN → findById()、READ → Optional を使ったクエリメソッド
  5. 文字列関数:%SUBST(1:10) → substring(0, 10)。位置を調整してください。
  6. 日付操作:RPG の日付関数 → LocalDate/LocalTime API
  7. トランザクション:COMMIT 操作を特定し、@Transactional アノテーションを使用してください。
  8. エラー処理:%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 を使用し、世紀ウィンドウのロジックを適用して、前提を文書化します。

ガイドライン

  1. BigDecimal は必須:パック形式/ゾーン形式の小数に float/double を使用しないでください。
  2. 名前付き boolean:*IN01-99 を説明的な名前に置き換えてください。
  3. データベースアクセス:ファイル I/O を JPA/JDBC 操作に対応付けてください。
  4. JPA エンティティ:EXTNAME の物理ファイル定義から作成してください。
  5. 例外処理:%ERROR/%FOUND を例外/Optional に変換してください。
  6. AS/400 のデータでテスト:実際のレガシーシステムのデータで検証してください。
  7. トランザクション:COMMIT 操作を特定し、@Transactional を使用してください。
  8. ルールを文書化:暗黙的なビジネスロジックを抽出し、文書化してください。
  9. 文字エンコーディング:EBCDIC から Unicode への変換を確認してください。
  10. バッチ処理:バッチジョブを Spring Batch フレームワークに変換してください。

エラー処理

タイプ 1:ファイル I/O エラー

検出:%ERROR または %STATUS の確認。処理:カスタム例外(CustomerNotFoundException、DataAccessException)を使った try-catch を使用します。

タイプ 2:算術オーバーフロー

検出:フィールドサイズが不十分。処理:適切なスケール/精度を指定した BigDecimal を使用し、ArithmeticException を捕捉します。

タイプ 3:依存関係の不足

検出:/COPY メンバーの不足。処理:すべてのインクルードを追跡し、共有インターフェースを作成して、Maven/Gradle の依存関係を使用します。

追加リソース

詳細なドキュメントは references/ ディレクトリを参照してください。

RPG 翻訳ルール(トピック別)

RPG 翻訳ルールは、見つけやすいようにトピック別のファイルに整理されています。

その他のリファレンスドキュメント
スクリプト

脚注/ 内の自動分析用 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 - 移行の複雑度スコアと工数の見積もりを算出します
テンプレート

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
テンプレート

一貫性のあるドキュメントを作成するには、移行レポートテンプレートを使用してください。

開発ツールとの統合

このスキルは、さまざまな開発ツールや分析ツールと統合されます。

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: コンテナーを使用したデータベース統合テストを行います

コメント