通过阅读本文,您将学会如何使用 Plain Java API 编写客户端代码来进行 RTC 上的二次开发,提高管理 Work Item 整个生命周期的效率,更加高效的实现团队合作。
Rational Team Concert (RTC) 是构建在 IBM Rational 面向软件交付技术的下一代协作平台 Jazz 上的第一个协作式的开发环境,它包含了集成的源代码控制、工作项(Work Item)管理和构建管理等功能。">开发团队在运行其进行项目协作时,往往需要与已有工具进行集成。幸好 RTC 也是一个具有极强扩展性的平台,我们可以采用 REST API 和 Plain Java API 两种方式对其进行扩展。下图展示了 RTC 的扩展功能。
图 1. RTC 的扩展架构
REST API: REST (Representational State Transfer)是一种针对网络应用的设计和开发方式,可以降低开发的
复杂性,提高系统的可伸缩性。RTC 从 2.0 版本开始正式支持 REST API,目前 REST API 所支持的功能还比较有限,但对于一般的集成需求已经足够,其功能主要集中在对 Work Item(工作项)的管理。对 RTC 而言,有了 REST API 的支持后,客户端的程序语言讲不再局限于 Java。并且,在各个版本的 RTC 之间,REST API 都是
稳定的。 Plain Java API:这些 API 可以在一般的 Java 应用程序中来对 RTC 进行扩展。我们要做的只是在 Eclipse 客户端中使用 Plain Java API 来调用 RTC 提供的特定 Java API,而这些 Java API 就能够完成对 Work Item 的生命周期
管理工作。需要注意的是,这些 Java API 在不同版本的 RTC 之间是不稳定的,如果 RTC 服务器进行版本升级,我们同时也需要对 Java API 进行相应的测试和迁移,而 REST API 则是永远稳定,这是 Plain Java API 的缺点,
但是由于 Java API 的简便性和易学性,它仍然是我们学习和扩展 RTC 的主要方式。本文
重点阐述使用 Plain Java API 管理 Work Item 整个生命周期的方式。
登录 RTC 服务器
要管理 Work Item 生命周期,首先需要建立与 RTC 的连接,使得 Java 程序能够登录到 RTC 的数据库中,从而进行后续操作。通过 Java API,可以登录到 RTC 的服务器端,建立同 RTC 数据库的连接,从 RTC 上得到需要的信息用于 Java 应用程序中。下面给出了一个登录方式,通过 RTC 的 URI、登录 RTC 的用户名和密码建立同 RTC 的连接。
清单 1. 登录 RTC 服务器
String REPOSITORY_URI = "https://example.ibm.com:9443/jazz/";String RTC_USER_ID = "example name"; String RTC_PASSWORD = "example password";private boolean login() throws RTCException { TeamPlatform.startup(); //启动 RTC 平台 TeamPlatform teamRepository = \ TeamPlatform.getTeamRepositoryService().getTeamRepository(REPOSITORY_URI); teamRepository.setConnectionTimeout(LOGIN_TIMEOUT); teamRepository.setAutoLogin(true); teamRepository.registerLoginHandler(new LoginHandler(RTC_USER_ID, RTC_PASSWORD)); try { teamRepository.login(null); } catch (TeamRepositoryException e) { throw new RTCException(e); } initConnection(); return true;}
在这个方法中,首先初始化 RTC 平台 TeamPlatform,然后利用 getTeamRepository 方法通过 RTC 的 URI 得到 RTC 的存储连接,该方法返回一个代表存储连接的 ITeamRepository 类型的变量 teamRepository,之后通过这个类中的 login 方法登录 RTC 并同 RTC 的数据库建立连接。在登录的过程中,还需要用到 RTC 的用户名和密码,这些账户信息存储在一个实现了接口 ILoginHandler 和 ILoginInfo 的自定义类 LoginHandler 中。
清单 2. LoginHandler
class LoginHandler implements ILoginHandler, ILoginInfo { private String fUserId; private String fPassword; public LoginHandler(String userId, String password) { fUserId = userId; fPassword = password; } public String getUserId() { return fUserId; } public String getPassword() { return fPassword; } public ILoginInfo challenge(ITeamRepository repository) { return this; }}
登录后,就可以通过得到的 teamRepository 变量对 RTC 中的数据进行相关操作了。在 initConnection 方法中,我们通过 teamRepository 初始化了一些变量,供后面的代码使用,比如 projectArea, workItemClient 和 auditableClient。
清单 3. initConnection
private void initConnection() throws RTCException { IProcessClientService processClient = \ (IProcessClientService) teamRepository.getClientLibrary(IProcessClientService.class);|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error: The previous line is longer than the max of 90 characters ---------| URI uri = URI.create(PROJECT_AREA.replaceAll(" ", "%20")); try { projectArea = \ (IProjectArea) processClient.findProcessArea(uri, null, null); if (projectArea == null) { throw new RTCException(PROJECT_AREA_NOT_FOUND); } workItemClient = (IWorkItemClient) teamRepository.getClientLibrary(\ IWorkItemClient.class); } catch (TeamRepositoryException e) { throw new RTCException(e); } auditableClient = (IAuditableClient) teamRepository.getClientLibrary(\ IAuditableClient.class);}
注意在工作完成后,调用 logout 方法退出登录,使用 TeamPlatform.shutdown()来关闭 TeamPlatform。
清单 4. logout
public void logout() { teamRepository.logout(); TeamPlatform.shutdown();}