用于 Content Management Interoperability Services 的 Mozilla Firefox 插件开发

本文概述了一个用于访问内容的新标准,即 Content Management Interoperability Services (CMIS),并举例说明如何用 Mozilla Firefox 来利用这些服务。

Gregory Melahn, 架构师兼高级技术人员, IBM

Greg Melahn 是 Workplace, Portal, and Collaboration portfolio of IBM Software 的一名架构师兼高级技术人员。



Shun Zhang, 软件工程师, IBM

Shun Zhang 是北京 IBM 的一名软件工程师,专门研究 Lotus Quickr、Web 2.0 以及 SOA 技术。


developerWorks 投稿作者

Yan Chen, 顾问软件工程师, IBM

Chen Yan 是 IBM 的一名顾问软件工程师,他在中国北京 IBM 的 Lotus Quickr 开发团队工作,专门研究社会性计算和内容协作。


developerWorks 投稿作者

Hui Jian He, 资深软件工程师, IBM

Hui Jian He 是北京 IBM 的一名软件工程师,专门研究 Lotus Quickr。


developerWorks 投稿作者

Xiao Wang, 实习生, IBM

Xiao Wang 是北京 IBM 开发实验室的一名实习生,也是北京大学的在校生。



2010 年 1 月 26 日

编辑注:您很精通这个主题吗?希望分享您的经验吗?请马上加入到 IBM Lotus 软件 wiki 项目。

简介与背景

过去几十年中,支持用户间相互连接的技术取得了惊人的进展。得益于互联网协议、高速网络、低成本设备以及文档格式标准化,现在进行信息交换比以往任何时候都要简单得多。尽管如此,我们仍然在努力协作业务内容。为什么呢?

部分答案是,业务信息继续被存储在内容孤岛,软件厂商独立地决定如何组织和访问信息的细节。存储在两个不同内容管理系统的一个文档可能由同一个应用程序创建,可能还有相同的比特数(例如,一个 PDF 文件)。

虽然存储文档的内容管理系统决定一些重要的细节,例如,使用什么 API 访问文档,如何搜索到它,什么附加属性和文档一起存储,如何版本控制,分配什么样的策略,等等。

在一个文档已经存储到内容管理系统中之后,从某种程度上讲它就被局限于此系统中,那些不是专为此知识库设计的应用程序很难访问到这些信息。这一问题不仅出现在不同的软件公司,也出现在来自同一厂商的软件中。

在使用企业内容管理(ECM)系统的情况下,这一共享问题变得尤为严峻,因为 ECM 系统中的信息容量极大,信息本身也是任务关键型的。雇员能利用信息的程度可以决定一个公司的成功;信息难以共享直接影响一个公司的竞争力。

内容管理标准在 90 年代后期开始出现。这些标准,例如,WebDAV 和 Java™ Content Repository (JCR),是重要的进步,但是它们仍缺少共享企业内容所需的许多特性。

几年之前,Associates for Information and Image Management 赞助了一个名为 Interoperable Enterprise Content Management (IECM) 的计划。

一个代表 ECM 厂商的团队开始讨论建立一个易于共享和管理内容的标准的想法。期间,更多的 ECM 厂商参与到这一讨论中来,随后 Organization for the Advancement of Structured Information Standards (OASIS) 技术委员会成立了,并撰写了一份正式的规范。

经过多年的设计,委员会在 2009 年发布了第一版建议规范来征求公众意见。几家 ECM 厂商已经有了实现建议标准的原型。


CMIS 基础

Content Management Interoperability Services (CMIS) 建议标准非常简单,它定义了一个可扩展域模型,由四个基本内容类型组成:文档、文件夹、关系和策略。最重要的两个 CMIS 类型是文件夹和文档类型,因为其中含有大多数的内容。

