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

developerWorks 中国  >  Lotus | WebSphere  >

开发一个基于 XML 的 Lotus Sametime bot 并部署为 WebSphere Application Server V7.0 上的启动 bean

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

英文原文

英文原文


级别: 中级

Ahmed Alsum, 高级软件工程师, IBM

2009 年 8 月 31 日

使用 IBM® Lotus® Sametime® bot 改善后端内容的表示和系统服务可以很轻松地吸引已经熟悉此工具并希望快速获取结果的用户。本文将详细介绍如何开发一个基于 XML 的 Lotus Sametime bot 并部署为 IBM WebSphere® Application Server V7.0 上的启动 bean。

首先,本文介绍如何实现一个 Lotus Sametime bot,它能与基于 XML 数据提供程序(如 SOA、Web 服务或者甚至使用 XML 数据的 servlet)的数据系统进行交互。XSLT 控制 XML 响应的呈现。然后,对 Lotus Sametime bot 的访问仅限于特定的经过验证的用户组。最后,本文将深入讨论如何使用部署在 WebSphere Application Server V7.0 上的启动 Enterprise JavaBean (EJB) 管理 Lotus Sametime bot 登录和布局操作。

Lotus 软件试用下载

立即下载最新版本的 IBM Lotus 试用软件,轻松体验产品的最新特性!

基于 XML 的 Lotus Sametime bot

XML 已成为传递和操作数据的主流技术。Lotus Sametime Java™ 工具包允许您借助 Java 编程语言访问各种核心 Lotus Sametime 服务,比如到场感知、即时消息传递和屏幕共享。在本文中,我们将介绍 Lotus Sametime bot 的一个扩展,它将在 SOA 格局中充当 XML 数据使用者。图 1 显示了 XML 数据服务提供程序与 XML data service provider and the XML Lotus Sametime bot 扩展之间的关系。


图 1. Lotus Sametime bot 和 XML 数据服务提供程序体系结构
Lotus Sametime bot 和 XML 数据服务提供程序体系结构

在接下来的几节中,我们将讨论连接 Lotus Sametime bot 与 XML 数据提供程序的两个主要方面:

  • 使用 URL 在 Lotus Sametime Java 与外部数据源之间建立连接,包括将响应封装到 XML 文档对象中。
  • 将 XML 文档对象转换成可读文本。




回页首


Lotus Sametime bot 连接到 XML 数据提供程序

XML 数据提供程序通常可以使用字符串 URL 进行访问,该 URL 中包含服务器名称、所需的服务和支持的参数。在 Lotus Sametime bot 环境中,您可能需要根据用户命令来自定义字符串 URL(比如,您可能需要根据命令来添加参数)。URLConnection 类可用于连接到外部 Web 服务器。最初,外部数据源的 URL 文本封装在 URL 对象中,该对象用于打开连接。虽然大多数敏感数据提供程序都通过 SSL 公开了它们的数据,但 URLConnection 类可以支持将用户名和密码传递给外部数据源。注意,如果网站使用不信任的 SSL 证书,则该证书应该被导入到应用服务器密钥库中。清单 1 的 2-8 行示例代码展示了如何使用字符串 URL 连接到外部安全数据源。





回页首


TLotus Sametime bot 从 XML 数据提供程序接收响应

Lotus Sametime bot 接收响应作为数据的输入流;它应该被封装在 XML 文档对象中。清单 1 的 9-11 行阐述了将 inputStream 转换成 XML 文档对象所需的步骤。我们获取了一个 DocumentBuilderFactory 实例,它定义了一个工厂 API,用于支持应用程序获取解析器,可以通过 XML 文档生成 DOM 对象。该对象用于创建一个新的 DocumentBuilder 类实例。获取该类的实例之后,可以解析来自各种输入源的 XML。此处,我们解析了来自 inputStream 的 XML。


