级别: 中级 钟 华 (zhonghua@cn.ibm.com), 售前技术工程师, IBM 软件部
2007 年 8 月 30 日 Lotus Sametime 为企业提供了在线感知、安全即时消息以及 Web 会议,除了以上功能,Sametime 还提供更多功能。它是一个基于开放标准的实时协作平台,企业以及 IBM 合作伙伴可以使用 Sametime 7.5 API 以及工具包来开发创新的实时协作应用,或是增强 任何应用程序、业务流程以及第三方应用。本文正是基于 Sametime 所提供的开发标准平台这一特性,实现了 Sametime 与待办事宜集成的场景,在此场景中包含了富文本消息的发送、待办提醒、Sametime 与后端系统 SSO(Single sign-on) 等功能点,相信会给正在实施或计划实施 Sametime 与应用集成的技术人员带来一些帮助。
超越 Lotus Sametime
已于 2006 年 8 月上市的 Lotus Sametime 7.5 的面世,不仅在应用上大幅度扩展了实时协作软件的功能,提供了最佳的即时消息传递和 Web 会议用户体验,同时也肩负了 IBM 实现统一通信平台,为用户提供 UC²(Unified Communications and Collaboration)体验的任务。
新的 Sametime Client 7.5 除用户界面有了很大的变化外,最大的变化是 Sametime Client 是基于 Eclipse 构建的,也就是说,Sametime 客户端就是一组 Eclipse 的 Plug-ins。
感到奇怪吗?有人可能会说 Eclipse 不是一个 Java 的集成开发环境吗?Eclipse 除了是很多 Java 开发人员使用的开发工具外,Eclipse 也是 IBM 富客户端技术的开放式平台。如果您不了解 Eclipse,那我强烈建议您能到 Eclipse.org 这个站点看看,会对您了解 Eclipse 很有帮助。
图 1 是 Sametim Client 7.5 的架构图,相信大家在了解了 Eclipse 基础知识的基础上去了解 Sametime Client 的架构会有所帮助:
图 1. Sametim Client 7.5 架构图
Sametime 7.5 客户端正是以提供 Eclipse 扩展点的方式,可以让我们在 Sametime 上做更多的事情,这些扩展点在 Sametime Client Toolkit 中有详细的说明。
场景概述
本文选择了待办事宜与 Sametime Client 集成的场景,描述了企业员工 Test1 通过 Sametime Client 方便的查看自己的待办列表,接收系统发送的待办在线提醒信息,并通过 Sametime 快速定位自己所需办理的待办事宜。
在我们开始这个场景展现之前,先给大家介绍用户 Test1 的 Sametime Client 中一些不一样的地方:
图 2. 用户 Test1 的 Sametime Client
在用户 Test1 的 Sametime Client 中,除产品自带的联系人列表、主要联系人菜单项外,新增了待办事宜,在此菜单项中会显示出当前用户的所有待办列表。
系统环境部署
在此场景中,会有一全主机名为 penny.cn.ibm.com 的 Domino 服务器,Sametime Server 7.5.1 部署在此 Domino 服务器上,同时用户的待办事宜数据库也保存在此 Domino 服务器上,Sametime Client 中的 com.ibm.tss.task Plug-in 通过 Domino 服务器提供的 DIIOP 服务访问自己的待办列表信息,当用户希望访问待办项时,是通过部署在 Domino 服务器上的 LoginPortalServlet 实现 SSO(Single Sign On)服务,系统环境部署图如下:
图 3. 系统环境部署图
待办在线提醒
为了能更真实的模拟此场景,我使用了去年搭建的 Workplace Forms 与工作流引擎整合的环境,用户 Admin 填写计算机入网申请表单后,发送给信息中心的 Test1 进行审批。在此环节中,我们将看到已登录 Sametime Client 的用户 Test1 在 Admin 提交申请后,会接收到系统发送的在线提醒消息,同时在 Test1 的待办事宜列表中出现了 Admin 提交的计算机入网申请待办,让我们先看看这一场景的展现:
用户 Admin 填写“计算机入网申请”表后,选择信息中心的 Test1 用户为下一办理人:
图 4. 场景:Test1 用户为下一办理人
Admin 在点击“发送”按钮后,Test1 会收到如下图所示的在线提醒消息:
图 5. 场景:Test1 收到的在线提醒消息
与此同时,在 Test1 的 Sametime Client 中的待办事宜列表中出现了此待办信息,有点 Push Task 的味道。
图 6. 场景:待办事宜列表中出现了待办信息
OK!演示就暂时告一段落,让我们深入其中,看看各环节部分技术点的实现:
富文本格式的发送
在 Lotus Sametime Software Developer's Kit, Version 7.5.1 Integration Guide 中对如何发送富文本及二进制数据有了非常详细的说明(请参见 参考资源),主要通过以下代码告知即时消息的接收方,将要接收到的消息以富文本的形式展现:
public void sendDataMessage(Im im , String messageType, String messageSubType,
byte[] messageBytes) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(baos);
try {
dataStream.writeUTF(messageType);
dataStream.writeUTF(messageSubType);
dataStream.write(messageBytes);
} catch (IOException e) {
throw new AssertionError("sendDataMessage failed");
}
im.sendData(true, 27191, 0, baos.toByteArray());
}
|
在发送消息前执行此方法,即可让发送的消息以富文本的格式展现在 Sametime 对话框中,
sendDataMessage(im , "data", "richtext", new byte[] { (byte) 0xEE} );
|
在此场景中,我将发送在线消息功能封装到了 SendMessage 类中,在 Admin 用户点击“发送”按钮后,系统后端在处理完相关的审批流程信息后,会调用 SendMessage 类中的方法实现在线消息的发送,代码如下:
SendMessage message = new SendMessage();
/*****the parameters of init(hostname , userName , password) method includes: *****
hostname: the hostname of Sametime Server
username: the username to login in the Sametime Server
password: the password to login in the Sametime Server
*********end of parameter description****************************/
message.init("penny", "wpsadmin", "password");
String myRichTextMessage = "<a href='#’><b>请办理计算机接入申请园区网申请表</b></a>";
String messageToSend = richTextStart + myRichTextMessage + richTextEnd;
message.sendText(curdo, messageToSend);
Thread.sleep(200);
//this method is necessary at this time,or the user won't receive this message
message.destroy(); //remember to destroy the STsession after send message
|
待办事宜 Plug-in
在 Sametime Client 中增加了待办事宜的菜单项,是对 Sametime Client 中的 com.ibm.collaboration.realtime.imhub.miniApps 扩展点进行了扩展,本文没有着重说明如何开发基于 Sametime Client 的 Plug-in(可参考 Lotus Sametime Software Developer's Kit, Version 7.5.1 Integration Guide 中的 Plug-in 开发部分,参见 参考资源)。在这里给大家简单介绍待办事宜(com.ibm.tss.task)Plug-in 的开发环境的部分配置信息:
此 Plug-in 中需依赖的 Plug-in 包含以下:
图 7. 依赖的 Plug-in
实现了对 com.ibm.collaboration.realtime.imhub.miniApps 扩展点的扩展:
图 8. 扩展
相关具体信息,可参考此 Plug-in 源代码(参见 下载)。
如何在 Sametime Client 中获取 LtpaToken 串
在此场景中,用户的待办信息保存在 Domino 服务器上,如何以当前用户的身份读取到 Domino 服务器中的信息,大家会想到通过 DIIOP 的服务读取信息,如何保证以当前 Sametime 用户访问 Domino 服务器呢?LTPAToken!这是我首先在脑海中想到的方法,如何在 Sametime Client 环境中读取到 LTPAToken?
通过 TokenServiceListener 就能帮我们得到当前登录用户的 LTPAToken 字符串, 让我们看看调用生成 Token 串的代码:
public void generatetoken() {
try {
CommunityService communityMgr = (CommunityService) ServiceHub
.getService(CommunityService.SERVICE_TYPE);
RtcSession rs = communityMgr.getDefaultCommunity().getRtcSession();
m_session=(STSession) rs.getProtocolSession();
TokenComp m_token = (TokenComp)m_session.getCompApi(TokenComp.COMP_NAME);
m_token.addTokenServiceListener(this);
m_token.generateToken();
} catch(Exception ex) {
ex.printStackTrace();
}
}
|
tokenGenerated(TokenEvent) 是 Token 串成功生成以后执行的方法:
public void tokenGenerated(TokenEvent evt) {
System.out.println(evt.getToken().getLoginName());
System.out.println(evt.getToken().getTokenString());
ModelManager manager = ModelManager.getInstance();
manager.setTokenString(evt.getToken().getTokenString());
ModelManager.getInstance().fireEvent(
new ModelEvent(ModelManager.getInstance() , 8 , this));
}
|
如果大家自己在运行此代码时,会发现在 tokenGenerated 方法中显示的 Token 串并不是我们熟悉的 LTPAToken 串格式,为什么?大家看到的实际上是 Sametime token,但我们真正需要的是 LTPAToken,让我们改变 Sametime 生成 Token 串的格式,进入到 Sametime 管理控制台 —— 配置 —— 群体服务:
图 9. 改变 Sametime 生成 Token 串的格式
Sametime 服务器缺省选中此选项,取消选中并重启 Sametime 服务器后,上述的 tokenGenerated 方法中出现的将是大家熟悉的 LTPAToken 串!
从服务器中读取待办
拿到了 LTPAToken 串,接下来通过 Domino 提供的 DIIOP 服务,在待办数据库中找到当前用户须办理的待办信息,剩下的事情交给 Plug-in 中的 TableViewer,它将从 Domino 服务器中读取来的待办信息显示在 Sametime Client 中,让我们看看通过 LTPAToken 串建立与 Domino 的会话代码并读取当前用户的待办信息:
Session s = NotesFactory.createSession(hostName,manager.getTokenString());
Database taskDb = s.getDatabase("", dbPath);
View taskView = taskDb.getView("NetRequestFormsByTodo");
DocumentCollection docCol = taskView.getAllDocumentsByKey(s
.getCommonUserName(), false);
if (docCol.getCount() != 0) {
tasks = new TaskInfo[docCol.getCount()];
for (int i = 0; i < docCol.getCount(); i++) {
Document doc = docCol.getNthDocument(i + 1);
// ******create the taskinfo through the result from todo view
tasks[i] = new TaskInfo();
tasks[i].setSubject("请审批计算机入网申请");
tasks[i].setStatus(doc.getItemValueString("CurFileStatus"));
tasks[i].setType("计算机入网申请");
tasks[i].setUrl("http://penny.cn.ibm.com/test/test.nsf/0/"+
doc.getUniversalID() +"?opendocument");
}
}
|
访问待办
让我们进入我们的最后一个环节,用户 Test1 在自己的待办列表中看到 Admin 提交来的计算机入网申请请求,他想立即审批此申请,在待办事宜列表中,用户 Test1 希望通过双击此审批待办,就能自动打开浏览器进入到审批此请求的界面中,Let's do it!通过 Program.launch 打开”http://penny.cn.ibm.com/test/test.nsf/0/E49905089B39B5C948257329000B1C52?opendocument”,浏览器自动启动了。不对呀?怎么界面上出现的是系统的登录界面?当然,要访问的文档是有权限保护的。那就让用户再输一次用户名和密码?用户 Test1 抱怨说:“我已经登录了 Sametime,为什么我访问 Domino 应用还需要输入一次用户名和密码呢?”
好,那就想法解决它!我们不是已经有了 LTPAToken 串吗?如果能在浏览器上设置 LTPAToken 串的 cookie 信息,不就不需要用户再输入用户名和密码了吗?开发一个 Servlet,让它帮我设置好浏览器的 cookie 信息,然后重定向到用户真正访问的文档链接上,看看这个 Servlet 的实现:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
try {
PrintWriter pw = response.getWriter();
String ltpaToken = (String)request.getParameter("LtpaToken");
String targetURL = (String)request.getParameter("RedirectTo");
Cookie cookie = new Cookie("LtpaToken", ltpaToken);
cookie.setPath("/");
cookie.setDomain("cn.ibm.com");
response.addCookie(cookie);
if (targetURL == null) {
pw.print("<script>document.location='/wps/myportal';</script>");
} else {
pw.print("<script>document.location='" + targetURL + "';</script>");
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
|
在 Servlet 代码中获取了 LtpaToken、RedirectTo 两参数的值,分别为 Sametime 中生成的 LTPAToken,及用户真正访问的 URL 链接地址,让我们看看用户在双击选中的待办事宜时的代码就很清楚了:
Program.launch("http://penny.cn.ibm.com/servlet/LoginPortalServlet?LtpaToken="
+ ltpaString + "&RedirectTo=" + taskInfo.getUrl());
|
这个方法只适用于 Domino 应用吗?当然不,我们的 WebSphere Portal 一样适用,前提条件是 WebSphere Portal 与 Sametime Server 配置了 LTPA认证,我们可以直接进入到当前用户在 Portal 中的待办列表页面,因为我们已经实现了认证!
结束语
选择 Sametime Client 集成待办事宜这一场景,是因为待办事宜在企业办公中的重要作用,它是企业员工需办事情最直观的体现,通过 Sametime Client 的集成,用户不再需要反复的到 OA 系统或 Portal 中查看自己是否有事处理,而只需要打开 Sametime Client 端。在使用 Sametime 提供的在线消息交流的工具与其它同事交流、协作外,还能时刻关注到自己待办事宜的情况,大大提高用户体验和工作效率。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 待办事宜 Plug-in 开发文件夹 | com.ibm.tss.task.zip | 45 KB | HTTP |
|---|
| 发送在线消息 Jar 包 | sendmessage.jar | 18 KB | HTTP |
|---|
| 重定向 Servlet | LoginPortalServlet.java | 2 KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者
对本文的评价
|