利用 OSLC 访问 Rational Team Concert:快速入门指南

使用 Java 对 Rational Team Concert 中的工作项进行信息读写

本文是一个快速指南,介绍了如何使用 Open Services for Lifecycle Collaboration (OSLC),通过 Java 对 Rational Team Concert 中的工作项进行信息读写。文中提供的示例演示了如何以可行方式在 Rational Team Concert 中连接、检索和存储信息。

Paulo Cavoto, IT 专家, IBM

http://www.ibm.com/developerworks/i/p-pcavoto60.jpgPaulo Cavoto 是一个 IT 专家,在巴西的 IBM Rational 软件团队致力于集成工作。他曾在使用 J2EE 和 PHP 开发基于 Web 的应用程序方面投入大量工作,从使用 MySQL、DB2 和 Oracle 的数据库层,到使用 JQuery、Sencha 和 Dojo 的 UI 设计。



2014 年 1 月 09 日

基于 Jazz 平台的 IBM® Rational Team Concert™ 提供了一个简洁的协作式生命周期管理解决方案。Rational Team Concert 的一个重要特性是它与外部系统集成的能力。每一个 Jazz 产品本身都具有用于读取和写入信息的 OSLC 服务,在 Jazz 和其他工具之间提供了简单的集成点。OSLC 使用 REST API 提供服务,因此,标准的标注可为每种语言和平台提供信息。本文演示了如何使用 Java 在 Rational Team Concert 中验证、连接、检索和存储信息。

使用 SSL 证书连接到 Rational Team Concert

在默认情况下,如果服务器被配置为使用安全套接字层(SSL),那么 Rational Team Concert 会使用自签名证书。在连接到 Rational Team Concert 之前,您必须接受自签名证书。为此,首先需要创建一个新的 TrustManager 对象,它通过检查有效期限、证书签名等来接受和验证 SSL 证书。(请参阅 下载 部分,获得包含完整示例源代码的 Eclipse 项目。)

接下来,要创建一个新的 Array 对象,其中包含一个 TrustManager 实例,该示例实现了接口 X509TrustManager。请覆盖接口的方法,以确保没有执行验证检查。参见清单 1:

清单 1. 覆盖接口 X509TrustManager 的方法
public static void main(String[] args) throws ClientProtocolException, IOException,
       KeyManagementException, NoSuchAlgorithmException {
      TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
         public X509Certificate[] getAcceptedIssuers() {
            return null;
         }

         public void checkclientTrusted(X509Certificate[] certs, String authType) {
            // Leave blank to trust every client
         }

         public void checkServerTrusted(X509Certificate[] certs, String authType) {
            // Leave blank to trust every server
         }

         public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                 throws CertificateException {
            // TODO Auto-generated method stub

         }
      } };

接下来,要创建一个 SSLContext 的实例:

SSLContext mySSLContext = SSLContext.getInstance("SSL");

然后,使用我们创建的 TrustManager 实例初始化 SSLContext:

mySSLContext.init(null, trustAllCerts, new java.security.SecureRandom());

最后,覆盖默认的 SSLSocketFactory,它来自 HttpsURLConnection 服务,供 Apache HTTP 客户端在其连接中使用。该步骤可确保 HttpsURLConnection 将使用我们刚刚创建的 SSL 上下文:

HttpsURLConnection.setDefaultSSLSocketFactory(mySSLContext.getSocketFactory());

现在,您已经接受了自签名证书。必须先完成这一步,以确保证书在整个会话过程中都被接受。


身份验证凭据

现在,您要创建建立与服务器的连接所需的所有 Java 对象。连接本身与您为了实现任何 Get 过程而创建的连接几乎是相同的。使用 Apache 库来创建连接,并提供所需的参数。

创建以下对象:

DefaultHttpClient httpclient = new DefaultHttpClient();
CookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

使用想要连接的服务器的 URL 来实例化一个对象 HttpGet(如果有必要,包括门),后面是 /jazz /authenticated/identity:

HttpGet httpGetID = new HttpGet("https://localhost:7443/ccm/authenticated/identity");

现在存储了服务器 URL,创建了会话,并以 Cookie 的形式将它记录在本地。利用您之前创建的对象来调用 HttpClient 对象的执行方法。您刚刚保存了 cookie,所以应该关闭连接:

httpclient.execute(httpGetID, localContext);
httpGetID.abort();

如果想确保正确地创建了 cookie,可以尝试检索所保存的信息:

List<Cookie> cookies1 = cookieStore.getCookies();
for (Cookie cookie : cookies1) {
   System.out.println("\t" + cookie.getName() + " :" + cookie.getValue());
}

下一步是使用有效的用户名和密码凭据,通过 j_security_check 进行身份验证。在这一步中,我们使用了 Apache HttpClient 类 NameValuePair:

List<NameValuePair> authFormParams = new ArrayList<NameValuePair>();
authFormParams.add(new BasicNameValuePair("j_username", "TestJazzAdmin1"));
authFormParams.add(new BasicNameValuePair("j_password", "TestJazzAdmin1"));

