首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 EMF 模型的 GEF 連接線動態驗證機制

     編輯:Java 相關知識

背景與動機

結合 EMF(模型生成)與 GEF(圖形編輯框架)進行圖形化建模時,需在建立連線(關聯關係)前驗證其合法性。傳統方式依賴靜態 Schema 驗證(保存時才檢查),使用者體驗差。本文提出基於 EMF 生成代碼特徵的動態驗證機制,於拖曳建立連線即時判斷有效性,並給出完整真值表與實作步驟。

EMF 與 GEF 協作架構

  • EMF:依 XMI/Schema 生成模型代碼(介面 + 實作類),提供持久化機制。
  • GEF:MVC 架構,EditPart 為 Controller,Draw2D 繪製 View,模型變更自動同步視圖。
  • 連線建立流程:用戶拖曳 → Command 執行 → 模型關聯更新 → 視圖刷新 → 保存為 XMI。

EMF 生成代碼規律與關聯類型對應

假設模型 A 與 B1/B2/B3 關聯:

關聯類型EMF 生成方法特徵
一對一void setB1(B1) / B1 getB1()
一對多EList getB2()
多對多雙向 EList

Schema 驗證範例

Schema 定義複雜類型 A 包含元素 B1(maxOccurs=1)、B2(maxOccurs=unbounded)、sourceConn、targetConn。B3 不在 A 定義內,故 A-B3 連線非法。

連線建立真值表

A 包含 B已存在連線B 出現次數限制允許建立
否--否
是是-否
是否最多 1 次是
是否可多次是

動態驗證實作步驟

  1. 建立 ConnectionCreateCommand 繼承 GEF Command,實作 validateConnection()。
  2. 取得源/目標模型對應的 Java 類(如 ATypeImpl, BTypeImpl)。
  3. 判斷 A 是否包含 B:反射掃描 ATypeImpl 及父類方法,尋找 setB(B) 或 getB()。
  4. 判斷連線是否已存在:調用 ATypeImpl.getSourceConn() 遍歷連線集合,比對目標端類別名。
  5. 判斷出現次數限制:同步驟 3,若有 setB(B) 則唯一;若有 EList getB() 則可多重。
  6. 綜合真值表決定 validateConnection() 回傳值。
  7. 在 execute() 中若驗證通過,則建立連線並雙向加入 sourceConn/targetConn 集合;否則不執行。

代碼片段:驗證核心邏輯

boolean validateConnection() {
    // 1. 反射檢查包含關係
    boolean contains = hasSetterOrGetter(sourceType, targetTypeSimpleName);

    // 2. 檢查既有連線
    boolean exists = false;
    if (contains) {
        EList conns = (EList) invokeGetter(sourceInstance, "getSourceConn");
        for (Object c : conns) {
            if (c.getClass().getSimpleName().equals(targetTypeSimpleName)) {
                exists = true; break;
            }
        }
    }

    // 3. 檢查多重性
    boolean multi = hasEListGetter(sourceType, targetTypeSimpleName);

    // 4. 真值表判斷
    return contains && !exists && (multi || !hasSetter(sourceType, targetTypeSimpleName));
}

結語與限制

此機制嚴重依賴 EMF 生成代碼的固定模式(介面/實作命名、Getter/Setter 慣例),若模型代碼生成方式變更(如使用其他框架),驗證邏輯需相應調整。通用化連線驗證框架仍有待進一步研究。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved