内容


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

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

Comments

基于 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 中的工作项进行信息读写。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

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