來看看ResourceSet.createResource(URI):Resource方法,從URI到Resource的過程如下:
1. getResourceFactoryRegistry()
??public?Resource.Factory.Registry?getResourceFactoryRegistry()

??
{
????if?(resourceFactoryRegistry?==?null)

????
{//可以自行Set一個注冊表實現,沒有的話用系統缺省注冊表
??????resourceFactoryRegistry?=
????????new?ResourceFactoryRegistryImpl()

????????
{
??????????public?Resource.Factory?delegatedGetFactory(URI?uri)

??????????
{
????????????return?Resource.Factory.Registry.INSTANCE.getFactory(uri);
??????????}
????????};?//代理系統注冊表,注意這個應該是正宗的。
????}
????return?resourceFactoryRegistry;
??}
所以自己new 出來的ResourceSet可以向注冊表中任意添加工廠實現。
2. 調用注冊表的getFactory(URI), 實現如下:
?public?Resource.Factory?getFactory(URI?uri)

??
{
????String?protocol?=?uri.scheme();
????Object?resourceFactory?=??protocolToFactoryMap.get(protocol);?//先根據protocol查找
????if?(resourceFactory?==?null)

????
{
??????String?extension?=?uri.fileExtension();
??????resourceFactory?=?extensionToFactoryMap.get(extension);?//找不到再根據擴展名查找
??????if?(resourceFactory?==?null)

??????
{
????????resourceFactory?=?extensionToFactoryMap.get("*");?//嘗試查找缺省擴展
????????if?(resourceFactory?==?null)

????????
{
??????????resourceFactory?=?delegatedGetFactory(uri);?//自行實現可以擴展此方法解析。
????????}
??????}
????}

????//Descriptor可以用于編程使用
????return?
??????resourceFactory?instanceof?Resource.Factory.Descriptor??
????????((Resource.Factory.Descriptor)resourceFactory).createFactory()?:
????????(Resource.Factory)resourceFactory;
??}
查找一個工廠居然這么復雜!正因為這么復雜,才能支持platform/file/fttp等眾多千奇百怪的URI
不同類型的工廠加工出不同類型的Resource, 才會輸出為XSD/XML/XMI/....
如果直接操作系統注冊表要小心。EMF中定義了幾個擴展點,可以實現類似目的。
已知的ResourceFactory實現有:XSD/ECore/EMOF/XML/XMI,XSD的輸出方法的介紹可以參考Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework電子書。
1. getResourceFactoryRegistry()
























2. 調用注冊表的getFactory(URI), 實現如下:
































查找一個工廠居然這么復雜!正因為這么復雜,才能支持platform/file/fttp等眾多千奇百怪的URI
不同類型的工廠加工出不同類型的Resource, 才會輸出為XSD/XML/XMI/....
如果直接操作系統注冊表要小心。EMF中定義了幾個擴展點,可以實現類似目的。
已知的ResourceFactory實現有:XSD/ECore/EMOF/XML/XMI,XSD的輸出方法的介紹可以參考Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework電子書。