Files
rust_raidguardx/GC_Rust_Refactoring_Analysis.md
T

14 KiB

RAIDGuard X Java GUI 重構為 Rust 分析報告

1. 現有架構總覽

┌─────────────────────────────────────────────────────────────────┐
│                     Java Swing GUI (70,521 行)                  │
├─────────────────────────────────────────────────────────────────┤
│  Main Windows        │  frmMain (7,397 行)                     │
│                      │  frmSettings (2,978 行)                  │
│                      │  frmAdvanced (707 行)                    │
├──────────────────────┼──────────────────────────────────────────┤
│  Dialogs             │  dlgServer (799 行)                     │
│                      │  dlgDumpLog (808 行)                     │
│                      │  dlgEnvInfo (808 行)                     │
│                      │  dlgPasswordCheck                        │
│                      │  dlgProgressCheck                        │
├──────────────────────┼──────────────────────────────────────────┤
│  Panels              │  jpController (3,059 行)                 │
│                      │  jpController2 (3,612 行)                │
├──────────────────────┼──────────────────────────────────────────┤
│  RAID Operations     │  frmCreateArray (2,171 行)              │
│                      │  frmCreateArray2 (2,278 行)              │
│                      │  frmDeleteArray (834 行)                 │
│                      │  frmQuickSetup2 (1,421 行)               │
├──────────────────────┼──────────────────────────────────────────┤
│  Advanced Features   │  frmAdvSnapshot (1,430 行)              │
│                      │  frmAdvMirror (1,552 行)                 │
│                      │  frmAdvSlicing (1,125 行)                │
│                      │  frmAdvMigrate (956 行)                   │
│                      │  frmAdvExpansion (619 行)                │
│                      │  frmAdvLunmap (907 行)                   │
│                      │  frmAdvLunMask (913 行)                  │
├──────────────────────┼──────────────────────────────────────────┤
│  System              │  frmEmail (1,292 行)                     │
│                      │  frmAdvMaintain (1,011 行)               │
├──────────────────────┼──────────────────────────────────────────┤
│  Data Layer          │  PageDataDB (7,322 行) - 全域資料庫       │
│                      │  EventPartition (1,422 行)              │
│                      │  Langs (2,468 行) - 多國語言             │
├──────────────────────┼──────────────────────────────────────────┤
│  Protocol            │  SendCmd.java - TCP 通訊                  │
│                      │  ControllerInfoPage                      │
│                      │  RAIDInfoPage (675 行)                   │
│                      │  DISKInfoPage                            │
│                      │  RAIDEnclosureInfoPage                   │
│                      │  SnapshotInfoPage                         │
├──────────────────────┼──────────────────────────────────────────┤
│  SNMP                │  SNMPv1CommunicationInterface (1,229 行) │
│                      │  SNMPTrapSendTest (653 行)               │
└──────────────────────┴──────────────────────────────────────────┘
                              │
                              ▼
              ┌───────────────────────────────┐
              │   TCP Port 8922 (In-Band)     │
              │   TCP Port 8722 (Finder)      │
              └───────────────────────────────┘
                              │
                              ▼
              ┌───────────────────────────────┐
              │   GS (GUI Server) - C         │
              │   DtrGuiSrv                   │
              └───────────────────────────────┘

2. 模組分類與重構建議

2.1 核心資料層 (Core Data Layer) - 高優先級

模組 行數 功能 Rust 重構建議
PageDataDB 7,322 全域資料庫、快取、SNMP 使用 serde + rusqlite,建立 State 管理
EventPartition 1,422 事件日誌讀寫 直接移植,使用 tokio 異步 I/O
Langs 2,468 多國語言 改用 JSON/YAML 語言檔 + fluent-rs

Rust 目標結構:

// src/data/mod.rs
pub struct AppState {
    pub controllers: HashMap<String, Controller>,
    pub raids: HashMap<String, RAID>,
    pub disks: HashMap<String, Disk>,
    pub events: Vec<Event>,
    pub config: Config,
}