让我们来讨论一下这四个内容类型:

  • CMIS 文档。和文件类似,它含有保持文档元数据的属性,例如,文档作者、修改数据和某公司的专有自定义属性(见图 1)。CMIS 文档还可以包含内容流和再现,例如,文档的缩略视图。

    图 1. CMIS 文档图表
    CMIS 文档图表
  • CMIS 文件夹。这个内容类型是 CMIS 文档和其它 CMIS 文件夹的容器(见图 2)。文件夹可以决定它们能包含何种类型的文档。(作为一个 CMIS 知识库选项)文档可以被放在多个文件夹中,或者不在任意文件夹中。

    在 CMIS 知识库里的文件夹会形成一个严格的层次结构,在这个层次体系中一个文件夹只能包含在单一的父文件夹中。

    图 2. CMIS 文件夹图表
    CMIS 文件夹图表
  • CMIS 关系。这个内容类型是用来定义 CMIS 对象间关系的方法(见图 3)。一个对象可以和其它对象有多种关系。执行任何关系的语义或者两对象间关系的引用完整性不需要 CMIS 知识库。
    图 3. CMIS 关系图表
    CMIS 关系图表
  • CMIS 策略。这个内容类型是定义管理策略的方法,按照 CMIS 规范以外的方式来管理对象。例如,您可以用一个 CMIS 策略来定义哪些文档遵循再现策略。

    CMIS 策略的内容对 CMIS 知识库是不透明的,所以您可以灵活地使用它。

    图 4. CMIS 策略图表
    CMIS 策略图表

这些基础类型自身可以用作子类型来定义一种新的内容,最典型的是为某种特定业务定义一个文档的子类型。例如,您可以使用附加属性(比如 Customer Name 和 Customer Contact)来定义一个名为 Customer Proposal 的文档子类型。

CMIS 规范也定义了一系列的内容服务来访问这一内容(见图 5)。每个服务都有两个基于 HTTP 的绑定。一个绑定使用 Atom Publishing Protocol,另一个使用基于 SOAP 的 Web 服务。

图 5. CMIS 服务
CMIS 服务

这些服务中的一部分是必需的,但大部分是可选的,这使得厂商逐渐公开其知识库变得更为简单。

必需服务以 getRepositoryInfo 为例。因为您可以使用这个服务在知识库中获取根集,从而开始内容导航,所以这个服务是必不可少的。这个服务也是知识库对它的其他能力进行描述的方式。

可选服务以策略服务为例,因为一般来说不是所有的知识库能够(或者需要)展示其管理策略。

CMIS 规范中的一个重要部分就是查询服务,它是 CMIS 区别于早先规范的服务之一。CMIS 中的查询所采用的原理是使用已经被广泛理解的查询语言,这自然会导致选择 Structured Query Language (SQL)。CMIS 的查询语言是有一定拓展的 SQL-92 (ISO/IEC 9075: 1992 – Database Language SQL) 的子集。如果您已经了解 SQL,那么对您来说查询 CMIS 知识库将非常容易。

例如,知识库中的每个 CMIS 文档类型都有一个对应的逻辑表名;使用其文档属性作为列名,您可以在 SQL 语句中使用这个逻辑表名来选择该类型的文档。这意味着它将和形成一个 SQL 查询一样简单,例如,使用 SELECT * FROM DOCUMENT 语句获取知识库中的文档清单。

需要注意的是,因为该类型并不一定有一个真实的关系数据库表,所以我们使用术语逻辑表。而且 CMIS 知识库的实现也并非都基于关系数据库(虽然多数是如此)。

查询语言中包含的是我们熟悉的概念,例如,内部连接和外部连接;运用计分函数进行全文查找,允许知识库标识相关性;谓词,让您能够将查询的范围确定在文档层次结构的一部分;以及排序规则。

清单 1 显示了几个 CMIS 查询的简单例子,说明如何使用查询语言。

清单 1. CMIS 查询示例
SELECT Y.EMPNO, X.ANNUALSALARY FROM EMPLOYEE AS X JOIN SALARY AS Y ON 
( X.EMPNO = Y.EMPNO )WHERE( 50000 >= X.ANNUALSALARY ) AND ( Y.MANAGER = ‘Y’ )

SELECT * FROM document WHERE IN_FOLDER(‘/email/customers/ourbestcustomer’) 
AND CONTAINS (‘invoice’) AND title LIKE ‘%project a%’

CMIS 和 IBM Lotus Quickr

IBM® Lotus® Quickr™ 是一个用于简化团队协作的软件。共享内容对协作也是很重要的;与 CMIS 一样,Lotus Quickr 引入了一个简单的内容模型和一组基于 Atom 和 Web 服务的服务。

因为 Lotus Quickr 是在 CMIS 标准化之前开发的,所以它所介绍的数据模型和服务细节与 CMIS 有所不同。因为 Lotus Quickr 中的基础编程模式(基于 Atom 和 Web 服务)和 CMIS 中的类似,所以了解 Lotus Quickr 内容服务的开发人员也能够轻松地学会使用 CMIS。事实上,在本文中探讨的 CMIS Firefox 扩展要追溯到在 developerWorks® 白皮书 “Developing an IBM Lotus Quickr Firefox connector using Quickr services” 中描述的 Lotus Quickr Firefox 扩展。

展示 Lotus Quickr 内容服务如何演变成 CMIS 的示例比较了 Lotus Quickr 中的 Atom 服务文档和 CMIS 的服务文档。在这两者中,Atom 服务文档列出了您能够找到内容的最顶层 Atom 集合。在 Lotus Quickr 中,这些集合被称为文档库,您可以在服务文档中看到这些文档库的清单。在 CMIS 中,这些容器又被称为知识库,就是在服务文档中列出的您能看到的部分。在任意情况下,您都能在文档库或者知识库中,找到表示为 Atom 提要和条目的文件夹和文档。

当您获取服务文档中提及的一个提要的内容后,您可能会注意到,Lotus Quickr 和 CMIS 用不同的 XML 名称空间来扩展 Atom。例如,以 Lotus Quickr 的提要为例,您看到一个名称空间 td (teamspace documents 的缩写)作为部分 Lotus Quickr 文档属性的前缀,比如文档标识符:

<td:uuid>bdb6ad804ca3662aadc7ff3cc4e9abbc</td:uuid>

然而,在 CMIS 中,您会看到标识符以名为 cmis (如您所预想)的 CMIS 名称空间来进行描述。例如,这个文档标识符如 CMIS 提要中的示例所示:

<propertyId localName="cmis:objectId" propertyDefinitionId="cmis:objectId">
<value>bdb6ad804ca3662aadc7ff3cc4e9abbc</value>
</propertyId>

概念是一样的;只是它们在 XML 文档中的描述不同。

如果您有一个基于 Atom 的 Lotus Quickr 文档客户端(例如 Lotus Quickr Firefox 连接器),您想对它进行编写以便和 CMIS 文档进行合作,就可以再次利用您的客户端懂得 Atom 服务文档语法,了解如何使用 Atom 提要这一事实。

而且,您可以对客户端进行修改,以便它能理解不同的 XML 名称空间。最可能进行的修改意味着您保留您的程序的基本结构和大部分用户体验,只修改解析 XML 的部分。


Firefox CMIS 插件

现在您已经对 CMIS 有了一些了解,让我们看一个例子,了解如何使用 CMIS 来访问文档知识库。该示例使用基于 XML User Interface Language (XUL) 和 Dojo Toolkit 的 Mozilla Firefox 插件架构。

插件架构

XUL 是一种框架,您可以在其中开发由一个用户体验组成的应用程序,这个用户体验使用以下工具构建:

  • 带有图像和 CSS 样式表的简单标记语言
  • 用 JavaScript 编写的控制器
  • 区域敏感字符串

此类应用程序使用 Mozilla 应用程序(如 Firefox)中包含的 XUL 的运行时运行。您可以通过编写能安装在 Firefox 中的 XUL 应用程序来拓展 Mozilla 的行为。

不但如此,插件使用 Dojo Toolkit 来管理自身和 CMIS 知识库之间的对话。例如,它使用包含在 Dojo 中的 Atom 扩展从 CMIS 知识库中提取 Atom 服务文档,还用它准备 HTTP 请求以执行 CMIS 操作,比如创建一个文档(见图 6)。

图 6. CMIS 和 Lotus Quickr 插件的组件
CMIS 和 Lotus Quickr 插件的组件

访问 CMIS 知识库

在 CMIS 知识库中运用插件来管理文档,首先您必须确保 CMIS 服务已经被部署到您的内容管理系统中。

例如,IBM 已经开发了提供访问 IBM FileNet® 和 IBM Content Manager 路径的 CMIS 服务。请参见白皮书 “IBM FileNet and IBM Content Manager Technology Preview for OASIS CMIS” 获取更多信息。

接下来,您需要获取服务器的 CMIS 服务文档的 URL,如果服务器加密,那么还需要用户 ID 和密码,这通常意味着要联系内容管理管理员。

服务文档是一个 XML 文档,它的格式由 Atom 发布协议定义,并已由 CMIS 标准进行扩展。它列出由服务器管理的 CMIS 知识库。将其当做您的 CMIS 目录。服务文档也会对该知识库的功能进行描述,它还含有到文档集合的有用链接,例如已经被签出的文档。服务文档的格式是 CMIS 规范的 REST 绑定的一部分。

右键单击 CMIS 插件的树形视图,显示 Add Repository 窗口(见图 7)。在此图中您可以输入这个服务文档的 URL,如果服务器加密,还要输入凭证。

图 7. Add Repository 窗口
Add Repository 窗口

单击窗口中的 Next 按键,激活 AddRepositoryDialog.js 中的 doNext() 函数,使用以下的 Dojo 函数来检索和分析 CMIS 服务文档:

dojox.atom.io.getService: function(url, callback, errorCallback, scope)

调用 doNext() 函数的按键连接是 XUL 对话框定义的一部分。请参见 addRepositoryDialog.xul 中的 ondialogextra1="doNext()。

清单 2 显示了一个来自 IBM FileNet 服务器的 CMIS 服务文档的例子,该服务器通过 XUL 对话框进行读取。

清单 2. CMIS 服务文档代码示例

您可以看到服务文档包含了有用的信息,包括知识库的名称。在清单 2 的例子中,只有一个 CMIS 知识库,命名为 FNSPStore(这个名称在 XML 元素 <title> 和 <repositoryId> 中显示)。

当 Dojo 读取和分析 CMIS 服务文档时,它就将那个服务文档的信息存储到 dojox.atom.io.model.Service 的对象中。使用这个对象,插件就能获取所需的知识库信息,然后把信息存储在名为 gData 的数组中。

插件将对清单进行排序,然后它就能显示给用户了。您可以看到这个操作在 addRepository.js 的函数 handleService() 中发生。在经过排序的知识库清单显示在下一 Add Repository 窗口(见图 8)中之后,您可以选择感兴趣的知识库。

图 8. 知识库清单
知识库清单

如果您单击 Save,就能调用 addRepositoryDialog.js 中的 doOK() 函数。按键和 JavaScript 函数之间的连接在 AddrepositoryDialog.xul 文件中,由行 ondialogaccept="doOK();" 完成。处理 doOK() 函数时,CMIS Connector 窗口的树形将会进行更新(见图 9)。

图 9. 添加 FNSPStore 知识库以后的知识库清单
添加 FNSPStore 知识库以后的知识库清单

知识库列表及其相关数据被保存到当前 Firefox 用户的活动配置的文件系统中,这就是为什么您在下一次打开一个 Firefox 窗口时,会看到知识库的清单。Firefox 配置文件目录的位置是由系统决定的;例如,在 Microsoft® Windows® XP 环境下,位置在:

C:\Documents and Settings\<user>\Application Data\mozilla\firefox\profiles

当然,CMIS 的重点不只是访问来自一个厂商的内容,而是访问不同知识库中的内容。因为插件是根据 CMIS 建议标准规范来创建的,所以它能用来管理存储在任意系统中的文档,只要那个系统也实现了建议标准。

如果您在 Internet 上搜索 CMIS 知识库,您可以找到几个能够下载下来进行免费试用的版本。您还可以在 Lotus wiki 文章 “Implementations of CMIS” 中找到 CMIS 知识库供应商的清单和一些令人感兴趣的 CMIS 客户端。

探索 CMIS 知识库

当您将 CMIS 知识库的地址保存在插件中后,您可以双击知识库开始对其内容进行探索。这一操作使来自服务文档的根集用于从知识库中读取文件夹和文档的名称。这个根集此前在知识库添加到 addRepository.js 的 handleService()函数中时就被发现了。

