來看看ResourceSet.createResource(URI):Resource方法,從URI到Resource的過程如下:
1. getResourceFactoryRegistry()
??public?Resource.Factory.Registry?getResourceFactoryRegistry()
??
{
????
if?(resourceFactoryRegistry?==?null)
????
{//可以自行Set一個注冊表實現(xiàn),沒有的話用系統(tǒng)缺省注冊表
??????resourceFactoryRegistry?=
????????
new?ResourceFactoryRegistryImpl()
????????
{
??????????
public?Resource.Factory?delegatedGetFactory(URI?uri)
??????????
{
????????????
return?Resource.Factory.Registry.INSTANCE.getFactory(uri);
??????????}

????????}
;?//代理系統(tǒng)注冊表,注意這個應(yīng)該是正宗的。
????}

????
return?resourceFactoryRegistry;
??}

所以自己new 出來的ResourceSet可以向注冊表中任意添加工廠實現(xiàn)。
2. 調(diào)用注冊表的getFactory(URI), 實現(xiàn)如下:
?public?Resource.Factory?getFactory(URI?uri)
??
{
????String?protocol?
=?uri.scheme();
????Object?resourceFactory?
=??protocolToFactoryMap.get(protocol);?//先根據(jù)protocol查找
????if?(resourceFactory?==?null)
????
{
??????String?extension?
=?uri.fileExtension();
??????resourceFactory?
=?extensionToFactoryMap.get(extension);?//找不到再根據(jù)擴展名查找
??????if?(resourceFactory?==?null)
??????
{
????????resourceFactory?
=?extensionToFactoryMap.get("*");?//嘗試查找缺省擴展
????????if?(resourceFactory?==?null)
????????
{
??????????resourceFactory?
=?delegatedGetFactory(uri);?//自行實現(xiàn)可以擴展此方法解析。
????????}

??????}

????}


????
//Descriptor可以用于編程使用
????return?
??????resourceFactory?
instanceof?Resource.Factory.Descriptor??
????????((Resource.Factory.Descriptor)resourceFactory).createFactory()?:
????????(Resource.Factory)resourceFactory;
??}

查找一個工廠居然這么復雜!正因為這么復雜,才能支持platform/file/fttp等眾多千奇百怪的URI
不同類型的工廠加工出不同類型的Resource, 才會輸出為XSD/XML/XMI/....

如果直接操作系統(tǒng)注冊表要小心。EMF中定義了幾個擴展點,可以實現(xiàn)類似目的。
已知的ResourceFactory實現(xiàn)有:XSD/ECore/EMOF/XML/XMI,XSD的輸出方法的介紹可以參考Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework電子書。