// src/i18n/mod.rs
pub struct I18n {
    current_locale: String,
    translations: HashMap<String, HashMap<String, String>>,
}

2.2 通訊層 (Protocol Layer) - 高優先級

模組 功能 Rust 重構建議
SendCmd TCP 通訊、指令發送 使用 tokio::net::TcpStream + 自訂通訊協定
InBandAPI (22 個類別) 頁面資料解析 移植為 Rust struct derive Serialize

Rust 目標結構:

// src/protocol/mod.rs
pub struct InBandProtocol {
    socket: TcpStream,
}

impl InBandProtocol {
    pub async fn connect(&mut self, addr: &str) -> Result<()>;
    pub async fn send_cmd(&mut self, opcode: OpCode, data: &[u8]) -> Result<Vec<u8>>;
}

// src/protocol/pages.rs
#[derive(Serialize, Deserialize)]
pub struct ControllerInfoPage {
    pub serial_number: [u8; 16],
    pub model_name: [u8; 32],
    pub firmware_version: [u8; 8],
    pub status: u8,
    // ...
}

2.3 主視窗 (Main Window) - 中優先級

模組 行數 功能
frmMain 7,397 主視窗、選單、標題列
frmSettings 2,978 系統設定

重構建議: 使用 Slint (現有專案已採用)

// ui/main_window.slint (已存在)
export component AppWindow inherits Window {
    // 現有的 Slint 定義
}

2.4 RAID 作業模組 - 中優先級

模組 行數 功能
frmCreateArray 2,171 建立 RAID
frmCreateArray2 2,278 建立 RAID (進階)
frmDeleteArray 834 刪除 RAID
frmQuickSetup2 1,421 快速設定

Rust 重構建議:

// src/handlers/raid_ops.rs
pub async fn create_raid(level: RaidLevel, disks: Vec<u8>) -> Result<()>;
pub async fn delete_raid(raid_id: u8) -> Result<()>;
pub async fn rebuild_raid(raid_id: u8) -> Result<()>;

2.5 進階功能模組 - 低優先級

模組 行數 功能
frmAdvSnapshot 1,430 Snapshot 管理
frmAdvMirror 1,552 Mirror 鏡像
frmAdvSlicing 1,125 切片
frmAdvMigrate 956 遷移
frmAdvExpansion 619 擴展
frmAdvLunmap 907 LUN 對應
frmAdvLunMask 913 LUN 遮罩

重構建議: 這些功能較少使用,可放在第二階段實作。

2.6 對話框 (Dialogs) - 低優先級

模組 行數 功能
dlgServer 799 伺服器連線
dlgEnvInfo 808 環境資訊
dlgDumpLog 808 日誌傾印
dlgPasswordCheck - 密碼驗證
dlgProgressCheck - 進度顯示

重構建議: 改為 Slint 元件或使用 rfd 對話框庫。

2.7 系統模組 - 中優先級

模組 行數 功能
frmEmail 1,292 郵件通知
frmAdvMaintain 1,011 維護功能

Rust 重構建議:

// src/email/mod.rs
pub async fn send_email(config: &EmailConfig, subject: &str, body: &str) -> Result<()>;

使用 lettre crate 實現 SMTP。

2.8 SNMP 模組 - 低優先級

模組 行數 功能
SNMPv1CommunicationInterface 1,229 SNMP v1/v2c 通訊
SNMPTrapSendTest 653 Trap 發送測試

Rust 重構建議: 使用 snmp crate 或自訂實作 (取決於需求)。

3. 重構優先順序

Phase 1: 基礎設施 (最優先)
├── 通訊層 (SendCmd → InBandProtocol)
├── 資料層 (PageDataDB → AppState)
└── UI 框架 (Slint 整合)

