级别: 中级 Srinivas Varma Chitiveli (schitive@us.ibm.com), 咨询软件工程师, IBM
2007 年 1 月 18 日
现在您可以使用 IBM OmniFind Yahoo! Edition 了,它是一款可免费下载的搜索引擎,使用它可以抓取和索引高达五十万 Web 页面或文件系统文件。本文将学习如何使用 Eclipse 插件将 IBM OmniFind Yahoo! 搜索界面集成到 IBM Lotus
Sametime Connect 客户端中。
简介
IBM 和 Yahoo! 合作提供了一个可以免费下载的、易于安装和使用的搜索引擎。IBM 的 OmniFind Yahoo! Edition(本文简称为 “OmniFind”)可以抓取和索引高达五十万 Web 页面或文件系统文档,并通过一个操作简单的 Web 界面对内容进行搜索。您可能已经下载了 OmniFind 并且发现它能够快速轻松地设置索引和开始搜索。
现在,您可能正在研究怎样将企业 OmniFind 搜索界面集成到您日常使用的桌面应用程序。如果您是一位 IBM Lotus Sametime Connect 用户,您可能希望在常用工具栏或聊天区域显示一个可点击的 Search 图标。当单击这个 Search 图标时,您希望企业搜索界面能够在浏览器中启动,为您提供搜索服务。这个 Search 图标使您不必手动启动您喜爱的浏览器,也不必键入您的搜索引擎的 URL 。 因此,我将为这个实现添加一些灵活性,这样您可以指定您偏好的浏览器和搜索引擎的 URL。
场景
OmniFind 搜索界面由一个宿主在搜索服务器的 Web 客户机组成。这个 Web 客户机公开了一个编辑框,可输入搜索条目和显示收集到的索引数据结果。这篇文章演示了 Eclipse 和 Sametime 插件的扩展从而实现在您选的浏览器里启动 OmniFind 搜索界面 。本文着重介绍了插件的开发,它能够在工具栏、弹出菜单和聊天窗口中显示可点击的搜索图标。您可以将图标部署到您希望的位置。
为便于理解,在随后的子节中我将从预期的结果开始,为您介绍通过插件实现将图标嵌入到 Sametime GUI 不同的可见区域。本文将在后面的部分中介绍插件的代码实现。
配置参数
为了保持灵活性,我实现了一个插件,它将展开参数页面,您可以指定喜爱的搜索引擎的 URL 和喜爱的浏览器的绝对路径。图 1 中,用红色标识的参数是插件增加的部分。
图 1:IBM OmniFind Yahoo! 参数
在上面显示的搜索引擎的 URL 中,必须标记一个代替物来指定搜索条目。在下面的例子中,URL 引用了 OmniFind 搜索服务器,搜索条目的代替物用 <SUB> 标识:
http://mecklenburg.wma.ibm.com:8080/search/?index=Default&start=0&results=10&
preview=false&output=html&query=<SUB>
可以使用这个 URL 代表进行适当参数设置的 Google 或者 Yahoo 搜索服务器的代替物。在随后的内容中,您将看到如何在 Sametime Connect 客户机上用选择的个人数据替换 <SUB>。
工具栏中的 Search 图标
图 2 演示了 Sametime Connect 客户机主工具栏上面的 Search 图标:
图 2: 主工具栏中的 Search 图标
单击上面的 Search 图标来使用您预先定义好的 URL 打开一个浏览器窗口。
图 3 显示了在指定浏览器中启动的 OmniFind 搜索界面:
图 3:基于 Web 的搜索界面
聊天视图中的 Search 图标
在聊天视图中添加搜索图标可以帮助我将精力集中在聊天室中。
图 4 显示了将 Search 图标显示在聊天视图中的插件实现:
图 4: 聊天视图中的 Search 图标
当单击上面的图标,浏览器将显示在选项卡区域。
图 5 显示了选项卡区域具有指定 URL 的浏览器,证明了插件可以在一个内部浏览器中启动 URL :
图 5: 内部浏览器中的 Search 界面
弹出菜单中的 Search 图标
图 6 显示了弹出菜单中的 Search 项。
图 6: 弹出菜单中的 Search 项
当您选择自己的好朋友并单击弹出菜单时,将启动搜索页面并将用户电子邮件的 ID 作为搜索条目。这在博客、developerWork 或由 IBM OmniFind Yahoo! Edition 索引的企业内容中搜索某人的文章时非常有用。
开始
要构建搜索插件,您需要使您的插件环境适合 Lotus Sametime。下面是编写该产品任意插件的基本步骤:
- 下载
Eclipse SDK 3.2
,安装面向 Eclipse 的 J9 Java Development Tools (JDT) 启动插件。
- 配置您的运行时以使用 J9。
- 为 Java Developer Kit (JDK) 1.4 配置 Eclipse 编译器设置。
- 指定 Lotus Sametime 为 Eclipse 中的目标平台。
这开始的四个步骤在 Lotus Sametime Lotus Sametime Software Development Kit 中做了更详细的说明,所以本文不再多做介绍。
将 Lotus Sametime 作为 Eclipse 中的目标平台
要使用 Eclipse 为 Lotus Sametime 创建插件,必须指定 Lotus Sametime 作为目标平台。 在 Eclipse 中,选择 Window > Preferences 打开 Preferences 对话框。在左边的面板中选择 Plug-in
Development > Target Platform。
在 Location 字段中,浏览 Lotus Sametime Connect 客户机安装位置,如
C:\Program Files\IBM\Sametime,并单击 Reload。参见下图:
图 7: Preferences 对话框
创建一个新的插件开发项目
在 Eclipse 中创建开始一个项目所需的插件。要实现此目的,执行以下步骤:
- 选择 File > New Project。
- 在 New Project 对话框中,打开 Plug-in Development 文件夹,选择 Plug-in Project,然后单击 Next。
- 在 New Plug-in Project 向导中,将项目命名为 com.developerworks.sametime.search ,然后单击 Next。
- 在下一个向导面板中,完成以下字段:
- Plug-in ID:com.developerworks.sametime.search (或类似内容)
- Plug-in Version: 1.0.0
- Plug-in Name:Search Plug-in (与插件 ID 相同)
- Plug-in Provider:(输入公司名字)
- 选择 “Generate an activator, a Java class that controls the plug-in's life cycle” 和 “This plug-in will make contributions to the UI” 选项(参见图 8)。单击 Finish 结束。
图 8:New Plug-in Project 向导
Plug-in 依赖关系
搜索插件要集成到 Lotus Sametime Connect 用户界面还需要其他的插件,以下步骤将添加需要的插件:
- 在 Eclipse 的 Manifest Editor 中打开 META-INF MANIFEST.MF。
- 选择 Dependencies 选项卡。
- 在 Required Plug-ins 部分添加以下插件(参见图 9):
- org.eclipse.ui
- org.eclipse.core.runtime
- com.ibm.collaboration.realtime.browser
- com.ibm.collaboration.realtime.people
- com.ibm.rcp.realtime.livenames
- com.ibm.collaboration.realtime.imhub
- com.ibm.collaboration.realtime.chatwindow
图 9: Eclipse 依赖关系
完成 Eclipse 项目配置后,您可以继续阅读本文后面的部分。这些部分将向您介绍之前提到的各种插件的开发。
通过参数页面实现参数
展开 Eclipse 插件为 Sametime GUI 客户机添加一个参数页面。在参数页面中,将使用参数描述搜索引擎,指定 Web 界面的 URL 和您喜爱的浏览器的绝对路径:
IBM OmniFind Yahoo! 参数
在 IBM OmniFind Yahoo! 参数页面保存您设置的参数,如图 10 所示:
图 10: IBM OmniFind Yahoo! 参数
要创建搜索参数页面,打开 META-INF/MANIFEST.MF 文件,选择 Extensions 选择卡并单击 Add 按钮打开 New Extension 窗口。在 New Extension 窗口中,选择 Extension Wizards 选项卡。在 Extension Wizards 选项卡右侧的面板中选择 Preference Page 扩展模板并单击 Next。如下图所示。
图 11. New Extension 向导
这一步为您的参数页面创建了一个模板,您可以根据需要进行修改。将参数页面的类名设置为 SearchPreferences。将参数页面名字设置为 IBM OmniFind Yahoo! 参数。使用默认的包名 com.developerworks.sametime.search.preferences 作为您的 Java 包名,单击 Finish(参见图 10)。
当创建您的模板时,Eclipse 会为您生成一个名为 PreferenceConstants 的类。这个类可以方便存储您的参数页面使用的常量值。您可以使用以下代码来替换自动生成的代码:
清单 1: 搜索参数的代码片段
/**
* Constant definitions for plug-in preferences
*/
public class PreferenceConstants {
public static final String SearchEngineDescription = "Search engine description";
public static final String SearchEngineURL = "Search URL";
public static final String BrowserLocation = "Browser location";
}
|
另一个自动生成的类是 PreferenceInitializer 类。这个类的 InitializeDefaultPreference 方法可以为您的参数值填充默认值。注意下面的代码实现了类如何使用您在 PreferenceConstants 类中定义的常量。默认情况下,浏览器位置被放在了 Microsoft Internet Explorer 的默认安装位置(c:\Program Files\Internet Explorer\iexplore.exe)。
清单2: 初始化默认参数代码片段
public void initializeDefaultPreferences() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault(PreferenceConstants.SearchEngineDescription,
"IBM OmniFind Yahoo! Edition");
store.setDefault(PreferenceConstants.SearchEngineURL,
"http://mecklenburg.wma.ibm.com:8080/search/?index=Default&start=0&results=10&
preview=false&output=html&query=<SUB>");
store.setDefault(PreferenceConstants.BrowserLocation,
"c:\\progra~1\\intern~1\\iexplore.exe");
}
|
模板生成创建了另一个 SearchPreferences 类。这个类为参数页面定义了布局。可以使用下面的构造器片段代替自动生成的构造器:
清单 3: 搜索参数的代码片段
public SearchPreferences() {
super(GRID);
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription("IBM Omnifind Yahoo! preferences");
}
public void createFieldEditors() {
addField(new StringFieldEditor(PreferenceConstants.SearchEngineDescription,
"Search engine:", getFieldEditorParent()));
addField(new StringFieldEditor(PreferenceConstants.SearchEngineURL,
"Search URL:", getFieldEditorParent()));
addField(new StringFieldEditor(PreferenceConstants.BrowserLocation,
"My browser location:", getFieldEditorParent()));
}
|
我们选择了默认情况下有一个列的 GRID 布局。您添加的每一个 FieldEditor 窗口部件都有自己的行。
您必须提供输入区域,供客户机编辑它的参数值(具体指浏览器位置和搜索 URL)。图 10 显示了合并到您的参数页面中的图形输入工具。
要创建输入区域,您要使用自己的代码替换生成的 createFieldEditors 方法(您必须在父 FieldEditorPreferencePage 类覆盖它)。在上面的代码中,使用 StringFieldEditor Eclipse 窗口部件通过编程的方法添加了三个字段编辑器。
搜索工具
在深入研究用于扩展插件的代码之前,先来看一些常用代码,它们可以处理 URL 编码、解析 URL 来使用搜索条目替换可替换的变量,以及在外部浏览器中启动指定的 URL 。
下面显示了自解释的工具类:
清单 4: 搜索工具代码片段
public class SearchUtilities {
/*
* Launch the URL in a external browser
*
* @param String search term(s)
*/
public static void showSearches(String searchTerm) {
// get location of the specified browser
String browserLocation = Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.BrowserLocation);
try {
// launch the browser
Runtime.getRuntime().exec(browserLocation + " " + getSearchURL(searchTerm));
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* Replace the substitutable variable in the search URL with search term.
* Encode the URL for special characters. The parsed URL will be returned.
*
* @param String search terms(s) @return String parser URL string
*/
public static String getSearchURL(String searchTerm) {
String searchURL = Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.SearchEngineURL);
searchURL = searchURL.replaceAll("<SUB>", encodeSearchTerms(searchTerm));
return searchURL;
}
/*
* Encode the passed string.This function can be modifed further to address
* various URL encoded characters.
*
* @param String URL string @return String encode special characters
*/
private static String encodeSearchTerms(String urlString) {
return urlString.replace(' ', '+');
}
|

 |

|
在工具栏中实现一个搜索图标
这一节介绍了在工具栏显示搜索图标所需步骤。完成本节的学习之后,您将在 Sametime GUI 中实现如下更改:
图 12: 工具栏中的搜索图标
视图插件扩展
使用 Eclipse IDE 来扩展 “org.eclipse.ui.viewActions”。在图 13 中,指定了创建一个构成视图的动作所需的信息:
图 13: 扩展视图
这是在 plugin.xml 文件中填充的扩展:
清单 5: 改变 plugin.xml 的代码片段
<extension point="org.eclipse.ui.viewActions">
<viewContribution id="com.developerworks.sametime.search.viewContribution1"
targetID="com.ibm.collaboration.realtime.imhub" >
<action
class="com.developerworks.sametime.search.SearchViewActionDelegate"
enablesFor="0"
icon="images/searchI.gif"
id="com.developerworks.sametime.search.action1"
label="IBM Omnifind Yahoo! search"
style="push"
toolbarPath="buddylist/additions"
tooltip="IBM Omnifind Yahoo! search"/>
</viewContribution>
</extension>
|
您需要参考 Sametime SDK 来获得更多关于以上 XML 片段的各种属性的详细信息。
搜索视图动作代表
实现一个在单击 Search 图标时会触发的动作代表是十分必要的。这个动作代表实现了 BuddyListDelegate,它是 Sametime 发布的一部分。run() 方法在没有默认搜索条目下启动了一个外部浏览器:
清单 6: 搜索视图代表代码片段
public class SearchViewActionDelegate implements BuddyListDelegate {
public void run(ISelection arg0) {
// TODO Auto-generated method stub
SearchUtilities.showSearches("");
}
}
|
下面是搜索动作代表启动的 OmniFind 搜索界面:
图 14: IBM OmniFind Yahoo! 搜索界面
在聊天视图中实现 Search 图标
因为您在聊天窗口中比在 Sametime 主视图中会花费更多时间,所以在聊天窗口工具栏中显示 Search 图标非常有用。在本节末尾,您会看到聊天窗口发生下列变化:
图 15: 在聊天窗口中显示 Search 图标
聊天窗口的插件扩展
使用 Eclipse IDE 定义对 Sametime 的 “com.ibm.collaboration.realtime.chatwindow.chatArea” 和 “com.ibm.collaboration.realtime.chatwindow.chatAction” 插件的扩展。前一个扩展解决了在聊天窗口中显示 Search 图标所必需的实现,后者实现了在内部浏览器显示搜索界面。内部浏览器使用聊天视图作为显示区域。您也可以在一个外部浏览器显示搜索界面,但是这种方法削弱了 Eclipse 包一些增强的特性。
请参考 Sametime SDK 以了解更多关于 chatArea 和 chatAction 插件的详细信息。
图 16 显示了一个内部浏览器中的搜索界面。同样,因为我们没有指定任何搜索条目,这个搜索界面没有显示搜索条目:
图 16: 内部浏览器中的搜索界面
图 17 显示了 Eclipse IDE 和新插件的定义:
图 17:
扩展窗口
这些是 plugin.xml 文件的附件:
图 7: plugin.xml 中聊天扩展的代码片段
<extension point="com.ibm.collaboration.realtime.chatwindow.chatArea">
<chatArea
class="com.developerworks.sametime.search.SearchChatWindowExtension1"
enabled="false"
id="com.developerworks.sametime.search.searchchatArea1"
label="IBM Omnifind Yahoo! search"/>
</extension>
<extension point="com.ibm.collaboration.realtime.chatwindow.chatAction">
<chatAction
class="com.developerworks.sametime.search.SearchChatActionDelegate2"
displayName="IBM Omnifind Yahoo! search"
id="com.developerworks.sametime.search.chatAction2"
image="images/searchI.gif"
path="buddy/end"
showsFor="both"
tooltipText="Click to show search interface in tabbed area"
type="buddy"/>
</extension>
|
聊天动作代表
以下的类可以实现聊天动作和聊天窗口的动作代表:
清单 8: 聊天动作代表的代码片段
public class SearchChatActionDelegate2 extends ChatWindowAction {
public SearchChatActionDelegate2() { }
public void run() {
// Show all ChatArea extensions with getChatWindowHandler().addChatAreas()
// or just one as shown below
getChatWindowHandler().enableChatArea
("com.developerworks.sametime.search.searchchatArea1");
}
}
|
清单 9: 聊天窗口扩展的代码片段
public class SearchChatWindowExtension1 extends ViewPart implements ChatWindowExtension {
ChatWindowHandler handler;
public SearchChatWindowExtension1() {}
public void createPartControl(Composite parent) {
Browser browser = new Browser(parent, SWT.NONE);
browser.setUrl(SearchUtilities.getSearchURL(""));
}
public void setFocus() {}
public ChatWindowHandler getChatWindowHandler() {
return handler;
}
public void setChatWindowHandler(ChatWindowHandler handler) {
this.handler = handler;
}
}
|
在弹出菜单中实现 Search 图标
Internet 中的内容过多,因此有时在公司索引中发现关于一个人的信息非常有用。这个索引可以来自博客或 developerWork 文章,或者其他来源。查询基于博客的索引,一个用户名或一个电子邮件的 ID 是很好的搜索条目。本节演示了作为弹出菜单显示的搜索动作。当选择一个人的条目(或几个人的条目)并右键单击时会启动弹出菜单。演示代码从选择的聊天好友提取了电子邮件 ID 并将其作为搜索条目填充到一个外部浏览器的 URL。
图 18 显示了作为弹出菜单一部分的搜索动作:
图 18: Search 作为弹出菜单的一个条目
弹出菜单的插件扩展
使用 Eclipse IDE 扩展 “org.eclipse.ui.popupMenus”。在图 19 中,我指定了创建一个动作所需的所有信息,这个动作被指定为一个 Sametime 对象的对象贡献,称为 “com.ibm.collaboration.realtime.livenames.PersonSelection”。 PersonSelection 在 Sametime 中代表了一个聊天好友实例。请参考 Sametime SDK 了解更多详细信息。
图 19 显示了具有插件扩展的 Eclipse IDE:
图
19: Extensions view
以下是适合添加到 plugin.xml 文件的内容:
图 10:plugin.xml 中弹出菜单条目的代码片段
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
adaptable="false"
id="com.developerworks.sametime.search.personselection"
objectClass="com.ibm.collaboration.realtime.livenames.PersonSelection">
<action
class="com.developerworks.sametime.search.SearchDelegate"
enablesFor="+"
id="com.developerworks.sametime.search.SearchDelegate"
label="IBM Omnifind Yahoo! search"
style="push"/>
</objectContribution>
</extension>
|
弹出菜单的动作代表
当选择 Search 菜单时要调用下面这个类:
清单 11: 搜索代表的代码片段
public class SearchDelegate extends LiveNameActionDelegate{
public void run(IAction arg0) {
Person[] persons = getSelectedPersons();
String searchTerm = "";
for(int i=0; i<persons.length; ++i){
Person p = persons[i];
searchTerm += " " + p.getContactId();
}
if (searchTerm != null) {
SearchUtilities.showSearches(searchTerm);
}
}
}
|
在上面的代码片段中,电子邮件 ID 从选择的对象中提取,并被馈送到启动外部浏览器的搜索工具。您可以对此代码进行修改,使其提取用户名而不是电子邮件 ID 。
部署插件
从本文 下载 部分中下载 com.developerworks.sametime.search.deploy.zip 文件并将它移动到 Sametime 安装根目录下的插件目录。在 Microsoft Windows® 中,将文件放到 c:\program files\IBM\sametime\plugins。如果您不打算使用本文中介绍的全部三种插件,您需要修改 plugin.xml 文件(绑定在档案中)并且注释掉您不希望 Sametime 客户机继承的扩展。如果您修改了打包的 plugin.xml 文件,就需要在将它移入 Sametime 插件目录之前重新打包这些更改。
源代码
插件的示例源代码被打包在位于 下载 部分的 com.developerworks.sametime.search.source.zip 文件中。解压缩源代码后,您可以使用 Eclipse IDE 检查和修改示例源代码。
结束语
这篇文章介绍了将搜索界面集成到基于 Eclipse 的应用程序。我们检验了定制插件在 Sametime Connect 客户机不同显示区域的效果,并且学习了如何在您的系统中实现这些更改。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 本文中使用的文件 | com.developerworks.sametime.search.source.zip | 17805B | HTTP |
|---|
| 本文中使用的文件 | com.developerworks.sametime.search.deploy.zip | 13045B | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Srinivas Varma Chitiveli 是 IBM 软件组的一名软件工程师。他参与开发了 IBM 产品,这些产品处理针对安全的电子商务事务、内容管理和跨分布式数据源搜索信息而发布数字证书相关的技术。 |
对本文的评价
|