`

(转)EMF中ResourceSet和Resource等的用法。(The EMF Persistence API)

阅读更多

原文地址:http://www.blogjava.net/eclipshine/archive/2005/08/07/9499.html

(此文大部分翻译整理自Eclipse Modeling Framework: A Developer's Guild的13.2章)

EMF Persistence API中主要涉及到4个接口Resource, ResourceSet, Resource.Factory以及URIconverter。虽然EMF提供了这些接口的缺省的XML序列化的实现,但是也可以用这些API来实现其他的序列化方式,不论其是否是基于XML的,或者基于流的。

<o:p> </o:p>

URI用来表示某一类型的数据,由三个部分组成:scheme, scheme-specific part以及可选的fragmentEMF提供了自己的URI的实现(而没有用JDKURL):org.eclipse.emf.common.util.URI

scheme部分表示了存取resource的协议,可以使标准的file,或者是jar。在eclipse中,使用platform来存取在workspace中的resource。例如:platform:/resource/project/po.xmlEMF也提供了EcoreUtil.getPlatformResourceMap(),来将一个platformURI转换成标准的基于本地文件系统file协议的URI

scheme-specific part的解释会根据具体的scheme不同而不同,但是在EMF中,使用了一种通用的层次格式,这种格式包括autority, device,以及一系列的segmentsauthority//打头。其它均由/打头。

fragment表示一个resource内部的的一个部分。使用#来同其他部分分离。例如:file:/c:/dir1/dir2/myfile.xml#locEMF使用带有fragmentURI来对resource中的EObject进行引用。每一个EMF resource都有一个唯一的URI,而每一个resource中的对象,都有一个唯一的fragement来标志它。

<o:p> </o:p>

URIConverter将一个输入的URI转换成一个resource的真实地URI。可以用来将一个namespace URI转换成一个物理文件的URI,或者重定向到另外的一个老的URI上。

<o:p> </o:p>

Resource表示一个EObject的序列化容器,其实际地址由其URI所指定。Resource接口最重要的方法是save(), load()getEObject()以及getURIFragment()方法。save()load()方法在ResourceImpl中并没有具体的处理装载与保存的实现,具体的处理是由storage-specificresource的子类完成的。

<o:p> </o:p>

Resourceunload()方法在某些时候也会很有用。它会将Resource中的所有对象都转换为代理对象,使得后续的调用变成ondemand的调用,这能够让你得到最新的数据。如果底层的文件发生了改变的话。

<o:p> </o:p>

ResourcegetEObject()方法能够使用一个对象的fragment来存取一个EObject。例如:

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

要得到一个对象的fragment也很容易,使用getURIFragment()方法即可:

String fragment = resource.getURIFragment(item);<o:p></o:p>

<o:p> </o:p>

Resource.Factory是用来创建Resource的。Resource.Factory是由一个注册库Registry来管理,定位的。一个Resource.Factory对应于一类URI,而不是某一特定的URI。例如,缺省的registry允许你为一类的URI scheme或者extension注册一个Resource.FactoryResource.Factory可以通过一个定义在Resource.Factory内部的Descriptor来进行注册。Descriptor提供了创建Factory的方法。这里也是一个插件的扩展点,可以用来向系统中注册新的Descriptor

<o:p> </o:p>

Registry可以用过其静态的INSTANCE字段来访问其一个实例,缺省实现是ResourceFactoryRegistryImpl。它首先会根据URIscheme来检查protocolToFactoryMap中的Factory,如果没有找到,则使用URI的文件的扩展名来检查extensionToFactoryMap中是否有,如果人染没有找到,则查找extensionToFactoryMapDEFAULT_EXTENSION(也就是*)。如果仍然没有找到,则调用delegatedGetFactory(),允许你装载一个自己的Factory Registry。当找到一个Descriptor之后,调用其createFactory()来创建一个Factory

下面的这个扩展点是定义在org.eclipse.emf.ecore.xmi插件中的:

<extension point = "org.eclipse.emf.ecore.extension_parser"><o:p></o:p>

  <parser type="*"<o:p></o:p>

     class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/><o:p></o:p>

</extension><o:p></o:p>

可以看到,XMIResourceFactoryImpl被作为缺省的ResourceFactory注册了,因此在没有其它的Factory被注册的时候,将缺省使用XMIResourceFactoryImpl。你也同样可以创建新的Resource实现,以及对应的Factory,并通过上面的扩展点来进行注册。

<o:p> </o:p>

EMF运行在非Eclipse环境下时,缺省的扩展点没有被注册,则需要手工的注册:

Resource.Factory.Registry.INSTANCE.<o:p></o:p>

  getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());<o:p></o:p>

Resource.FactoryResourceSet所使用来创建Resource

<o:p> </o:p>

一个ResourceSet代表了一个Resource的集合。提供了createResource()getResource(),以及getEObject()方法。createResource()创建一个新的,空的resourcegetResource()方法也同样创建一个resource,但是会使用给定的URI来装载这个Resource。用户应该始终调用ResourceSet的这两个方法,而不是Resource的构造函数或者Resource.FactorycreateResource()方法来创建一个Resource。这是因为ResourceSet会保证相同的URI所对应的Resource不会被装载多次,而导致内存中有相同的副本,并且,ResourceSet能够自动处理跨文档的引用,而Resource却不行。

<o:p> </o:p>

EMF中资源的保存与读取,可以通过下面的两个简单的代码片断来例示:

装载:

ResourceSet resourceSet2 = new ResourceSetImpl();<o:p></o:p>

URI fileURI2 = URI.createFileURI(filepath);<o:p></o:p>

//Attention, The second parameter must be trur to get the resource for the first time.<o:p></o:p>

Resource poResource2 = resourceSet2.getResource(fileURI2, true);<o:p></o:p>

<o:p> </o:p>

保存也很简单:

URI fileURI = URI.createFileURI(filepath);<o:p></o:p>

Resource poResource = resourceSet.createResource(fileURI);<o:p></o:p>

poResource.getContents().add(model);<o:p></o:p>

try {<o:p></o:p>

       poResource.save(null);<o:p></o:p>

} catch (IOException e) {<o:p></o:p>

       assertTrue("IOException: " + e.getMessage(), false);<o:p></o:p>

}<o:p></o:p>

分享到:
评论

相关推荐

    eclipse插件开发EMF api 文档

    EMF API文档是开发者理解和使用EMF的关键资源,它详细解释了EMF的各种类、接口、方法和概念,帮助开发者在构建模型驱动的应用时进行有效的编程。文档通常包括以下几个主要部分: 1. **基础概念**:EMF的基础概念...

    SVG转EMF的示例代码

    这个"SVG转EMF"的示例代码提供了在Java环境下进行这种转换的方法。首先,你需要一个能够解析SVG并将其转换为图形对象的库,例如Batik,这是一个由Apache基金会开发的开源SVG工具集。 Batik提供了一个SVG渲染器,可以...

    emf文件和wmf的转换

    EMF包含了32位的记录结构,可以处理更多元化的图形和文字效果,同时也支持OpenGL和DirectX等高级图形API的操作。 WMF则是在早期的Windows系统中广泛使用的格式,它的文件结构基于16位记录,因此在处理复杂图形或...

    将EMF图片格式转换成PNG

    EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...

    后台运行pdf文件转成EMF图片

    综上所述,"后台运行pdf文件转成EMF图片"涉及的技术包括PDF文件格式的理解、EMF矢量图像的优势、后台处理的自动化、图形截取和转换工具的使用。在实际操作中,需要考虑兼容性、效率和质量等因素,以满足不同的业务...

    bmp转emf矢量图

    本主题主要关注的是“bmp转emf矢量图”以及“emf矢量图转bmp”的过程,这涉及到图像格式转换的知识。让我们深入探讨这两种图像类型及其转换方法。 BMP(Bitmap)是一种常见的位图图像格式,广泛用于Windows操作...

    EMF读取XML

    - 使用EMF的`ResourceFactory`,可以创建一个`ResourceSet`,它管理资源和它们的加载器。 - 创建一个`Resource`对象,指定XML文件路径,并使用`load()`方法读取XML数据,这将根据Ecore模型构建模型实例。 - `...

    C# 将打印机临时缓存文件SPL转为图片文件EMF

    在IT行业中,打印机缓存文件SPL和图片文件EMF是两种不同的图形格式,与打印作业和图像处理紧密相关。本文将深入探讨如何利用C#编程语言将SPL文件转换为EMF文件。 首先,我们需要了解SPL和EMF文件的基本概念: 1. *...

    EMF和BMP文件格式的相互转换

    EMF和BMP文件格式的相互转换:BOOL CConvertEMFToBMP::ConvertBMPToEMF(const char*pszBMPFile,const char* pszEMFFile)

    Delphi将jpg、bmp、wmf格式转换为emf格式.rar

    本资源"Delphi将jpg、bmp、wmf格式转换为emf格式.rar"提供了使用Delphi编程语言实现图像格式转换的方法,特别是将常见的jpg、bmp、wmf格式转换成增强型元文件(EMF)格式。EMF是一种矢量图形格式,支持高分辨率缩放...

    emf转bmp代码

    2. **读取EMF文件**:使用Windows API函数,如`PlayMetaFile()`,可以读取并执行EMF文件中的图形指令。这会生成一个设备上下文(Device Context, DC),表示了EMF文件描述的图形。 3. **创建BMP文件结构**:BMP文件...

    EMF文件提取文本,预览,打印

    EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...

    java emf 转jpg源码.zip

    EMF 是一种在 Windows 操作系统中广泛使用的矢量图形格式,而 JPG 则是常见的位图图像格式,适用于网络传输和存储。这个源码提供了将 EMF 文件转换为 JPG 的功能,方便在不同场景下使用和分享。 源码的核心技术主要...

    emf文件格式详解

    它可能包含示例代码,帮助开发者理解和使用EMF API,以便在Win32环境中生成或处理EMF图像。 **emfexplorer_src.zip**:这是一份源代码压缩包,很可能包含了一个EMF文件浏览器或分析工具的源代码。通过分析和运行这...

    打印监控 spl文件解析成emf文件

    6. **实现打印监控**:解析后的 EMF 文件可以用于各种打印监控软件,通过读取这些文件,你可以获取打印作业的详细信息,如打印次数、颜色使用情况、打印时间等,从而实现对打印行为的监控和管理。 以上步骤是将 SPL...

    emf2svg-FreeHEP

    This is the API specification of the FreeHEP VectorGraphics package for converting emf to svg.

    doc/docx转html,以及wmf与emf转jpg,png图片

    本文将深入探讨如何使用Java进行“doc/docx转html”以及“wmf与emf转jpg/png图片”的过程,同时也会提及到batik和poi这两个重要的开源库。 首先,让我们来看“doc/docx转html”。在Java中,Apache POI是一个非常...

    获取WMF、EMF图片中文字所用字体名称

    为了解决这个问题,我们需要有一种方法来识别并获取WMF和EMF图片中使用的特定字体。这正是"获取WMF、EMF图片中文字所用字体名称"这个程序的功能。这个代码能够解析WMF和EMF文件的元数据,提取出其中涉及的所有字体...

    emf教程入门和插件

    在本教程中,你将学习如何安装和使用这些插件,提升你的EMF开发体验。 7. **实战演练** 通过实际操作,你会学习如何创建一个简单的Ecore模型,生成对应的Java代码,然后使用这些代码创建和操作模型实例。此外,你...

    Emf2Png.zip

    EMF是一种矢量图形格式,通常在Windows系统中用于存储图形信息,而PNG是一种广泛使用的位图格式,支持透明度和无损压缩,常用于网页和其他数字媒体。 在C#编程环境下,进行这种图像格式转换通常需要利用.NET ...

Global site tag (gtag.js) - Google Analytics