2007 年 10 月 23 日
了解如何利用 IBM Lotus Sametime V7.5.1 的 Eclipse 特性。创建一个插件为 IBM Lotus Sametime Connect 添加词典工具。了解如何使用 Dictionary and Thesaurus API for Java 向 Lotus Sametime 客户应用程序增加语言特性。
由于 IBM Lotus Sametime Connect V7.5.1 是基于 Eclipse 的,可以通过增加自定义功能来扩展它。本文介绍了如何为 Lotus Sametime Connect 从头创建一个词典插件。图 1 显示了运行中的词典插件的屏幕截图,图 2 显示的是屏幕上出现的定义。
Lotus Sametime Connect 用户看到了一个原来没有的新的上下文菜单项,Lookup in Dictionary(查词典)。Dictionary and Thesaurus API for Java 是一个 IBM alphaWorks 项目(请参阅 参考资料),为我们提供了查看单词定义的功能。
阅读本文后可以创建一个有用的 Lotus Sametime 插件,但这还是次要的。我们的目的是告诉您如何利用 com.ibm.collaboration.realtime.browser.BrowserEventListenerLotus
Sametime 扩展点以及使用 com.ibm.swt.xulrunner.browser.SWTXULRunnerBrowser
对象。
使用 alphaWorks Dictionary and Thesaurus API for Java (JADT)
本文介绍的 Dictionary 插件利用 Dictionary and Thesaurus API for Java (JADT),当用户右击一个单词并选择上下文菜单中的 Lookup in Dictionary 项时,可以查看单词的定义。
JADT 是一个类库,用于在 Java 应用程序中访问语言特性。通过 developerWorks 系列文章 “Getting started with JADT” 可以进一步了解 JADT。JADT 允许以 “透明的、面向 Java 的方式访问词典和非结构化单词以及相关信息”。JADT 能够把 Lotus Sametime 插件这样的 Java 应用从使用的辞典/数据提供程序中抽象出来。通过这个抽象层,消费应用程序很容易切换使用的词典提供程序。不需要修改使用词典服务客户端接口的客户应用程序。JADT 的体系结构使得这种解耦成为可能,它提供了基于驱动的对后台语言数据的访问。图 3 显示了 JADT 体系结构图和这种解耦的过程。
使用 JADT,应用程序可以访问定义、读法、同义词、反义词以及关于词语的其他很多语言数据。关于可用语言数据的更多信息,建议阅读 JADT 系列文章。我们这里只涉及到词汇的定义、音标和词性(如形容词、名词、动词、副词等)。
|
JADT 体系结构不仅涉及到客户端的问题,还包括词典提供程序的问题。词典提供程序只要实现了驱动程序端接口,API 就允许将其作为 JADT 提供程序。本文不讨论如何实现词典提供程序。相反,我们使用 JADT 自带的默认驱动程序 JADTTextDriver,语言数据以文本格式存储。
可以从 alphaWorks 下载和安装 JADT。
使用 jar xvf
命令将 JADTInstaller.jar 解压到硬盘上的目录中。需要其中的两个 JAR 文件:jadt.jar 和 jadttextdriver.jar。还要注意 jadt_en_en.txt 文件位置,它在解压出来的安装程序 JAR 文件中。用文本编辑器打开来看看里面的内容是一种好办法。该文本文件作为数据存储,包含需要查找的单词的定义。
看到使用的文本文件时您可能怀疑,默认的文本驱动程序不是一个功能完善的词典提供程序。英语中的很多单词及其定义没有包含在其中。但 JADT 的优美之处在于,可以创建自己的驱动程序访问数据库、调用 Web 服务或者采用其他机制采集词典定义这样的语言信息。
DictionaryUtility 类
我们来仔细地看看 com.devworks.example.dictionary.DictionaryUtility
类,插件通过它来和 JADT 交互。这个类有两个方法:loadDictionary 静态方法和 getMeanings 静态方法。清单 1 显示了 loadDictionary 静态方法。
public static Dictionary loadDictionary(String dictionaryLocation) { try { Class.forName("com.ibm.jadtdrivers.TextDriver.JADTTextDriverFactory"); JADTDriverFactory factory = JADTDriverFactoryManager.getJADTDriverFactory("JADTTextDriverFactory"); JADTDriver driver = factory.createJADTDriver(); driver.setProperty("JADTTextDriverDir",dictionaryLocation); dictionaryCache = driver.getDictionary("english","english"); dictionaryLoaded = true; return dictionaryCache; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (JADTException e) { e.printStackTrace(); } return null; } |
不考虑 JADT API 的复杂性,该方法的任务就是创建一个 JADTDriver 对象,后者提供对各种服务的访问,包括需要的词典服务。该方法中指定希望使用默认驱动程序 JADTTextDriver。方法是从工厂对象中得到该驱动程序的实例。从 JADTTextDriver 对象通过下列调用获得了 com.ibm.jadt.Dictionary
对象:
dictionaryCache = driver.getDictionary("english","english");
请注意前面的方法调用中两个参数都指定为 “english”。JADT 可以包含翻译成其他语言(如西班牙语)的 Dictionary 对象。我们这里希望返回的定义仍然用英语。
请注意,这里将 Dictionary 对象保存在一个静态变量 dictionaryCache 中。这样做是为了避免每次用到时加载 Dictionary 对象的开销。我们将其放在内存中以便下次使用。
加载 Dictionary 后就可以查看所需单词的定义了。这个功能是在 DictionaryUtility 类的 getMeanings 静态方法中实现的,如清单 2 所示。
public static String getMeanings(String wordToLookup) { String returnString = ""; if (dictionaryLoaded) { DictionaryRecord dr = dictionaryCache.getMeaning(wordToLookup); while (dr!=null) { returnString+= dr.getType() + " " + dr.getPronunciation() + " " + dr.getDescription() + "/n"; dr=dr.getNextRecord(); } if (returnString.equals("")) returnString = DEFINITION_NOT_FOUND_STR; } else returnString = DICTIONARY_NOT_LOADED; return returnString; } |
getMeanings 方法依赖于 JADT Dictionary 对象的 getMeaning 方法从底层词典提供程序中查找给定单词的定义。该方法返回一个 DictionaryRecord 对象。这个对象和 JDBC 中的 ResultSet 对象很相似。循环遍历 DictionaryRecord 对象中保存的记录,串接成包含单词含义的一个字符串。利用下面的 DictionaryRecord 对象方法:
得到单词的含义后,将生成的字符串通过 getMeanings 传递给调用它的 Lotus Sametime 插件方法。
设置 Lotus Sametime 插件开发环境
要使用 Eclipse 3.2.2 开发和测试 Lotus Sametime V7.5.1 插件,需要改变 Eclipse 的一些首选项。第一步是将 Target Platform 从 Eclipse 改为 Lotus Sametime。
Target Platform 是作为 Eclipse 首选项指定的。修改 Target Platform 请选择 Window - Preferences。在左侧面板中,展开 Plug-in Development 选项并选择 Target Platform。
在 location 字段中,使用 Browse 按钮转到 Lotus Sametime Connect 的安装目录(默认为 C:/Program Files/IBM/Sametime Client)来指定 Lotus Sametime Connect 的位置。单击 Reload。检查是否安装了 com.ibm.collaboration.realtime
插件,然后单击 OK。
如果 Lotus Sametime 插件(com.ibm.collaboration.realtime
)没有像图 4 那样出现,在浏览器窗口中指定 Target Platform 所在的位置。Target Platform 目录下包括两个子目录:plug-ins 和 features。如果 Target Platform 没有这两个子目录,则所用的 Lotus Sametime Connect Target Platform 位置就是错误的。这时候就需要改为正确的 Lotus Sametime 客户机位置。
|
开始创建 Dictionary 插件
现在我们来创建和配置 Dcitionary 插件。首先建立一个新的插件项目,命名为 com.devworks.example.dictionary
。选择 File - New - Project 创建新项目。可以看到图 5 所示的 New Project 向导。在 New Project 向导中选择 Plug-in Project 然后单击 Next。
接下来的 New Plug-in Project 向导如图 6 所示。在项目名中输入 com.devworks.example.dictionary
然后单击 Next。
在下一个窗口(如图 7 所示)中取消选择 “This plug-in will make contributions to the UI”。单击 Finish。
|
向 Dcitionary 插件中导入 Dictionary 代码
Dictionary 插件需要访问 JADT JAR 文件和 DictionaryUtility 类。因此必须向 Dictionary 插件类路径中添加需要的 JADT JAR 文件和 DictionaryUtility.java 文件。可以从本文 下载 的项目 ZIP 文件中找到 DictionaryUtility.java 类。将该 ZIP 文件解压到和 JADT 安装程序 JAR 文件相同的目录中。
首先选择 File - Import。可以看到图 8 所示的 Import 向导。选择 File System 然后单击 Next。
本文转自:IBM developerWorks 中国