级别: 中级 Shruti Gandhi, 一流架构师, IBM
2006 年 10 月 26 日 理解了 IBM Lotus Sametime V7.5 中的位置识别特性之后,就可将其与 Lotus Sametime Software Development Kit(SDK)配合使用,创建一个插件,为选定的 Sametime 合作伙伴显示当地气象信息。
在上一篇文章 “探索 IBM Lotus Sametime V7.5 中的位置识别” 中,您了解了什么是位置识别和如何在 Lotus Sametime V7.5 中使用位置识别。还了解到可通过 IBM Lotus Sametime V7.5 Software Development Kit(SDK)访问位置识别功能。在本文中,我将介绍如何使用 Lotus Sametime SDK 来为 Lotus Sametime Connect V7.5 编写一个基于位置的插件。
本文为您展示了如何使用 Sametime 位置识别特性来创建一个插件,为您的 Sametime 合作伙伴显示当地气象信息。本文假设您已具备一定的在 Eclipse IDE 中开发 IBM Lotus Sametime Connect 插件的经验。关于开发 Sametime 插件和 Lotus Sametime SDK 的更多信息,请参见参考资料部分。
显示当地气象信息
本文指导您创建 Local Weather 插件,介绍如何扩展联系人列表上的活动名称(live name)来提供基于位置的数据。在示例中,我们为您展示了如何在右击合作伙伴的名字时获得该联系人的当地气象信息(参见图 1)。通过使用位置识别,您就可以了解您的合作伙伴所在城市的气象信息。
图 1. Local Weather 插件
如图 1 所示,这位合作伙伴位于 Cambridge, MA, US。在右键上下文菜单中选择 Local Weather 时,Local Weather 插件检索并在一个独立的窗口中显示 Cambridge, MA 的气象信息(参见图 2)。气象信息检索自 DynaWeather.com Web 站点。
图 2. Cambridge, MA 当地气象信息
您可在联系人列表中选择多个合作伙伴,接收多个气象 mashup(每个对应一位合作伙伴)。
开始
要构建 Local Weather 插件,您需要使您的环境插件为 Lotus Sametime 作好准备。为该产品编写任何插件的基本步骤均如下所示:
- 下载 Eclipse SDK 3.2,安装 Eclipse 的 J9 Java Development Tools(JDT)launch 插件。
- 将您的运行时配置为使用 J9。
- 为 Java Developer Kit(JDK)1.4 配置 Eclipse 编译器设置。
- 在 Eclipse 中将 Lotus Sametime 指定为目标平台。
可在 Eclipse Web 站点 下载 Eclipse SDK 3.2。随 SDK 提供的 Lotus Sametime SDK 文档详细介绍了前三个步骤,本文不再赘述。
在 Eclipse 中使 Lotus Sametime 成为目标平台
要使用 Eclipse 创建 Lotus Sametime 插件,您必须将 Lotus Sametime 指定为目标平台。在 Eclipse 中,选择 Window - Preferences,打开 Preferences 对话框。在左窗格中选择 Plug-in Development - Target Platform。
在 Location 字段中,浏览并找到您的 Lotus Sametime Connect 客户机的安装目录,例如, C:\Program Files\IBM\Sametime,然后单击 Reload(参见图 3)。
图 3. Preferences 对话框
现在我们来编写一个插件,示范如何使用位置信息来为您在联系人列表中选中的任何合作伙伴交付基于位置的服务。这个插件提供您希望了解的任何用户的气象信息。
创建新插件
在 Eclipse 中,要创建一个插件,您需要从项目开始。为此,按以下步骤操作:
- 选择 File - New Project。
- 在 New Project 对话框中,打开 Plug-in Development 文件夹,选中 Plug-in Project,然后单击 Next。
- 在 New Plug-in Project 向导中,将您的项目命名为:com.ibm.collaboration.realtime.location.weather,然后单击 Next。
- 在向导的下一个面板中,填好以下字段:
- Plug-in ID:com.ibm.collaboration.realtime.location.weather(或类似的其他 ID)
- Plug-in Version:1.0.0
- Plug-in Name:com.ibm.collaboration.realtime.location.weather(应与插件 ID 相同)
- Plug-in Provider:(输入您的公司名)
- Classpath:Weather.jar
- 选中 “Generate an activator, a Java class that controls the plug-in's life cycle” 和 “This plug-in will make contributions to the UI” 选项(参见图 4)。选中后一个选项时,Activator 类将扩展 AbstractUIPlugin,后者扩展 Plugin 类。相关详细信息,请参阅 developerWorks Lotus 文章 “利用 LDAP 目录查看插件扩展 Lotus Sametime 客户机”。
- 完成后单击 Finish。
图 4. New Plug-in Project 向导
插件依赖项
Local Weather 插件依赖其他插件来扩展 Lotus Sametime Connect 用户界面。按以下步骤来添加必需的插件:
- 在 Eclipse 中,用 Manifest Editor 打开 META-INF MANIFEST.MF。
- 选择 Dependencies 选项卡。
- 在 Required Plug-ins 部分中添加以下插件(参见图 5):
- org.eclipse.ui
- org.eclipse.core.runtime
- com.ibm.collaboration.realtime.people
- com.ibm.rcp.realtime.livenames
- com.ibm.collaboration.realtime.core
图 5. 依赖项
添加到右键菜单
要触发 Local Weather 插件,您要用到图 1 所示的一个右键上下文菜单项 Local Weather。可使用以下 livenames.PersonSelection extension 将其添加到一个、多个或一组选定用户的右击活动中。在 Eclipse 中编辑 plugin.xml 文件,添加如下扩展。
<plugin>
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
adaptable="false"
id=
"com.ibm.collaboration.realtime.location.weather.BuddyLocalWeather"
objectClass=
"com.ibm.collaboration.realtime.livenames.PersonSelection">
<action
class=
"com.ibm.collaboration.realtime.location.weather.BuddyLocalWeather"
id=
"com.ibm.collaboration.realtime.location.weather.BuddyLocalWeather"
label="Local Weather"
menubarPath="im_additions"/>
</objectContribution>
</extension>
</plugin> |
BuddyLocalWeather 是实现这些活动需要的类。这个类检测针对右键菜单而进行的合作伙伴选择情况的变化,并确定选择了多少个人。
也可通过 MANIFEST.MF 中的 Extensions 选项卡添加 BuddyLocalWeather 类,步骤如下:
- 在 Eclipse 中,用 Manifest Editor 打开 MANIFEST.MF。
- 选择 Extensions 选项卡。
- 单击 Add 按钮。
- 在 New Extension 对话框中,选中 org.eclipse.ui.popupMenus,然后单击 Finish。
此时的扩展应如图 6 所示。
图 6. 添加到扩展的 BuddyLocalWeather 类
创建实现 IObjectActionDelegate 的类
插件可以使用 Eclipse 的 org.eclipse.ui.popupMenus 扩展点将其自己的菜单项插入对象。定义菜单活动行为的类实现 IActionDelegate 接口。此接口定义所需的方法,包括在用户选中了所插入的菜单项时调用的 run 方法。
关于 IActionDelegate 的更多信息,请参阅 Eclipse 文档。
在 Eclipse 的 Package Explorer 视图中,有一个名为 com.ibm.collaboration.realtime.location.weather 的包。右击它,并在上下文菜单中选择 New - Class,新建一个 Java 类。
在 New Java Class 对话框中输入名称:BuddyLocalWeather。单击对话框中的 Add 按钮,然后在打开的 Implemented Interfaces Selection 对话框中输入 IObjectActionDelegate。单击 OK。
IObjectActionDelegate 为所有插入右键上下文菜单的对象活动提供了一个接口,从而扩展了 IActionDelegate。更多信息请参阅 Eclipse 文档。
输入项应如图 7 所示。完成后单击 Finish。
图 7. New Java Class 对话框
您已经创建了以下类:
public class BuddyLocalWeather implements IObjectActionDelegate {
public void setActivePart(IAction arg0, IWorkbenchPart arg1) {
// TODO Auto-generated method stub
}
public void run(IAction arg0) {
// TODO Auto-generated method stub
}
public void selectionChanged(IAction arg0, ISelection arg1) {
// TODO Auto-generated method stub
}
} |
接下来实现 selectionChanged 和 run 方法。selectionChanged 方法帮助您检测选中了哪个合作伙伴、选中了多少个合作伙伴。这一选择情况将作为 IStructuredSelection 返回。run 方法在右击活动被调用时执行。
由于选择情况将作为 IStructuredSelection 返回,因此您必须遍历列表,获取 PersonSelection 成员条目。各 PersonSelection 条目均包含一个 Person 对象,它具有活动名称、联系人姓名、显示名称等信息。除这些信息之外,返回结果中还会包含一个 location 对象。
通过 person 对象访问 location 对象:
person[x].getLocationInfo()
这个 location 对象包含合作伙伴的相关信息,包括:
- 城市
- 州
- 国家
- 邮政编码
- 用户的个人位置名称
- 时区
- 用户在该位置的电话号码
以下代码给出了访问 location 对象的信息的方法:
public String getZip(Person persons){
return persons.getLocationInfo().getPostalCode();
}
public String getCity(Person persons){
return persons.getLocationInfo().getCityName();
}
public String getState(Person persons){
return persons.getLocationInfo().getStateName();
}
… |
要查看 Local Weather 插件的完整代码,请参见下载部分。
获取位置数据
这个示例使用 DynaWeather 的服务来获得一个位置的气象情况的图形化表示。在如下 URL 中,您可使用任何邮政编码来取代其中的 #ZIP#,以获得相应位置的气象图:
http://dynaweather.com/hw3.cgi?forecast=hourly&pands=#ZIP#&config=png&alt=hwicc&daysonly=1
这样,在 Local Weather 插件中,只要您检索到一个人的位置,就可以将 #ZIP# 替换为有效的邮政编码。run 方法被调用时,代码获取所选人数,然后检索其 contactId 和 communityId 来获取其位置信息,并创建气象 mashup。
public void run(IAction arg0) {
Person[] persons = getSelectedPersons();
getSelectedUsersString(persons);
}
//Create a list of people selected
protected Person[] getSelectedPersons() {
if (ss == null)
return new Person[0];
List items = ss.toList();
List people = new ArrayList();
for (Iterator it = items.iterator(); it.hasNext();) {
Object item = it.next();
if (item instanceof PersonSelection) {
PersonSelection personSelection =
(PersonSelection) item;
String contactId =
personSelection.getPerson().getContactId();
String communityId =
personSelection.getPerson().getCommunityId();
Person person = getPerson(contactId, communityId);
people.add(person);
}
}
return (Person[]) people.toArray(new Person[people.size()]);
}
//Traverse through all the people that you selected
//and create a mash-up shell for them
private void getSelectedUsersString(Person[] persons) {
for ( int i=0;i<persons.length;i++) {
Person person = persons[i];
String zip = getZip(person);
String city = getCity(person);
String state = getState(person);
String country = getCountry(person);
createShell(zip, city, state, country, person);
}
} |
为创建 mashup,使用了一个浏览器小部件来调用 Browser.setURL 方法,设置 DynaWeather URL 以在 mashup 中显示气象图。
注意:我们这个示例中使用 DynaWeather.com 仅出于演示目的。您可任选气象服务来使用。如果您希望使用 DynaWeather,我们建议您取得该站点的许可。
结束语
在 Local Weather 插件中,我们使用合作伙伴的位置数据来确定合作伙伴所在地区的气象情况。您可使用位置信息来查找许多基于位置的重要场所,例如饭店、电影院等等。衷心希望这篇文章能够激发您的灵感,使您充分利用 Lotus Sametime 的位置识别特性。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample plug-in code | location-awareness.zip | 13 KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Shruti Gandhi 是实时协作领域基于位置的服务方面的一流架构师。她也是一位使用 IBM Lotus Sametime Connect V7.5 客户机的开发人员。她目前正在哥伦比亚大学攻读计算机科学硕士学位,即将毕业。 |
对本文的评价
|