<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    eclipshine

    Eclipse主題站

    EMF中ResourceSet和Resource等的用法。(The EMF Persistence API)

    (此文大部分翻譯整理自Eclipse Modeling Framework: A Developer's Guild的13.2章)

    EMF Persistence API中主要涉及到4個接口Resource, ResourceSet, Resource.Factory以及URIconverter。雖然EMF提供了這些接口的缺省的XML序列化的實現,但是也可以用這些API來實現其他的序列化方式,不論其是否是基于XML的,或者基于流的。

     

    URI用來表示某一類型的數據,由三個部分組成:scheme, scheme-specific part以及可選的fragmentEMF提供了自己的URI的實現(而沒有用JDKURL):org.eclipse.emf.common.util.URI

    scheme部分表示了存取resource的協議,可以使標準的file,或者是jar。在eclipse中,使用platform來存取在workspace中的resource。例如:platform:/resource/project/po.xmlEMF也提供了EcoreUtil.getPlatformResourceMap(),來將一個platformURI轉換成標準的基于本地文件系統file協議的URI

    scheme-specific part的解釋會根據具體的scheme不同而不同,但是在EMF中,使用了一種通用的層次格式,這種格式包括autority, device,以及一系列的segmentsauthority//打頭。其它均由/打頭。

    fragment表示一個resource內部的的一個部分。使用#來同其他部分分離。例如:file:/c:/dir1/dir2/myfile.xml#locEMF使用帶有fragmentURI來對resource中的EObject進行引用。每一個EMF resource都有一個唯一的URI,而每一個resource中的對象,都有一個唯一的fragement來標志它。

     

    URIConverter將一個輸入的URI轉換成一個resource的真實地URI。可以用來將一個namespace URI轉換成一個物理文件的URI,或者重定向到另外的一個老的URI上。

     

    Resource表示一個EObject的序列化容器,其實際地址由其URI所指定。Resource接口最重要的方法是save(), load()getEObject()以及getURIFragment()方法。save()load()方法在ResourceImpl中并沒有具體的處理裝載與保存的實現,具體的處理是由storage-specificresource的子類完成的。

     

    Resourceunload()方法在某些時候也會很有用。它會將Resource中的所有對象都轉換為代理對象,使得后續的調用變成ondemand的調用,這能夠讓你得到最新的數據。如果底層的文件發生了改變的話。

     

    ResourcegetEObject()方法能夠使用一個對象的fragment來存取一個EObject。例如:

    Item item = (Item)resource.getEObject("http://@orders.0/@items.2");

    要得到一個對象的fragment也很容易,使用getURIFragment()方法即可:

    String fragment = resource.getURIFragment(item);

     

    Resource.Factory是用來創建Resource的。Resource.Factory是由一個注冊庫Registry來管理,定位的。一個Resource.Factory對應于一類URI,而不是某一特定的URI。例如,缺省的registry允許你為一類的URI scheme或者extension注冊一個Resource.FactoryResource.Factory可以通過一個定義在Resource.Factory內部的Descriptor來進行注冊。Descriptor提供了創建Factory的方法。這里也是一個插件的擴展點,可以用來向系統中注冊新的Descriptor

     

    Registry可以用過其靜態的INSTANCE字段來訪問其一個實例,缺省實現是ResourceFactoryRegistryImpl。它首先會根據URIscheme來檢查protocolToFactoryMap中的Factory,如果沒有找到,則使用URI的文件的擴展名來檢查extensionToFactoryMap中是否有,如果人染沒有找到,則查找extensionToFactoryMapDEFAULT_EXTENSION(也就是*)。如果仍然沒有找到,則調用delegatedGetFactory(),允許你裝載一個自己的Factory Registry。當找到一個Descriptor之后,調用其createFactory()來創建一個Factory

    下面的這個擴展點是定義在org.eclipse.emf.ecore.xmi插件中的:

    <extension point = "org.eclipse.emf.ecore.extension_parser">

      <parser type="*"

         class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>

    </extension>

    可以看到,XMIResourceFactoryImpl被作為缺省的ResourceFactory注冊了,因此在沒有其它的Factory被注冊的時候,將缺省使用XMIResourceFactoryImpl。你也同樣可以創建新的Resource實現,以及對應的Factory,并通過上面的擴展點來進行注冊。

     

    EMF運行在非Eclipse環境下時,缺省的擴展點沒有被注冊,則需要手工的注冊:

    Resource.Factory.Registry.INSTANCE.

      getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());

    Resource.FactoryResourceSet所使用來創建Resource

     

    一個ResourceSet代表了一個Resource的集合。提供了createResource()getResource(),以及getEObject()方法。createResource()創建一個新的,空的resourcegetResource()方法也同樣創建一個resource,但是會使用給定的URI來裝載這個Resource。用戶應該始終調用ResourceSet的這兩個方法,而不是Resource的構造函數或者Resource.FactorycreateResource()方法來創建一個Resource。這是因為ResourceSet會保證相同的URI所對應的Resource不會被裝載多次,而導致內存中有相同的副本,并且,ResourceSet能夠自動處理跨文檔的引用,而Resource卻不行。

     

    EMF中資源的保存與讀取,可以通過下面的兩個簡單的代碼片斷來例示:

    裝載:

    ResourceSet resourceSet2 = new ResourceSetImpl();

    URI fileURI2 = URI.createFileURI(filepath);

    //Attention, The second parameter must be trur to get the resource for the first time.

    Resource poResource2 = resourceSet2.getResource(fileURI2, true);

     

    保存也很簡單:

    URI fileURI = URI.createFileURI(filepath);

    Resource poResource = resourceSet.createResource(fileURI);

    poResource.getContents().add(model);

    try {

           poResource.save(null);

    } catch (IOException e) {

           assertTrue("IOException: " + e.getMessage(), false);

    }

    posted on 2005-08-07 09:51 Living Not Striving 閱讀(4863) 評論(5)  編輯  收藏 所屬分類: EMF

    評論

    # re: EMF中ResourceSet和Resource等的用法。(The EMF Persistence API) 2005-12-24 12:41 Jet Geng

    唉,我也在寫這樣的一篇文章。不過看到你已經寫了。我的東西就沒有必要發出來。呵呵。
    不過找到有人可以一起學習,挺happy。

      回復  更多評論   

    # re: EMF中ResourceSet和Resource等的用法。(The EMF Persistence API) 2006-05-26 16:19 bobby

    很好,先謝過  回復  更多評論   

    # re: EMF中ResourceSet和Resource等的用法。(The EMF Persistence API) 2006-07-06 23:02 ncainiao

    我想把resource的內容寫成我自己定義格式的xml,怎么做呢?我只知道大概是要實現自己的doSave方法,那豈不是也要同時定義doLoad方法?

    沒有更好更優雅的方法嗎?

    你有沒有這方面的例子?再補充補充:)  回復  更多評論   

    # 怎樣從emf編輯器中讀取現有的Resource的內容那? 2007-05-30 21:25 cansen

    怎樣從emf編輯器中讀取現有的Resource的內容那?謝謝  回復  更多評論   

    # re: EMF中ResourceSet和Resource等的用法。(The EMF Persistence API) 2007-07-17 18:04 autumn_it@163.com

    @ncainiao
    不是重寫doSave(),而是要重寫XMLHelperImpl和XMLSaveImpl。
    你可以自己寫一個實現繼承原有的實現類,然后改寫里面的部分方法,比如要改一對多的composition聯就改saveContainedMany().
    另外還要定義你自己的Resource,并注冊你需要的后綴。
    研究一下那幾個類的代碼就知道了  回復  更多評論   

    主站蜘蛛池模板: 日韩一区二区免费视频| 国产成人精品免费视频动漫| 好吊妞998视频免费观看在线| 亚洲色成人网一二三区| 无码人妻精品中文字幕免费| 亚洲人精品午夜射精日韩| 日韩精品无码免费专区午夜 | 暖暖免费在线中文日本| 国产成人亚洲精品青草天美| 永久免费av无码网站yy| 亚洲国产另类久久久精品黑人| 怡红院免费全部视频在线视频| 亚洲AV无码专区在线播放中文| 18禁美女黄网站色大片免费观看 | 91精品免费久久久久久久久| 亚洲国产理论片在线播放| 国产精品成人免费一区二区| 亚洲avav天堂av在线网毛片| 又色又污又黄无遮挡的免费视 | 免费视频中文字幕| 免费播放国产性色生活片| 国内精品99亚洲免费高清| 久久香蕉国产线看免费| 亚洲人成高清在线播放| vvvv99日韩精品亚洲| 久久国产免费观看精品| 亚洲妇女水蜜桃av网网站| 国产精品二区三区免费播放心| 成年免费a级毛片| 久久精品国产亚洲av高清漫画| 成人奭片免费观看| 一级人做人爰a全过程免费视频 | 一级做a爰片久久毛片免费看 | 亚洲一线产区二线产区精华| 午夜国产大片免费观看| 久久久国产精品福利免费| 美女视频黄免费亚洲| 亚洲中文字幕在线乱码| 97在线观免费视频观看| 丰满人妻一区二区三区免费视频| 亚洲日本国产精华液|