读取该根集的内容是用到 Dojo toolkit 的另一场合。cmisconnector.js 中的函数 getChildrenData(/*cmiscon.TreeNode*/ node) 利用函数 dojo.xhrGet 来发布一个 XML 请求,获取列出根集下文件夹和文档的 Atom 提要文档。该提要如清单 3 所示。

清单 3. 提要示例

需要注意的是该示例提要中包含有 CMIS 文件夹和 CMIS 文档,每个都由 Atom 条目表示。如果是文件夹,则条目包括值为 cmis:folder 的对象类型属性。如果是文档,其值就是 cmis:document。

插件分析 CMIS 提要时,遇到 cmis:document 条目,它就在插件树形中创建一个节点,用文档小图标来表示文档。插件会记忆那个节点、文档 ID 以及文档内容流链接(该文档的比特)的相关数据。

这个链接在文档条目的编辑媒体链接中,遵循 Atom 约定。该链接由 HTTP GET 来读取,内容显示在插件右侧的浏览器窗口。

当插件遇到 cmis:folder 条目时,它就在插件树形中创造一个节点,用文件夹小图标来表示该节点。它也能在该节点相关数据中,记忆该文件夹 Atom 条目的下行链接值。这个下行链接自身就是一个文件夹和文档的 CMIS 提要。您可以看到,文件夹和文档导航模式是递归的。从根集开始,按文件夹层次往下,插件随着用户单击树形来发现内容。该层次中的每一层都表示为一个 Atom 提要。

在 CMIS 知识库中添加文档

在知识库中添加文档就像将其拖入文件夹中一样简单。在 cmisconnector.xul 中,您能看到适用于树形控制的拖放选项显示在 CMIS 侧边栏内容里。和其它 XUL 文件一样,拖放选项与对应的 JavaScript 文件间存在关联,其中处理拖放操作的逻辑已经指定。名为 cmisDNDObserver 的观察器包含处理树形中的节点是否可以拖动,是否可以放开的函数。cmisDNDObserver 在 cmisconnector.js 中。

当一个被拖拽的对象通过 CMIS 知识库树形中的节点时,就会调用 cmisconnector.js 中的 canDrop 函数。当鼠标指针下的对象是一个表示 CMIS 知识库,或者 CMIS 文件夹的节点,它就返回 true;否则,就返回 false。

当用户把一个 Web 网页、另一个 CMIS 文档、或者一个本地文件放开在侧边栏文档树中表示 CMIS 知识库或者 CMIS 文件夹的节点上时,就会调用 cmisconnector.js 中的 drop 函数。drop 函数确定要将该文档发布到哪个提要 URL,然后调用 uploadUrl 函数。

uploadUrl 函数首先用 downloadFile 函数来下载文档,将其存储为一个本地文件,然后调用 uploadFile。uploadFile 函数根据下一小节 “CMIS 连接器选项” 中描述的用户选项确定 CMIS 文档的名称。然后调用函数 createEntry 将文档发布到 CMIS 知识库。

请看 createEntry 函数中的 JavaScript,您会看到这个进程遵循 Atom Publishing Protocol 定义的步骤,即,创建一个 CMIS 文档条目(它正是 Atom 条目的特化),然后使用 HTTP POST 操作来创建 CMIS 文档。

Dojo 在 dojo.rawXhrPost 中提供的设施在此使用,dojo.rawXhrPost 用于简化进行异步 XML HTTP 请求。Dojo 也在 dojox.atom.io.model 中提供函数,从返回的 CMIS 条目中提取编辑媒体链接,以便它可以被 uploadFile 函数使用,将文件内容加载到 CMIS 文档的内容流中。

您或许注意到了,在 HTTP POST 操作中要用到 CMIS HTTP 参数 versioningState=checkedout。这个参数用于签出 CMIS 知识库中新建的文档。

要将文件内容加载到新的 CMIS 文档中,就需要用到这个参数。否则,我们需要签出文档来获取我们能够升级的私人工作拷贝。一种替代方法是用基础 64 位编码方法对文件内容进行编码,再用创建 CMIS 文档的原始 HTTP POST 发布已编码的内容。

创建 CMIS 文件夹

