`
yiliner
  • 浏览: 211177 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EMF的一些总结(2)——关于EMF的序列化

    博客分类:
  • EMF
阅读更多

关于EMF的序列化
对于EMF的序列化有几个比较重要的接口:Resource,ResourceSet,Resource.Factory,URIConverter。这些接口的主要作用就是保存模型到持久化存储介质,或者从持久化存储介质加载模型。
1.关于URI(Uniform Resource Identifier)
在EMF 中是通过URI来标识package的,并且同过URI来唯一的确定resources。URI包括三个部分:a scheme, a scheme-specific part和an optional fragment。scheme主要决定了访问资源的协议;比如:Platform:/resource/……中的platform。scheme- specific part 包含一些authority,device和一些segments,如file:/c:/dir1/dir2/myfile.xml,file是协议,没有authority,c:是device,剩下的3个是segments。URI fregment标识了resource内部的某个具体的内容。如:file:/c:/dir1/dir2/myfile.xml#loc中的#loc。 EMF通过带有fregment的URI来访问资源中的EObjects。
2.关于URIConverter
URIConverter的作用是normalize一个输入URI,使之成为一个实际的针对某个resource的URI。它可以把namespace URIs(比如:http:///com/example/epo2.ecore)映射到物理文件的URIs, 或者重定向旧的(或别名)的URI参考到一个具体的实际的location。

一个URIConverter维护一个URI到URI的映射集合。比如,把一个命名空间URI映射到物理文件:

URIConverter converter = new URIConverterImpl();

URI uri1 
= URI.createURI("http:///somemodel.ecore");
URI uri2 
=
  URI.createURI(
"platform:/resource/project/somemodel.ecore");
converter.getURIMap().put(uri1, uri2);

在如下面代码:

URI normalized = converter.normalize(uri1);
System.out.println(normalized);

打印的结果是:platform:/resource/project/somemodel.ecore
URIConverter.normalize()方法只是简单的同过映射的map把key替换成了相应的value。
URIConverter的最原始是应用在resource sets,用来定位resources.

3.关于Resource和ResourceSet
Resource 表示一个持久化的EOjbects的容器;ResourceSet表示一组Resource的集合,集合中的Resource同时创建或加载。 Resource中比较重要的就是save和load方法,还有通过URI fregments访问资源中的Object的机制,如:

Resource resource = 
Item item 
= (Item)resource.getEObject("//@orders.0/@items.2");

Item item 
= 
String fragment 
= resource.getURIFragment(item);

上面代码中的两个方法,getEObject通过带有fregment的URI获得一个EObject,与之相反的方法getURIFragment()通过EObject获得相应的fragment path。

ResourceSet中有些重要的方法:
createResource()创建一个空的Resource;
getResource()通过resource的URI来创建Resource;
getEObject(),通过URI中的fregment来获得具体的EObject对象。

4.关于Resource.Factory
用来创建Resource,resource factory 要注册到Registry实例中。一个factory 可以通过多种方式的URIs来注册,包括URI scheme或者URI的extension。在插件方式的应用中,通过扩展点的方式在插件加载的时候注册descriptor。

下面是Resource的源代码

public interface Resource extends Notifier
{
  
interface Factory
  
{
    Resource createResource(URI uri);

    
interface Descriptor
    
{
      Factory createFactory();
    }

    
interface Registry
    
{
      Factory getFactory(URI uri);

      Map getProtocolToFactoryMap();

      String DEFAULT_EXTENSION 
= "*";

      Map getExtensionToFactoryMap();

      Registry INSTANCE 
= new ResourceFactoryRegistryImpl();
    }

  }

}



下面是Registry中的getFactory()方法的算法(引用原文):

  1. Check for a factory in the protocolToFactoryMap, using the scheme of the URI.

  2. If nothing was found, check the extensionToFactoryMap using the file extension of the URI.

  3. If still nothing was found, check the extensionToFactoryMap using the DEFAULT_EXTENSION (that is, the wildcard character "*").

  4. If no extension match was found, call the delegatedGetFactory() method. This allows you to supply your own factory registry, with its own lookup criteria.

  5. If a descriptor was found, instead of an actual factory, call the createFactory() method on the descriptor to create the factory.

  6. Finally, return the factory if one was found, or null.

tip:emf缺省的序列化方式是XMI。因此,如果没有找到相应注册的factory缺省的就会返回以*注册的缺省的factory,这个factory是针对XMI的factory,即XMIResourceFactoryImpl。如,对于 XMIResourceFactoryImpl的扩展点声明:

 

<extension point = "org.eclipse.emf.ecore.extension_parser">
  
<parser type="*"
     class
="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>
</extension>

    当非插件应用的时候,可以通过手工的方式来注册factory,如:
    Resource.Factory.Registry.INSTANCE.
      getExtensionToFactoryMap().put(
    "*"new XMIResourceFactoryImpl());

分享到:
评论

相关推荐

    用动态EMF构建元模型

    创建动态内存内核模型序列化动态模型反序列化/装载动态模型限制结束语下载参考资料通过本文可以了解如何使用DynamicEclipseModelingFramework(EMF)在不生成Java实现类的情况下根据需要构建动态的基于Ecore的模型。...

    EMF Search Plugin-开源

    EMF 搜索插件——这个 Eclipse 3.0 插件提供了一个专门用于搜索序列化到工作区资源的 EMF 模型实例数据的搜索页面。 当前支持的是常规文本搜索和 XPath 搜索(使用 Jakarta JXPath)。

    node-emfjson:序列化和反序列化EMFJson编码的JSON文档

    EMFJson(用于Node.js) 序列化和反序列化EMFJson编码的JSON文档。

    对“EMF 混合物”的流行病学研究的“暴露”的更丰富的概念化

    场并仅用时间积分总结暴露的时间序列,他们可能会漏掉一些东西. 这导致了如何解决暴露问题的问题。 本文通过借用药理学的概念对这个问题提出了一个潜在的答案。 本文简要探讨了当前分析的局限性如何导致糟糕的公共...

    论文研究 - 电磁频率的数学结构,它可以反映波姆隐含阶次的先导波

    数学分析表明,导出的算术标度表现出2,3和一个因子的整数次幂的唯一乘积序列。 这种广义的半谐波频谱可能反映了离散的导波结构,该结构可以解释为Bohm对量子场论的因果解释中的所谓的隐藏变量。

    用EclipseModelingFramework实现模型驱动开发,第1部分

    它可以基于XMLSchema、UML或经过注释的Java中指定的模型,创建Java代码,实现图形化的数据编辑、操纵、读取和序列化。EMF是IBMWebSphereStudio和Eclipse项目中很多工具的基础。本文将帮助您逐步了解创建模型、生成...

    AddFlow[1].4.ActiveX.Control.v4.2.0.14

    支持Metafiles文件,支持序列化,多层撤消/重做,打印,缩放,贝塞尔曲线和样条曲线,转移连接,连接跳跃,多选,卷屏,用户数据连接,图形浏览。免费Runtime发布。 AddFlow ActiveX控件,它提供了如下功能: ...

    xmc-editor:XtratuM管理程序的配置编辑器

    xmc编辑器这些插件实现了基于EMF的解决... 该功能使用XML序列化来映射原始XSD。 该工具还具有验证功能,可以检查配置的有效性。 该工具与XtratuM v3.4.2兼容。 为了安装此功能,请下载更新站点并按照的说明进行操作。

    统计和数据分析软件包 Minitab 20.2.0.0 x64 中文多语免费版.zip

    导出:TIF、JPEG、PNG、BMP、GIF、EMF 基本统计量 描述性统计量 单样本 Z 检验、单样本 t 检验、双样本 t 检验、配对 t 检验 单比率检验和双比率检验 单样本 Poisson 率检验和双样本 Poisson 率检验 单方差检验和...

Global site tag (gtag.js) - Google Analytics