IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Lotus  >

实现 Sametime 7.5.1 与待办事宜的集成

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

钟 华 (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 架构图
图 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
图 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. 系统环境部署图
图 3. 系统环境部署图




回页首


待办在线提醒

为了能更真实的模拟此场景,我使用了去年搭建的 Workplace Forms 与工作流引擎整合的环境,用户 Admin 填写计算机入网申请表单后,发送给信息中心的 Test1 进行审批。在此环节中,我们将看到已登录 Sametime Client 的用户 Test1 在 Admin 提交申请后,会接收到系统发送的在线提醒消息,同时在 Test1 的待办事宜列表中出现了 Admin 提交的计算机入网申请待办,让我们先看看这一场景的展现:

用户 Admin 填写“计算机入网申请”表后,选择信息中心的 Test1 用户为下一办理人:


图 4. 场景:Test1 用户为下一办理人
图 4. 场景:Test1 用户为下一办理人

Admin 在点击“发送”按钮后,Test1 会收到如下图所示的在线提醒消息:


图 5. 场景:Test1 收到的在线提醒消息
图 5. 场景:Test1 收到的在线提醒消息

与此同时,在 Test1 的 Sametime Client 中的待办事宜列表中出现了此待办信息,有点 Push Task 的味道。


图 6. 场景:待办事宜列表中出现了待办信息
图 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
图 7. 依赖的 Plug-in

实现了对 com.ibm.collaboration.realtime.imhub.miniApps 扩展点的扩展:


图 8. 扩展
图 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 串的格式
图 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 代码中获取了 LtpaTokenRedirectTo 两参数的值,分别为 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.zip45 KBHTTP
发送在线消息 Jar 包sendmessage.jar18 KBHTTP
重定向 ServletLoginPortalServlet.java2 KBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术

讨论


关于作者

钟华,目前是一位 IBM 软件部的售前技术工程师,曾在 IBM 中国软件开发中心(IBM CSDL)担任软件开发工程师。您可以通过 zhonghua@cn.ibm.com 和他联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款