随笔:24 文章:1 评论:66 引用:0
BlogJava 首页 发新随笔
发新文章 联系 聚合管理

2006年5月26日

测试一下getResource(URI,boolean):

        System.out.println(EcorePackage.eINSTANCE.eResource());  // 1
        System.out.println(XMLTypePackage.eINSTANCE.eResource());  // 2

        ResourceSet rs 
=   new  ResourceSetImpl();
        rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
                Resource.Factory.Registry.DEFAULT_EXTENSION,
                
new  XMIResourceFactoryImpl());
        String uri 
=   " http://abc.eg/asdf " ;
//         System.out.println(rs.createResource(URI.createURI(uri)));  //  如果创建过临时的,得到这个
//         System.out.println(rs.createResource(URI.createURI(uri)));  //  如果创建过多个临时的,返回第一个,这个忽略
        rs.getPackageRegistry().put(uri, EcorePackage.eINSTANCE);  // 得到结果同1,如果上面取消注释,本地创建的优先

        System.out.println(rs.getResource(URI.createURI(uri), 
false ));  // 同1


createResource每次创建新的,getResource则是唯一实例的。

每个生成的XxxPackage.eINSTANCE会自行创建自己的Resource。如果在插件中修改了EcorePackge.eInstance.eResource(),会不会天下大乱呢?

==================
eclispe编辑器右边的Mark Occurrence很方便,但是家里电脑上的这个黄色小标记很不清楚。前几天调整了老半天,修改配色方案,换显示器驱动,调整显示器对比度、亮度都收效不大。昨天偶然把XP的桌面风格换回传统模式,搞定了。

ecore.ecore这个问题很有意思,以前看过schema.xsd,就是自己定义自己。据说JDK也是用java开发编译出来的。。。
先有鸡还是现有蛋呢?

posted @ 2006-05-26 10:22 steeven 阅读(714) | 评论 (1)编辑 收藏
 

在RS中同一URI可以createResource多个Resource,List方式存放。还存在另外一种Map存放方式, getResource(URI,boolean loadOnDemand)就是通过这种方式存取,如果不存在的话创建。这两个方法看起来有些冲突。似乎用于不同场合。

再来看看怎样通过URL存取EObject:
RS整个相当于一个DataBase, Resource相当于表,存放的是EObject, 每个EObject可以看成对象或者XML。
表用URI来区分,URI中的Segment用来定位EObject。URI的例子参见探索(1)
getEObject(URL, boolean loadOnDemand)很简单,getResource找到对应的Resource,在里面根据Segment查找,就是那个#///@xxx.n格式的东西,注意,还有ID方式。

getPackageRegistry()用来返回RS的URL->Package注册表,它也是个本地的注册表,代理了全局的EPackage.Registry.INSTANCE。这个注册表用于取得EPackage(类型信息)和EFactory(创建实例)


Resource就不说了,主要load,save, 一些具体子类,比如XmlResourceImpl可以直接使用,指定Encoding之类。

看看ResourceSet对EMF了解了很多~

posted @ 2006-05-26 01:23 steeven 阅读(769) | 评论 (0)编辑 收藏
 
来看看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电子书。



posted @ 2006-05-26 00:02 steeven 阅读(759) | 评论 (0)编辑 收藏
CALENDER
<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(7)

随笔分类

随笔档案

文章档案

相册

我的链接

搜索

  •  

最新评论


Powered By: 博客园
模板提供沪江博客