熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

EMF編程使用

2013-11-23 20:22:11  來源: Java開源技術 

  看到eclipse裡面的GMF 覺得比較有趣底層還是用到了EMF 花了兩天時間仔細研究了以下EMF的確是個好東西

EMF根據ecore建模(可以和schema的xsd相互轉換)生成強類型的EMF代碼 這個強類型更強的地方是可以取得meta信息從而可以用於校驗和界面輔助信息的生成類似於動態bean屬性也可以根據名稱動態取得

以前考慮過用xsd描述界面 但是數據載體只能是xml 即使利用apache的schema編譯工具生成強類型的類後台代碼也是xml 不利於持久化 emf在代碼生成引擎比較智能可以標記出用戶代碼和自動生成代碼不會有生成覆蓋問題

這裡做個簡單示例:
Ecore:
可以新建Ecore 建立好以後用GMF可視化編輯(EclipseRC)

生成Model:
點擊myecore文件菜單:File>New>Other>Eclipse Modeling Framework>EMF Model
打開生成的mygenmodel 選擇樹頂點的:Generate Model Code
生成的代碼裡面會有一個編譯錯誤 是中文編程的問題 中文沒有大小寫(先天不足啊)結果性別這個成員變量和性別類名混淆出錯在錯誤代碼前面加上包全名即可
利用生成的代碼構建一個家庭輸出xml並且校驗之:


import  javaioIOException;
import  javautilIterator;

import  monutilDiagnostic;
import  monutilURI;
import  orgeclipseemfecoreEObject;
import  orgeclipseemfecoreresourceResource;
import  orgeclipseemfecoreutilDiagnostician;
import  orgeclipseemfecorexmiXMLResource;
import  orgeclipseemfecorexmiimplXMLResourceImpl;
import  orgsteevenfamilyFamilyFactory;
import  orgsteevenfamily人物;
import  orgsteevenfamily家庭;
import  orgsteevenfamily性別;

public   class  TestMy  {

     public   static   void  main(String[] args)  throws  IOException  {
        testFamily();
    }

     private   static   void  testFamily()  throws  IOException  {
        家庭 family  =  FamilyFactoryeINSTANCEcreate家庭();
        familysetTitle( steeven家 );
        familyset老公(FamilyFactoryeINSTANCEcreate人物());
        familyget老公()set姓名( steeven );
        familyset老婆(FamilyFactoryeINSTANCEcreate人物());
        familyget老婆()set姓名( stella );
        familyget老婆()set性別(性別女_LITERAL);
        人物 sophie  =  FamilyFactoryeINSTANCEcreate人物();
        sophieset姓名( sophie );
        sophieset性別(性別女_LITERAL);
        familyget兔崽子()add(sophie);
        dump(family);
        validate(family);
    }

     private   static   void  validate(EObject family)  {
        Diagnostic diagnostic  =  DiagnosticianINSTANCEvalidate(family);
        Systemoutprintln(diagnostic);
         for  (Iterator it  =  diagnosticgetChildren(erator(); ithasNext();)  {
            Diagnostic diag  =  (Diagnostic) itnext();
            Systemoutprintln(diaggetMessage());
        }
    }

     private   static  Resource dump(EObject objs)  throws  IOException  {
         //  ResourceSet rs = new ResourceSetImpl();
         //  rsgetResourceFactoryRegistry()getExtensionToFactoryMap()put(
         //  ResourceFactoryRegistryDEFAULT_EXTENSION
         //  new XMIResourceFactoryImpl());
         //  Resource resource = rscreateResource(URI
         //  createFileURI(c:\\temp\\testxml));
        XMLResource resource  =   new  XMLResourceImpl(URI
                createFileURI( c:\\temp\\testxml ));
        resourcesetEncoding( GBK );
         for  (EObject obj : objs)
            resourcegetContents()add(obj);  //  目前版本不加入resource驗證會報singling異常
        resourcesave(Systemout  null );
         return  resource;
    }
}

  運行結果如下:


<? xml version= encoding=GBK ?>
< family: 家庭 xmlns:family =  title =steeven家  老公 =/  老婆 =/  兔崽子 =/ />
Diagnostic ERROR 
The feature 老公 of orgsteevenfamilyimpl家庭Impl@fa{file:/c:/temp/testxml#/} contains a dangling reference orgsteevenfamilyimpl人物Impl@eba{#//}
The feature 老婆 of orgsteevenfamilyimpl家庭Impl@fa{file:/c:/temp/testxml#/} contains a dangling reference orgsteevenfamilyimpl人物Impl@cdef{#//}
The feature 兔崽子 of orgsteevenfamilyimpl家庭Impl@fa{file:/c:/temp/testxml#/} contains a dangling reference orgsteevenfamilyimpl人物Impl@fd{#//}

可見輸出的xml中沒有包含人物的具體信息 修改myecore中老公/老婆/兔崽子屬性的containment屬性為true重新生成代碼後運行結果如下:

<?xml version= encoding=GBK?>
<family:家庭 xmlns:family= title=steeven家>
  <老公 姓名=steeven/>
  <老婆 性別= 姓名=stella/>
  <兔崽子 性別= 姓名=sophie/>
</family:家庭>
Diagnostic OK

====================
EMF單獨運行成功~

這裡ECORE似乎不支持嵌套定義不像schema那樣一個complexType聲明裡面可以定義的很復雜 也不像Java的內部類 似乎被作了簡化 更像關系數據庫表之間的關系

待求證問題:
EMF的校驗信息是否支持國際化
EMF數據的能否更方便的保存到數據

EMF的靈活和強大已經驗證過 用於C/S還是B/S應該都不是問題

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28388.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.