清单 1. Lotus Sametime bot 连接到 XML 数据提供程序
1.	Public Document connect(String urlStr){
2.	URL url;
3.	    try {
4.	      url = new URL(urlStr.toString());
5.	     URLConnection conn = url.openConnection();
6.	      String userPassword = “myUser:myPassword”;
7.	      String encoding = 
new sun.misc.BASE64Encoder().encode (userPassword.getBytes());
8.    conn.setRequestProperty ("Authorization", "Basic " + encoding);
9.	   conn.connect();
10.      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
11.	     DocumentBuilder db = dbf.newDocumentBuilder();
12.	     Document doc = 
db.parse(conn.getInputStream());
13.	   } catch (MalformedURLException e) {
14.	      e.printStackTrace();
15.	    } catch (IOException e) {
16.	     e.printStackTrace();
17.	    } catch (ParserConfigurationException e) {
18.	      e.printStackTrace();
19.	    } catch (SAXException e) {
20.	     e.printStackTrace();
21.	   }
22.	   return doc;
23.	}





回页首


Lotus Sametime bot 使用 XSLT 转换响应

虽然 XML 文档对象易于解析,并且在代码层次上易于理解,但它在用户可读性方面仍然是失败的。XML 响应不能直接发送给用户;需要以用户可以理解的方式来解析它。许多技巧支持 XML 解析和准备可读、格式良好的文本提供给用户。

XSL Transformation (XSLT) 用于将 XML 文档转换为另一种 XML 文档,或者转换成可由浏览器识别的其他类型的文档,比如 HTML、XHTML 或者纯文本。Java 库包含一个格式程序,它可以结合 XML 文档与相关 XSLT 文件,并将它们转换成所需的输出格式。清单 2 展示了用于根据保存在特定路径的 XSL 文件将 XML 文档传输给文本的示例代码。


清单 2. 使用 XSLT 将 XML 文档对象转换为文本的示例函数
1.	public String format(Document dom, String xlsFilePath) {
2.	 DOMSource src = null; 
3.	 StreamResult res = null;
4.	 StringWriter sw = new StringWriter();
5.	 File file=new File(xlsFilePath);
6.	  
7.	  if(file.exists()){
8.	    try {
9.	      TransformerFactory factory = TransformerFactory.newInstance();
10.	      Transformer transformer = factory.newTransformer(new StreamSource(file));
11.	      src = new DOMSource(dom);
12.	      res = new StreamResult(sw);
13.	      transformer.transform(src, res);
14.	    } catch (TransformerException e) {
15.	      e.printStackTrace();
16.	    }
17.	  }
18.	  return sw.toString();
19.	}

ImListener.textReceived 可以结合两个函数,根据命令准备字符串 URL(举例来说,根据用户命令不同,字符串 URL 可能包含不同的参数)。另外,您可以为各命令创建不同的 XSLT 响应文件。清单 3 包含 ImListener.textReceived 的示例代码,它能调用连接和格式方法。图 2 和图 3 显示了 XML 响应及其相关 XSLT 文件的示例,并且图 4 展示了用户所看到的文本响应。