您可以在知识库的根集下或者子文件夹中创建文件夹。通过右键单击文件夹,输入新文件夹的名称,您可以将文件夹添加到 CMIS 知识库中,如图 10 中窗口所示。

图 10. 文件夹标题窗口
文件夹标题窗口

这个窗口由 window.prompt 函数显示,该函数来自 cmisconnector.js 中名为 newFolder 的 JavaScript 函数。您右键单击时出现的菜单选项和 NewFolder 函数间的关联可以在 cmisconnector.xul 代码中看到:

<menuitem id="miNewFolder" label="&newFolder.label;
"accesskey="&newFolder.accesskey;"
oncommand="newFolder();"/>

请看 newFolder 函数中的 JavaScript,您会看到该代码和创建 CMIS 文档的机制类似,除了在这里它是个用 dojo.rawXhrPost 发布的 CMIS 文件夹条目。


CMIS 连接器选项

插件为用户和开发人员提供部分定制点。第一个定制点允许用户指定 CMIS 文档名称的创建方式。另一些选项,比如使用什么 CMIS 文档和文件夹类型,以及如何处理 CMIS 属性,可以由开发人员进行修改。

文档名称

当一个文件被拖放到插件中的一个文件夹时,插件允许用户决定如何创建 CMIS 文档的名称(属性命名为 cmis:document)。用户可以从 Firefox 的菜单选择 Tools - Add-ons 指定这些选项。

在 Add-ons 窗口,您可以指定 CMIS 文档的名称(cmis:document)是否由已放开文档或者 Web 页面的 URL 派生而来,或者由已放开文档或者 Web 网页的链接文本派生而来(见图 11)。注意,在拖放本地文件时,值不变。

图 11. Add-ons 窗口
Add-ons 窗口

无论您选择哪个选项,如果您在拖放复选框时选择了 Prompt document name,那么每次您把文件或者 Web 页面拖放到 CMIS 文件夹中,都会受到提示。

同样,如果您选择了这个选项,在您放开文档时将会出现 Rename 窗口,允许您指定一个不同的名称,而不是由插件计算的链接文本或 URL(见图 12)。

图 12. Rename 窗口
Rename 窗口

Options 窗口在 XML 文件 options.xul 中指定。当文档被放开时,这些选项就被读取,然后被放在名为 gPrefs 的对象中。然后用 cmisconnector.js 中的 onDrop 函数选择已放开对象中的哪个值用于 CMIS 文档名称。

基础文件夹和文档类型

当插件创建一个 CMIS 文件夹或者 CMIS 文档时,一个 Atom 条目模板用于控制将发布到 CMIS 知识库的内容。这些模板包含在文件 NewFolderForPost.xml 和 NewDocForPost.xml 中。在这些文件中,您可以设置用于创建 CMIS 文件夹或者文档的类型。这种功能很重要,因为部分 CMIS 知识库不允许您创建基础类型 cmis:folder 或者 cmis:document 的实例。

例如,如果您想要插件使用类型 customerfolder,那么您就在 NewFolderForPost.xml 文件中指定那个名称,如清单 4 中的例子所示。

清单 4. 指定 customerfolder 类型
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<atom:entry
 xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:app="http://www.w3.org/2007/app"
 xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
    <atom:title type="text">FolderTitle</atom:title>
    <cmisra:object>
        <cmis:properties>
            <cmis:propertyId propertyDefinitionId="cmis:objectTypeId">
                <cmis:value>customerfolder</cmis:value>
            </cmis:propertyId>
        </cmis:properties>
    </cmisra:object>
    <cmis:terminator/>
</atom:entry>

属性

右键单击一个文件夹或者文档以显示 Properties 窗口。这个窗口在文件 propertiesDialog.xul 中定义,其值由在文件 propertiesDialog.js 中的 JavaScript 插入到那个窗口中。所示属性以及如何对其管理都由文件 property.cfg 中定义的配置来控制。

您可以修改 property.cfg 文件,增加任何非 CMIS 定义的属性的名称。例如,如果知识库定义一个名为 myrepository:tags 的属性,且您想允许用户修改该属性,那么您可以给 property.cfg 文件添加以下这行:

myrepositoryxyz:tags = true


关于 CMIS 插件的更多内容

如前所述,CMIS 插件通过使用 XUL 窗口、JavaScript、CSS 样式表、以及本地文件来创建。由于插件包含所有源代码,您可以探索插件的源代码,更详细地查看它的工作方式。

进行该探索的简易方法就是将插件部署到一个应用程序开发环境中,比如 Eclipse。(您可以从 Eclipse Ganymede Web site 下载 Eclipse 开发环境。)

我们已经通过将代码组织成 Eclipse 项目,再打包到 ZIP 文件中,使得这种探索简单一点。要将这个插件部署到 Eclipse 中,在本文的 “下载” 部分下载 cmisconnector.zip 文件,解压缩文件,然后创建一个基于该文件中源代码的 Java 项目。

在源代码导入到 Eclipse 中之后,您可以查看源代码,并通过先选择项目,再从顶部菜单选择 Project - Build project 构建插件。构建操作创建了一个名为 cmisconnector@ibm.com.xpi 的文件。

要安装用此方法构建的插件文件,双击项目根文件夹中的 cmisconnector@ibm.com.xpi 文件。这个操作将启动 Mozilla Firefox,显示 Software Installation 窗口,提示您安装插件(见图 13)。

图 13. 安装插件
安装插件

单击窗口中的 Install Now 按钮,重启 Firefox,然后您就可以使用您刚安装的插件了。


调试技巧

在您部署完 CMIS 插件后,使用逐句调试代码的源代码调试器很有用,这样您就可以更好地理解代码的结构。使用 Firefox 连接器时,源代码用 JavaScript 编写,所以您需要 JavaScript 调试器。

尽管有几个替代选项,但是我们用 Venkman JavaScript 调试器来创建这个插件,您可以从 Venkman JavaScript Debugger project page 下载该调试器。在部署完 Venkman JavaScript 调试器之后,您必须设置一个选项,以便查看侧边栏中的代码。要完成这个步骤,从调试器的主菜单选择 Debug,然后切换 Exclude Browser Files,关闭该选项。

现在您已经能看到 CMIS 插件的 JavaScript 源代码了;然而,要注意的是只有被加载的 JavaScript 是随时可见的。例如,cmisconnector.js 中的源代码是不可见的,除非实际加载 CMIS 插件(见图 14),还有 addRespositoryDialog.js 中的源代码也是不可见的,除非使用 Add Repository 窗口。

图 14. JavaScript 调试器
JavaScript 调试器

加载 JavaScript 之后,您可以查看源代码,设置断点。例如,图 15 显示了一个在 cmisconnector.js 的 GetChildren() 函数中设置的断点。

设置完断点后,当您扩展插件中文件夹的元素时,会在代码中那行停止,然后您可以检查变量,用 F5、F12 和 F11 键开始逐步调试代码。

图 15. GetChildren() 函数中的断点
GetChildren() 函数中的断点

展望未来

CMIS 规范将会根据公众反馈持续改进;类似地,我们的 CMIS 插件也将随着新版建议标准的发布进行修改。

当该规范获得批准,成为正式的 OASIS 标准时,将会发布这一插件的最终版本。与此同时,CMIS 规范的可选部分,例如,访问控制和再现,将会包含在以后的插件版本中。


结束语

CMIS 是一项重要的 OASIS 建议标准,它使得不同厂商之间更轻松地共享内容。Mozilla 通过用 XML 和 JavaScript 编写的插件,提供了一个用于扩展浏览器的框架。

使用 CMIS 的服务定义和 Mozilla 插件框架,您可以开发新的应用程序,它可以扩展浏览器的功能以使用来自多种资源的内容。

虽然我们希望文章中提供的代码示例是开始学习的有用方法,但我们建议您了解更多关于 CMIS 建议标准和 Mozilla 插件框架的知识,开发您自己的内容应用程序。下面的 “参考资料” 部分包含一些有用的链接,帮助您了解更多信息。


下载

描述名字大小
代码样例cmisconnector@ibm.com_src.zip107KB

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=464363
ArticleTitle=用于 Content Management Interoperability Services 的 Mozilla Firefox 插件开发
publish-date=01262010