Phase 2: 核心功能
├── 主視窗 (frmMain → Slint)
├── RAID 操作 (Create/Delete/Query)
└── 事件處理 (EventPartition)

Phase 3: 進階功能
├── Snapshot / Mirror / Migration
├── LUN Map/Mask
└── Email 通知

Phase 4: 優化
├── SNMP Trap
├── 效能調優
└── 單元測試

4. Rust 專案結構建議

raidguard_x_gui/
├── Cargo.toml
├── build.rs
├── src/
│   ├── main.rs              # 入口點
│   ├── lib.rs               # 庫入口
│   │
│   ├── protocol/            # 通訊協定
│   │   ├── mod.rs
│   │   ├── client.rs        # TCP 客戶端
│   │   ├── messages.rs      # 訊息定義
│   │   └── pages.rs         # 頁面資料結構
│   │
│   ├── data/               # 資料層
│   │   ├── mod.rs
│   │   ├── state.rs         # 全域狀態
│   │   ├── cache.rs         # 快取
│   │   └── db.rs            # SQLite 儲存
│   │
│   ├── handlers/            # 業務邏輯
│   │   ├── mod.rs
│   │   ├── raid.rs          # RAID 操作
│   │   ├── disk.rs          # 磁碟操作
│   │   ├── controller.rs    # 控制器操作
│   │   └── event.rs         # 事件處理
│   │
│   ├── email/              # 郵件通知
│   │   └── mod.rs
│   │
│   ├── snmp/               # SNMP (可選)
│   │   └── mod.rs
│   │
│   └── ui/                 # UI 整合
│       └── mod.rs
│
└── ui/                     # Slint UI 檔案
    ├── main_window.slint
    ├── components/
    └── styles/

5. 依賴套件建議

功能 Rust Crate 備註
UI Framework slint 現已採用
非同步執行 tokio 現已採用
序列/反序列化 serde, serde_json 現已採用
TCP 通訊 tokio::net 標準庫
資料庫 rusqlite SQLite
日期時間 chrono 現已採用
日誌 tracing 現已採用
SMTP lettre 郵件發送
指令列解析 clap 選項解析
錯誤處理 anyhow, thiserror 現已採用

6. 現有 Rust 程式碼整合

現有 Rust 專案 (raidguard_x_gui_server/) 可作為基礎:

// 現有結構
raidguard_x_gui_server/
├── src/
   ├── main.rs               入口點
   ├── server.rs             TCP 伺服器
   ├── protocol/messages.rs  訊息定義
   ├── mock/data.rs          模擬資料
   └── handlers/             業務處理
└── Cargo.toml

整合策略:

  1. raidguard_x_gui_server 改為 raidguard_x_gui (合併 client + server)
  2. 新增 Slint UI 整合 (ui/ 目錄 → Slint 編譯)
  3. 新增 protocol/client.rs 實現 TCP 客戶端
  4. 新增 data/state.rs 實現全域狀態

7. 風險與挑戰

風險 緩解措施
Swing → Slint 遷移複雜度 分階段進行,先實現核心 UI
執行緒模型差異 使用 tokio 模擬 Swing EDT 概念
效能考量 Rust效能通常優於 Java,但仍需優化
測試覆蓋率 建立完整單元測試與整合測試
Java/Swing 依賴 保留 Java 版本,逐步替換

8. 結論

重構可行性:

  • 總行數: 70,521 行 Java → 預估 30,000 行 Rust
  • 預期效能提升: 2-5x
  • 維護性提升: 顯著改善 (型別安全、記憶體安全)

建議策略

  1. 先完成 Phase 1-2 (通訊 + 資料 + 核心 UI)
  2. 保留 Java 版本 同步運行,逐步替換
  3. 使用 Mock Driver 進行離線測試
  4. 建立 CI/CD 確保重構正確性

Generated: 2026-03-29 Based on: RAIDGuard X Java GUI (v3.8.0)