清单 3. 重写方法 ImListener.textReceived
1.	public class MyImListener implements ImListener {
2..
3.
4.	  public void textReceived(ImEvent e) {
5.	    String urlStr = prepareURLForCommand(e);
6.	   Document responseDoc = connect(urlStr);
7.	    String answer =format(responseDoc, "c://response.xsl");
8.	     e.getIm().sendText(true, answer);
9. 
10.	.
11.	.
12.	}


图 2. 接收到的 XML 响应
接收到的 XML 响应

图 3. XSLT 文件
XSLT 文件

图 4. Lotus Sametime bot 行为
Lotus Sametime bot 行为

此技巧鲜明反应了 XML 数据提供程序响应中的任何更新;所需的唯一步骤就是上传一个新的 XSLT 文件,而不需要任何代码更新。另外,可以更新代码以便 Lotus Sametime bot 能连接到不同的数据源。





回页首


为 Lotus Sametime bot 提供保护

Lotus Sametime 客户机并未限制添加用户 ID 到联系人列表;这意味着 Lotus Sametime bot 可以由许多未经授权的用户访问。控制对机密信息的访问是由 Lotus Sametime bot 本身负责的。当用户使用 bot 打开聊天窗口时,系统将调用 ImServiceListener.imReceived(ImEvent e)。ImEvent 对象包含关于用户 ID ImEvent.getIm().getPartner().getId() 的基本信息。Lotus Sametime bot 可以使用这个值来检查其访问列表中的用户 ID。清单 4 演示了如何使用 bluegroups 禁止未授权用户访问机密信息。您需要实现 authenticate(String userID) 方法来根据访问组验证用户 ID。


清单 4. ImServiceListener.imReceived 验证用户 ID
1.	public void imReceived(ImEvent e) {
2.	  ImListener imListener =null;
3.	  if(authenticate(e.getIm().getPartner().getId())){
4.	   imListener = AuthorizedListener.getListener(e);
5.	   e.getIm().sendText(true, WELCOME_TEXT);
6.	  } else {
7.	   imListener = UnAuthorizedListener.getUnAuthorizedListener(e);
8.	   e.getIm().sendText(true, WELCOME_UNAUTHORIZED_TEXT);
9.	 }
10.	  e.getIm().addImListener(imListener);
11.	}
 





回页首


Lotus Sametime bot 部署

Lotus Sametime bot 作为一个独立的应用程序运行。对于 Lotus Sametime 服务器,Lotus Sametime bot 通常被认为是另一个程序。Lotus Sametime bot 只需要在消息传递服务器上使用有效的用户名和密码进行验证;它不依赖于 Lotus Sametime bot 是如何部署的。从编写代码的角度来说,您需要结合所需的步骤来处理登录和注销活动;这些方法是控制 Lotus Sametime bot 状态的控制器。清单 5 和清单 6 展示了两个方法的示例代码。

在本节中,我们提供了不同的方法来在 WebSphere Application Server 上部署 Lotus Sametime bot。不同部署方法的目标都是提供一种可控的机制来调用登录和注销方法。


清单 5. logIn() 方法实现
1.		public void logIn()
2.	{ 
3.	  if( stsession == null){
4.	    try {
5.	     java.util.Date initTime = new java.util.Date();
6.	     stsession = 
new STSession("MySametime Bot" + String.valueOf(initTime.getTime())); 
7.	   
8.	     } catch (DuplicateObjectException e) {
9.	       e.printStackTrace();
10.	       return;
11.	     }
12.	    }
13.
14.	  if(  ! stsession.isActive() ){
15.	    stsession.loadSemanticComponents();
16.	    stsession.start();
17.	   }
18.	 
19.	   commService = 
(CommunityService) stsession.getCompApi(CommunityService.COMP_NAME);
20.	   m_fileTransSvc = 
(FileTransferService) stsession.getCompApi(FileTransferService.COMP_NAME);
21.	   m_fileTransSvc.addFileTransferServiceListener(this);
22.	   commService.addLoginListener(this);
23.	   commService.setLoginType(logInType);
24.	   commService.enableAutomaticReconnect(100, 5000);
25.	   commService.loginByPassword(SERVER_NAME, USER_ID, PASSWORD);
26.	}
27.


清单 6. logOut() 方法实现
1.	public void logOut()
2.	{
3.	commService = (CommunityService) stsession.getCompApi(CommunityService.COMP_NAME);
4.	 commService.logout();
5.	 stsession.stop();
6.	 stsession.unloadSession();
7.	}





回页首


不同的部署方法

第一种部署方法需要依靠 Java 2 Platform, Enterprise Edition (J2EE) 技术,它将 Lotus Sametime bot 作为 servlet 进行部署。您需要创建一个 servlet 并修改 doGet 方法以 URL 参数的形式接受用户操作。这些操作可以调用 login() 和 logout() 方法。清单 7 中的示例代码允许您将 Lotus Sametime bot 部署为一个 servlet。


清单 7. 重写 doGet 方法
1.	 protected void 
doGet(HttpServletRequest request, HttpServletResponse response) throws 
2.				ServletException, IOException {
3.	      
4.	    String action = request.getParameter("action");
5.	    PrintWriter out = response.getWriter();
6.	    if("start".equalsIgnoreCase(action)){
7.	      out.println("Request to start Sametimebot");
8.	      ebb= new MySametimeBot();
9.	      ebb.logIn();
10.	      ebb.start();
11.	    } else if( "stop".equalsIgnoreCase(action)){
12.	      out.println("Request to stop Sametimebot");
13.	      ebb.logOut();
14.	    } else {
15.	      out.println("Unknown action: "+ action);
16.	    }
17.  }

假设 servlet 拥有一个 sametimebotServlet URL 映射。

  • 要启动 Lotus Sametime bot,输入以下 URL:http://myserver/sametimebotServlet/action=start
  • 要停止 Lotus Sametime bot,输入以下 URL:http://myserver/sametimebotServlet/action=stop




回页首


部署为启动 beans

在某些情况下,使用 servlet 或独立的 Java 应用程序来管理 Lotus Sametime bot 是不安全的。要提供安全性,管理人员需要更好地控制 Lotus Sametime bot 状态。在本节中,我们将开发一种全新的方法,使用 EJB 启动 bean 一个容器来控制 Lotus Sametime bot 状态。





回页首


什么是启动 bean?

启动 bean 是一种用户定义的 EJB 2.0 会话 bean。模块启动 bean 是一种会话 bean,它在 EJB JAR 文件启动时加载。模块启动 beans 支持 J2EE 应用程序自动运行业务逻辑,只要 EJB 能正常启动或停止。EJB 可以是有状态或无状态的。如果它是有状态的,则使用相同的实例执行启动和停止。否则,将创建两个实例。

您必须使用以下本地和远程接口:

  • EJB 本地接口必须是 com.ibm.websphere.startupservice.AppStartUpHome,用于在 beans 上定义 start() 和 stop() 方法。
  • EJB 远程接口必须是 com.ibm.websphere.startupservice.AppStartUp,用于在 beans 上定义 start() 和 stop()。

当模块或应用程序启动并且包含在其启动时运行的业务逻辑时,启动 bean start() 方法将被调用。当模块或应用程序停止并且包含在其停止时运行的业务逻辑时,启动 bean stop() 方法将被调用。stop() 方法抛出的任何异常仅被记录;不执行任何其他操作。





回页首


将 Lotus Sametime bot 部署为启动 bean

在单独的 Java 项目中创建 Lotus Sametime bot 代码,并将其包括在 EJB 启动 bean 项目中。此后,Lotus Sametime bot 对象初始化和 logIn() method 将在 start() 方法中调用。另外,logOut() 方法将在 stop() 方法中调用。参见清单 8 中的代码。


清单 8. 使用开始和停止方法管理 Lotus Sametime bot
1.	public class MySametimeBotStartupBean implements javax.ejb.SessionBean {
2.	 public boolean start()
3.	 {
4.	    System.out.println("MySametimebot is starting.");
5.	    ebb= new MySametimeBot();
6.	    ebb.logIn();
7.	    ebb.start();
8.	    return true; //if false is returned an exception will be thrown and the 
		application is not started
9.	  }
10.	  public void stop()
11.	 {
12.	    System.out.println ("MySametimebot is stopping.");
13.	    ebb.logOut();
14.	   }
15.}

应用程序被打包成 Enterprise Application (EAR) 并被部署到 WebSphere Application Server 上。成功部署 EAR 项目之后,您可以启动和停止 Lotus Sametime bot 实例。





回页首


结束语

在本文中,我们讨论了在 Lotus Sametime bot 的开发和部署周期中出现的一些新问题。首先,可以使用 Java API 将 Lotus Sametime bot 连接到 XML 数据源,并且可以使用 XSLT 格式程序将 XML 响应转换成用户可以理解的文本。由于 XML 数据源的敏感性,Lotus Sametime bot 中添加一个额外的安全层次,基于用户 ID 来保证 XML 数据源的安全。最后,我们给出了将 Lotus Sametime bot 部署为启动 bean 不同方法。





回页首


致谢

本文是 IBM 2008 年 10 月完成的 Corporate Client Support Portal (CCSP) 工作的一部分。作者对 CCSP 提供的宝贵评论表示感谢。



参考资料



关于作者

Ahmed Alsum 是 IBM 在埃及开罗的技术开发中心的一名高级软件工程师。他在开发、部署和管理 J2EE 及 WebSphere Portal 解决方案方面拥有四年的经验。他拥有计算机科学专业的学位和硕士学位,并从 Microsoft、Sun 和 IBM 获得了许多专业认证。您可以通过 ALSUM@eg.ibm.com 与他联系。




对本文的评价










回页首


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