EMF學習,爲了實現可擴展可自定義的模型驗證 - emf quary 與 OCL

http://blog.csdn.net/javaman_chen/article/details/6020050java

//這裏的驗證強調的是condition的構造,基於查找來判斷驗證結果。支持OCL也支持java本身編寫。框架

quary的基本邏輯是:編寫約束條件,執行語句條件的查詢,根據查詢結果判斷驗證結果。eclipse

OCL的實現自己也依賴於Quaryide

Quary依賴於條件,條件集成自java的條件,基本的驗證邏輯是:構造條件,根據isSatisfied(object)函數執行判斷是否知足。函數

emf的驗證能夠採用上述的方式,能夠採用較爲複雜的形式,即經過select語句執行驗證。學習

EMF查詢框架主要由 org.eclipse.emf.query 這個plugin提供,建立並執行一個EMF查詢,大概分爲以下幾步:
1. 建立查詢數據源;
2. 構造EObjectCondition查詢條件; spa

(1)用java構造.net

  (a)繼承EObjectCondition,實現isSatistied函數來編寫本身的約束。對象

private static  class ProductsLessThan3Condition extends EObjectCondition {
        public ProductsLessThan3Condition() {
            super(PruneHandler.NEVER);
        }
        @Override
        public boolean isSatisfied(EObject eObject) {
            if (eObject instanceof Category) {
                Category category = (Category) eObject;
                EList products = category.getProducts();
                if (products.size() < 3)
                    return true;
            }
            return false;
        }
    }
blog

  (b)利用框架已提供的條件

   EObjectCondition inShopCondition = new IN(categorySet);

(2)用OCL構造

  1. EObjectCondition tolerableRead = new BooleanOCLCondition<EClassifier, EClass, EObject>(  
  2.     ocl.getEnvironment(),//ocl根環境  
  3.     "self.category <> BookCategory::Mystery implies self.pages < 200",//ocl約束  
  4.     EXTLibraryPackage.Literals.BOOK);//約束上下文  

  構造參數中,還能夠不指定約束的上下文(即第3個構造參數爲null),這樣任何EMF實體若是含有category屬性都會在該實體類上執行
"self.category <> BookCategory::Mystery implies self.pages < 200"約束檢測。
3. 使用EMF查詢框架提供的SELECT對象和UPDATE對象編寫查詢和更新語句;

   statement = new SELECT(new FROM(shop), new WHERE(new ProductsLessThan3Condition()));

4. 執行語句獲得查詢或更新結果;

  results = statement.execute();

  1. IQueryResult result = new SELECT(//查詢結果封裝成IQueryResult對象  
  2.         new FROM(searchScope),  
  3.         new WHERE(conditions))  
  4.     .execute();  

5. 對執行結果進行檢測,確保執行過程當中沒有發生異常。

        for(Object object : results)
        {
            System.out.println(object);
        }

EMF提供了兩套Query對象,SELECT和UPDATE,分別用於模型的查詢操做和更新操做。

評估:

1.OCL語句能夠靈活插入,主體語句放在第二個參數,約束上下文的定義放在第三個參數。所以比較符合可擴展驗證的特性。

2.emf的驗證若是採用OCL能夠不採用select執行的方式,而是擦用condition自帶的isSatisfied的方法。找一下OCL有沒有?

3.OCL條件的開發須要再學習一下。

4.能夠經過模型遍歷,而後判斷類型,以後分配給對應的satisfied,這個比較適合,須要查看一下輸入的模型類型

5.看例子中須要本身構造集合,集合須要什麼類型的,如何進行遍歷。。。。

6.validation framework可以給定一個root而後進行遍歷, 可是在這裏,須要本身去找全部的對象集合。

7.在執行約束是就須要可以識別對應的元模型類別,即在編譯時已經有全部的元模型類經過編譯,而元模型類的導入只能在運行時執行,因此這裏須要反射機制?

遍歷,構造集合,交給對應的條件的isSatisfied

 

進一步的OCL開發

http://blog.csdn.net/javaman_chen/article/details/6017948

下一步:OCL的實例開發

相關文章
相關標籤/搜索