| 来看看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电子书。

steeven 2006-05-26 00:02
|