本文将介绍如何在 Eclipse 中编写 Java 代码来扩展 IBM Lotus Notes V8 客户机,以及在个人电子邮件中如何自如地使用 Lotus Notes,并扩展邮件使其包含新的 Mail Rule Runner,以让用户在客户机上手动运行自己的规则。
本文的重点是如何在 Eclipse PDE(programming development environment,程序开发环境)中编写 Java 代码来扩展 IBM Lotus Notes V8 客户机。我们特别展示如何在个人电子邮件中自如地使用 Lotus Notes。
本文将重点讨论核心 Eclipse 技术,包括扩展、操作集、插件、特性和更新站点。可以使用这些技术将功能部署到任何基于 Eclipse 的产品。这里将着重讨论 Lotus Notes 客户机,并对邮件进行扩展以包含新的 Mail Rule Runner,允许用户在客户机上手动运行自己的规则。
注意:我们可以自如地将 Lotus Notes 邮件用作 POP3 和 SMTP 邮件的主要客户机,但是缺少邮件规则功能。我们知道,Lotus Notes 中的邮件规则是在 SMTP 服务器上运行的,如果没有 Domino SMTP 服务器,就没有邮件排序。虽然该工具不完美,但它的确展示了如何使用 Eclipse 扩展 Lotus Notes,以及如何使用 Lotus Notes Java 后端类访问和操作 Lotus Notes 数据。
首先使用 Eclipse 来创建自己的插件。下载 部分的代码和示例是使用基本 Eclipse 版本 3.2.1 创建的。
应创建新的菜单选项,它在 Lotus Notes 邮件视图中显示为在本地运行邮件规则的操作(图标)。用户单击 Run Mail Rules 按钮时,将出现一个对话框,其中选中了所有已启用的邮件规则;然后将出现一个组合框,可以选择要运行的视图或文件夹。图 1 展示了 Run Mail Rules 对话框。其中的模糊区域隐藏了任何个人信息。
图 1. Run Mail Rules 对话框
该对话框是一个基于 Eclipse SWT 的基本对话框,它使用 SWT GridLayout 来定义如何在屏幕上确定不同 UI 元素的位置。
单击 Run 按钮后,将显示标准的 Eclipse 过程对话框,参见图 2。单击 Run in Background 按钮,可以在后台运行该对话框。如果已打开在其上运行规则的视图,那么在完成操作后按 F9 来刷新视图。显而易见,能够对该工具进行扩展,以便在完成邮件规则操作之后刷新当前屏幕。
图 2. Run Mail Rules Job 过程
创建插件
像所有插件一样,使用 Eclipse 插件向导进行创建是比较容易的部分。尽管 Eclipse 替您完成了大量工作,但像软件开发中的其他事情一样:这仅仅是开始。对于本例,使用了 Eclipse 3.2.2,并指定所安装的 Lotus Notes V8 Beta 客户机作为目标平台。建议在所有机器上始终将 Lotus Notes 安装在相同位置上,即 c:\notes。选择 Window - Preferences 来设置 Eclipse 中的目标平台。通过选择 Plug-in Development -Target Platform 来指定目标平台。图 3 展示了选择 Lotus Notes 作为目标平台。关键是选择 f\ramework\eclipse 目录。这是 Eclipse 运行时的根目录。在本例中,该目录是 c:\notes\framework\eclipse。
图 3. 指定目标平台
选择 Lotus Notes 运行时作为平台后,可以创建新插件、设置依赖项并编写依赖项代码。将 Lotus Notes 作为目标平台后,可以使用所有 Eclipse、Lotus Expeditor 以及 Lotus Notes API 和扩展。在 Package Explorer 中,右键单击并选择 New - Project。在这里选择一个 Eclipse 插件项目。图 4 展示了即将看到的屏幕,即 New Project 向导。
图 4. New Project 向导
单击 Next,然后将项目命名为 com.ibm.notes.mail.utils。这是稍后要创建的所有邮件实用程序的主要位置。对于向导的其余部分,可以选择所提供的默认值。当出现询问是否在现有模板上创建插件的屏幕后,取消选中模板选项并且不要使用任何模板。
现在在 Package Explorer 中展开新建的项目,双击 META-INF 文件夹下的 MANIFEST.MF。
导航到 Dependencies 选项卡,如图 5 所示,然后将 com.ibm.notes.java.java.api 包添加到依赖项。这样可以访问所有 Lotus Domino Java 后端类。
图 5. Dependencies 选项卡
通常,使用 Imported Packages 方法来定义依赖项。使用导入就意味着 OSGI 框架将解析包的导入内容和所需的类,而不是像本例这样必须指定特殊的包。如果重命名或删除一个指定包,则依赖项将被破坏,并且运行时将不解析类。另外,如果导入所有想要使用的包,则可以通过任何插件来公开它们。编写完插件代码之后,可以删除该依赖项,并且只导入同一个屏幕上所需的包。指定依赖项之后,就可以开始编写代码了。
扩展 CSI Views
通过向 views 工具栏添加新操作来扩展 CSI Views。在 Lotus Notes V8 Beta 中,该操作显示为带有文字 Run Mail Rule 的按钮,不过在发送产品中将显示正确图标。可以从邮件外观获取 Mail Rules 图标的屏幕截图并使用该符号。按下组合键 Alt + PrtSc 可以实现上述操作。将图标保存到图标文件夹,并将它命名为 mailrules.gif。这样该操作如图 6 所示。
图 6. Mail Rules 图标
为了显示该图标,向 Eclipse 操作集定义一个扩展。可以使用向导并添加操作集,或者只是将清单 1 中的代码复制到 plugin.xml。可能此时并没有创建 plugin.xml,因此应通过向导来创建它(或者使用 下载 部分中 ZIP 文件中的 plugin.xml)。第一个扩展是新建的操作集,它定义了菜单、工具栏路径、工具提示、图标以及被选中后希望调用的操作。下一个扩展将新操作集与 CSIViews 工具栏绑定。CSI Views 不必是公有 API,但是因为它们是作为 Eclipse 扩展公开的,所以可以编写它们。这就是 actionSetPartAssociations 扩展。通过指定带有 part ID(您希望在其中显示 com.ibm.rcp.csiviews.CSIViewPart)的 action set ID(com.ibm.notes.mail.utils.actionSets)来绑定二者。这向 Eclipse 框架表明您希望操作集与 CSIViewPart 相关联,并显示带有该视图部分的改进产品。
清单 1. CSI 扩展
<extension point="org.eclipse.ui.actionSets"> <actionSet id="com.ibm.notes.mail.utils.actionSet" label="Mail Tools"> <menu id="RunMailRules" label="Run Mail Rules"> </menu> <action class="com.ibm.notes.mail.utils.actions.RunMailRules" icon="icons/mailrules.gif" id="com.ibm.notes.mail.utils.actions.RunMailRules" label="&Run Mail Rules" toolbarPath="actions/additions" tooltip="Run Mail Rules"/> </actionSet> </extension> <extension point="org.eclipse.ui.actionSetPartAssociations"> <actionSetPartAssociation targetID="com.ibm.notes.mail.utils.actionSet"> <part id="com.ibm.rcp.csiviews.CSIViewPart" /> </actionSetPartAssociation> </extension> |
为 Java 后端类编写代码
创建了新的操作类之后,就拥有了逻辑执行切入点,那么下面开始开发执行操作的代码。RunMailRules 类包含一个 run() 方法;这就是单击按钮时调用代码的地方。因为将访问后端 Lotus Notes 对象(如数据库、文档和视图),并且调用 UI 线程,所以将在该方法中产生新线程。与所有对 Lotus Domino 对象的访问一样,需要通过调用 NotesThread.sinitThread() 来初始化线程。即需要在最后一个块中调用 NotesThread.stermThread()。
代码首先获取邮件数据库和该数据库中的所有文件夹和视图的列表。使用该列表来填充(对其执行邮件规则的)视图的下拉组合框。获取会话是本练习中最重要的部分;清单 2 中的代码展示了如何获取会话、数据库句柄以及视图和文件夹列表。
清单 2. 获取 Lotus Notes 会话
Session session = null; try{ NotesThread.sinitThread(); session = NotesFactory.createSessionWithFullAccess(); DbDirectory dbdir = session.getDbDirectory(null); Database mail = dbdir.openMailDatabase(); Vector views = mail.getViews(); Enumeration vEnum = views.elements(); … View rules = mail.getView("(Rules)"); … }finally{ NotesThread.stermThread(); |
出于对模板设计和所存储的数据的考虑,不得不对 Mail Rule 文档进行逆向工程,所以如果有一个类能够使用文档并创建各种规则元素作为 Java 对象的话,将是件不错的事情。该类对字段实现的详细内容进行抽象,而且使其在插件的其他部分中更具可读性。MailRule 对象包含了(Mail Rule 文档中的)操作、条件和异常的列表。因为所有的操作、条件和异常都来自于 Mail Rule 文档,所以使用 Document 对象来初始化对象。
采用易于进行扩展的方式来构造代码。就所期望的可扩展性对代码进行多次重构。新添操作、异常或布尔逻辑都是比较容易的事情。图 7 是整个项目的屏幕截图。
图 7. Mail Utility 项目
主要的实用程序包包含插件 Activator、主 Eclipse Job(当处理规则时,将显示在标准 Eclipse 过程对话框中)、Mail Rule 操作(包含大部分规则逻辑)以及异常类(在某种条件下停止处理规则)。
我们打算将与模型相关的所有内容都放在 models 包中,而与对话框相关的所有类都放在 dialogs 包下。很多 Eclipse 示例将 content 和 label provider 类作为 dialogs 类中的子类进行显示,但是我们希望将它们提取到各自的文件中。