现在,构建一个 UrlEcodedFormEntity,它编码 URL 和凭据,并执行一个 HTTP Post。参见清单 2:

清单 2. 构建一个 UrlEcodedFormEntity
UrlEncodedFormEntity encodedentity = new UrlEncodedFormEntity(authFormParams,
        "UTF-8");
         HttpPost httpPostAuth = new httpPost("\
         https://localhost:7443/ccm/authenticated/j_security_check");
          httpPostAuth.setEntity(encodedentity);

httpclient.execute(httpPostAuth, localContext);

现在最好检查一下是否已经正确创建了 cookie,以避免之后在连接过程中可能出现的任何问题。此代码只是提供信息,但是,如果想确保 cookie 已被正确地存储,请尝试检索所保存的信息:

List<Cookie> cookies2 = cookieStore.getCookies();
for (Cookie cookie : cookies2) {
      System.out.println("\t" + cookie.getName() + " :" + cookie.getValue());
}

如果 cookie 被正确存储,那么您的登录已经被验证,而且您可以访问到 Rational Team Concert。


使用工作项 ID 从 Rational Team Concert 工作项检索信息

现在您已经建立了连接,您可以按工作项 ID 检索某个特定工作项的有关信息。对该 URL 发送一个 GET 请求:

https://localhost:9443/ccm/oslc/workitems/ID_WI.TIPO?oslc_cm.properties=property1, property2

将工作项的数字 ID 替换为 WI_ID,预期的返回类型是 TYPE(可能的值是 JSON 或 XML),预期返回的属性 ID(如果想只返回某些属性)是 property1、property2。如果想检索所有信息,那么请删除 oslc_cm.properties 参数。例如,参见清单 3:

清单 3. 检索关于工作项的信息
// READ BY ID
httpclient = new DefaultHttpClient();
httpclient.setCookieStore(cookieStore);
HttpGet httpget = new HttpGet(
       "https://localhost:7443/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/42");
httpget.addHeader("Accept", "application/json");
httpget.addHeader("OSLC-Core-Version", "2.0");
HttpResponse response = httpclient.execute(httpget);
Header[] ooo = response.getAllHeaders();
for (Header header : ooo) {
   System.out.println(header.getName() + " - " + header.getValue());
}

HttpEntity entity = response.getEntity();
if (entity != null) {
   entity.consumeContent();
}

// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);

System.out.println(responseBody);

在本例中,工作项 42 的内容的 JSON 表示被打印到了控制台中。


在 Rational Team Concert 中更新工作项属性

要更新一个工作项的属性,请对在上一个示例中使用的相同地址发出一个 Put 请求:

httpclient = new DefaultHttpClient();
httpclient.setCookieStore(cookieStore);
HttpPut httpput = new HttpPut("https://localhost:7443/ccm/oslc/workitems/42.json");

添加此标头,表明您正在请求工作项中的一个变更:

httpput.setHeader("Content-Type", "application/x-oslc-cm-change-request+json");

创建一个 HttpEntity,并将新值告知要更改的属性。在 Put 对象上设置实体:

HttpEntity myEntity = new StringEntity(
           "{\"dc:title\":{\"rdf:resource\":\"Title has changed\"}}");
httpput.setEntity(myEntity);

正常发出请求,并检查控制台。参见清单 4:

清单 4. 使用新对象,并发送 Put 命令
HttpResponse responsePut = httpclient.execute(httpput);
HttpEntity entityPut = responsePut.getEntity();

BufferedReader reader;
try {
   reader = new BufferedReader(new InputStreamReader(entityPut.getContent()));
   String line = reader.readLine();
   while (line != null) {
      System.out.println(line);
      line = reader.readLine();
   }
   reader.close();
} catch (IllegalStateException e) {
	e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}
reader.close ();

检查您正在处理的工作项的标题。标题应已被更改。


结束语

OSLC 等 Rational Team Concert 集成特性可以帮助您实现系统,促进信息交换,并增强外部工具的使用。通过 OSLC 服务可以满足大多数的集成要求,从而避免了复杂的定制,并缩短了部署时间。本快速指南演示了如何使用 OSLC,通过 Java 对 Rational Team Concert 中的工作项进行信息读写。


下载

描述名字大小
样例项目文件OSLC_Example_EclipseProject.zip528KB

参考资料

学习

获得产品和技术

  • Jazz.net 下载 Rational Team Concert,多达 10 位开发人员可以不限时地免费试用它(要求注册)。您也可以选择在沙箱中试用它,无需将它安装在自己的系统上。
  • 以最适合您的方式 评估 IBM 软件:通过下载获得一个试用版,在线试用它,在云环境中使用它,或在 SOA Sandbox 中花几个小时学习如何高效地实现面向服务的架构。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=959692
ArticleTitle=利用 OSLC 访问 Rational Team Concert:快速入门指南
publish-date=01092014