org.eclipse.core.runtime.content 包为定义数据流的内容类型提供了支持。内容类型由 Eclipse 的与内容相关的几项功能(例如,自动编码确定、选择比较编辑器和菜单添加项)使用。 IContentTypeManager 管理的中央内容注册表允许插件定义内容类型并指定了解如何读取和描述内容的类。要添加内容类型,必须对内容框架具有基本的了解。
注意:在此讨论中,当谈到内容时,我们特地避免使用文件这个词。运行时内容引擎不会假定内容包含在文件系统的文件中。但是,它确实包括使内容类型与文件命名模式相关联的协议。实际上,这些文件名表示文件系统中的文件,但是内容系统的实现中的任何对象都不假定内容在文件系统中。文件编码和内容类型讨论由平台资源插件添加的面向文件的内容类型。
平台定义一些基本内容类型(例如,纯文本和 XML 数据流)。定义这些内容类型所采用的方式与定义由其它插件添加的内容类型的方式相同。我们将了解平台如何定义文本内容类型以便更好地了解内容类型框架。
插件通过为 org.eclipse.core.runtime.contentTypes 扩展点添加扩展来定义内容类型。在此扩展中,插件为内容类型指定标识和名称,还指定 IContentDescriber(它可以读取输入流并提供对内容的描述)。以下片段是运行时插件的文本内容类型的添加项:
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> priority="high" file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
TextContentDescriber 负责读取输入流并快速确定提供的内容是否是有效的文本样本。每当平台尝试确定特定数据流的内容时,就会调用 describe(inputStream, description) 方法。IContentDescriber 负责快速确定内容是否表示其内容类型的有效样本并返回用来指示内容与其类型是否相匹配的常量。如果内容确实与其类型相匹配,则描述器还应该使用有关数据的信息来填充所提供的 IContentDescription。
IContentDescription 将特定于内容的属性存储在键/值对中。这些属性是特定于特定内容类型的。平台指定字符集的属性以及文本文件的字节顺序,但是还可以定义其它内容。
IContentTypeManager 定义内容注册表的协议。客户机可以使用此类来测试内容流或了解系统中的其它内容类型。
内容类型由 IContentType 表示。此类表示知道如何读取数据流并解释特定于内容类型的信息的唯一内容类型。实质上,内容类型是分层的。例如,XML 数据的内容类型被认为是文本内容类型的子代。
<content-type id="xml" name="%xmlContentTypeName" base-type="text" priority="high" file-extensions="xml" default-charset="UTF-8"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> </content-type>
这允许新的内容类型利用更一般的内容类型的属性或行为。
平台文本内容类型不为文本内容定义字符集。文本内容类型的子代可以自由指定不同的缺省字符集(当适当时),正如 XML 内容类型那样。XML 流的缺省字符集为 UTF-8,这意味着如果 XML 文件在它的内容中没有明确声明编码,则认为它的编码为 UTF-8。
两个独立的插件可能为同一种类的内容添加内容类型。在这种情况下,平台将只为内容选择一个内容描述器。选择的描述器是使用可以在 contentTypes 扩展中指定的 priority 属性来确定的。如果两个插件为具有相同优先级的相同内容添加内容类型,则将选择哪个内容描述器是不确定的。但是,一旦选择了内容描述器,对“丢失的”内容描述器的所有注册表引用都将作为选择的那个内容注册表的别名。