來看看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電子書。