場景
假設您為實現合規性,正在使用利用目前最新的技術構建的一個系統。必須輸入開發信息。該 系統已非常穩定,所以 IT 經理決定,除非出現與新操作系統補丁有關聯的安全漏洞問題和缺陷,否則不維護 系統。另外假設向開發團隊引入了 IBM Rational Team Concert 來支持全球交付。開發人員可能不希望浪 費寶貴的時間向兩個系統輸入相同的信息。本文的目的是演示集成這類系統的技術。
圖 1 給出了本文 的一個目標圖像。My System 用於輸入某種類型的開發信息,它擁有系統的一個 COM+ 接口,而團隊引入了 Rational Team Concert 來加速全球交付。Rational Team Concert 有一個名為 OSLC(開放式生命周期協作 服務)的開放接口。
圖 1. 目標是將一個現有系統 My System 與 Rational Team Concert 相集成
使用這些樣例腳本的免責聲明和先決條件
樣例腳本僅用作樣例,應按原樣使用。如果在試用腳本 時收到一條類似以下消息的錯誤消息,可能是因為 Rational Team Concert 服務器被設置為使用自行認證:
msxml3.dll: System Error: -2146697191
msxml3.dll: The system cannot locate the resource specified.
如果使用 Microsoft Internet Explorer 訪問服務器,那麼您將獲得一條證書錯誤消息。 這是因為設置了自行認證,客戶端不信任服務器。要使用樣例腳本,必須先解決這個問題。
OSLC 是軟 件開發人員和組織的一個開放社區,致力於標准化各種軟件開發生命周期工具的集成。它還定義了工具集成的 規范。核心規范是使用 RDF(資源描述框架)作為一種數據表示,使用 RESTful Web 服務訪問數據。但 My System 提供了自己的接口。在本例中,該接口是 COM+ (Component Object Model plus),可通過各種語言進 行訪問,包括 Microsoft Visual Basic 或 Visual Basic 腳本語言。
本文將介紹如何使用 Visual Basic 腳本語言訪問兩個系統。文中提供了樣例腳本(請參見 下載 部分)。這些樣例腳本使用了 OSLC Change Management 規范和 Rational Team Concert 作為工具。該腳本處理名為工作項 的數據。該腳本創建 、更新或查詢一個 Rational Team Concert 工作項。
OSLC 服務和這段 Visual Basic 腳本概述
圖 2 顯示了 OSLC 服務的流程圖,它從 Root Service Document 流經 Catalog 和 Service Provider,最後到達 Work Item。
圖 2. OSLC 服務概述
第一步是訪問 Root Service Document。此服務提供了服務目錄。例如,它提供了一個 CM(變更管理)服務目錄(如圖 2 所示)、一個 SCM(源代碼管理)服務目錄、一個項目區域管理服務目錄,等等。在本文的示例中:
CM 提供了對工作項的訪問服務。
目錄提供了每個項目區域的服務提供者 URL。
服務提供者支持訪問工作項。
該腳本使用一組名為 Microsoft XML 核心服務 (MSXML) 的服務。MSXML 可以一種快速且高效的方式處理 基於 XML 的應用程序。它還擁有各種 API 來處理 XML 文檔的內容。OSLC 使用 RDF 作為數據表示,MSXML 也可處理 RDF 文檔。
表 1 給出了訪問該腳本所提供的工作項的基本函數。
備注:
腳本中還 有其他一些函數。本文介紹如何使用這些函數自動化工作項的創建和更新。然後介紹如何將它們與一個現有系 統基礎呢個。本文全篇省略了一些編碼實踐,比如全面的錯誤檢查。
樣例腳本概述
開始運行樣 例腳本之前,請看看清單 1,其中給出了腳本的主要部分。這將幫助您認識到使用該腳本訪問 Rational Team Concert 工作項接口有多容易。
清單 1. 腳本的主要部分
'-------------- ' Parameter definition ' CLM parameters url = "https://clm.example.com:9443/ccm" project = "TRADITIONAL" userid = "jazzadmin" passwd = "jazzadmin" '------------- ' Login to jazz application server Set http = JazzLogin(url, userid, passwd) ' obtain service catalog from jazz root service. ' obtain workitem factory (use default factory) and query service ' update service is given original URL, not service url service_url = GetServicebyProjectName(http, url, project) factory_service = GetFactoryService(http, service_url) update_service = GetUpdateService(http, url) query_service = GetQueryService (http, service_url) 'attrString has format such that '<attribute>,<value>,<attribute>,<value> ' Sample workitem create attrString = "dcterms:type,task" attrString = attrString&","&"dcterms:title,This is sample title" workItemId = CreateWorkItem(http, factory_service, attrString) If (workItemId = -1) then WScript.ECHO "Workitem creation failed" End If ' Sample workitem update attrString = "dcterms:title"&","&"This is sample title with update" workItemId = UpdateWorkItem(http, update_service, workItemId, attrString) If (workItemId = -1) then WScript.ECHO "Workitem update failed" End If ' run query set resultSet = QueryWorkItems(query_service, "dcterms:identifier="&workItemID, "dcterms:title") ' display result set call DisplayResultSet(resultSet) set resultSet = Nothing ' Exit the script with return status 0 (zero) WScript.Quit 0
使用腳本
在本節中,將了解如何使用該腳本訪問 Rational Team Concert 工作項。
登錄到 Rational Team Concert
第一步是登錄到 Rational Team Concert。 該腳本提供了一個 JazzLogin() 函數來完成此任務。
清單 2. 登錄到 Rational Team Concert
' Login to jazz application server
Set http = JazzLogin(url, userid, passwd)
JazzLogin() 函數接受 3 個參數。
url 參數是 Rational Team Concert 的 URL(例 如 https://rtc-server.example.com/ccm )。
第二參數和第三個參數是用於登錄 Rational Team Concert 的用戶 ID 和密碼。
成功登錄後,它返回一個 MSXML2.XMLHTTP 對象,該對象基本上是服務 器的一個 HTTP 連接。
獲取 OSLC 服務
Rational Team Concert 提供了各種服務。該腳本 提供了 3 個函數來獲取它們:
獲取工廠服務:GetFactoryService() 函數
工作項更新服務: GetUpdateService() 函數
工作項查詢服務:GetQueryService() 函數
清單 3 給出了獲取工作項服 務的過程。
清單 3. 獲取工廠服務的樣例代碼
service_url = GetServicebyProjectName (http, url, project)
factory_service = GetFactoryService(http, service_url)
update_service = GetUpdateService(http, url)
query_service = GetQueryService (http, service_url)
第一步 是獲取一個指定的 Rational Team Concert 項目的服務 URL。圖 1 顯示了 4 個步驟。但是,第 1 到 3 步 在一個函數 GetServicebyProjectName() 內完成。獲取服務 URL 後,GetFactoryService() 函數獲取一個工 作項創建服務。
指定工作項屬性
創建或更新工作項之前,必須准備好該工作項的屬性。這些屬 性使用以下格式創建為一個簡單的字符串:
<attribute1 >,<value1>,<attribute2>,<value2>,….
例如,當您希望創建僅有一個標題 的工作項時,參數應為以下格式:
dcterms.title, This is a sample title
當希望創建包 含一個標題和一段描述的工作項時,可以采用以下方式指定參數:
dcterms.title,This is title,dcterms.description, This is lengthy description
在樣例腳本中,參數按清單 4 中所示 的方式來准備。
清單 4. 准備參數的樣例代碼
attrString = "dcterms:type,task"
attrString = attrString&","&"dcterms:title,This is sample title"
通過指定 dcterms:type,task,該腳本創建了一個 Task 類型的工作項。在將此參數更改為 defect 時,它將創建一個 Defect 類型的工作項。
創建和更新工作項的函數
表 2 給出了創建和更新 工作項的函數列表。樣例腳本還提供了一個用於在工作項之間設置父子關系的函數。
在樣例 腳本中,可以按清單 5 和清單 6 中所示方式使用工作項的創建和更新。
清單 5. 創建一個工作項
workItemId = CreateWorkItem(http, factory_service, attrString)
清單 6. 更新一個工 作項
workItemId = UpdateWorkItem(http, update_service, workItemId, attrString)
查詢 工作項和顯示查詢結果
QueryWorkitems() 和 DisplayResultSet() 可用於查詢工作項和顯示查詢的結 果。
QueryWorkitems() 函數參數在第 2 個參數和第 3 個參數中接受 oslc.where 和 oslc.select。 為了演示這些值是如何構造的,可以想象清單 7 中的一種數據庫查詢語言。
清單 7. 一種養例數據庫 查詢語言
db> select id, title where id=100 from database
此查詢將返回記錄的 id 和 title 部分,其中 id 與編號 100 匹配。QueryWorkitems() 函數具有類似的行為。在樣例腳本中,可像 清單 8 中的代碼一樣使用它(稍微進行了修改,以表明該腳本將查詢 id=100 的工作項)。
清單 8. 查詢標識符等於 100 的工作項
set resultSet = QueryWorkItems(query_service, "dcterms:identifier=100”, "dcterms:title")
查詢將返回多個工作項,具體情況 取決於 where 子句。出於此原因,QueryWorkItems() 函數返回一個集合對象。提供了 DisplayResultSet() 函數,以便它能夠以人類可讀的格式輸出返回的集合對象。該輸出類似於大多數數據庫查詢輸出。
使 用樣例腳本的示例
必須修改一些參數,才能試用樣例腳本。清單 9 顯示了指定參數的腳本部分。
清單 9. 腳本的一個參數定義部分
' Parameter definition ' CLM parameters url = "https://clm.example.com:9443/ccm" project = "TRADITIONAL" userid = "jazzadmin" passwd = "jazzadmin"
每個參數將在表 3 中解釋。
如果運行該腳本,結果將類似於清 單 10。
清單 10. 運行腳本後的輸出結果
dos>cscript OSLC-utility.vbs Microsoft (R) Windows Script Host Version 5.8 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 503 This is sample title with update,503
執行該腳本會創建工作項 503 並更新同一個工作項。 圖 3 顯示了 Eclipse 客戶端中的實際工作項 GUI。
圖 3. 該腳本創建的實際工作項 GUI
圖 3 顯示了 Overview 和 History 選項卡部分。History 選項卡的 Summary 字段表明此工作項有一個更新。該字 段之前顯示為 “This is sample title”,但它在腳本中已更改為 “This is sample title with update” 。
擴展腳本用途的方式
您可針對各種用途而擴展該腳本。清單 11 是創建一個工作項(父)和 9 個子工作項的腳本部分。
清單 11. 創建父工作項和 9 個子工作項
' Parent workitem create attrString = "dcterms:type,task" attrString = attrString>",">"dcterms:title,This is parent" parentId = CreateWorkItem(http, factory_service, attrString) ' Create 9 child workitems For counter = 1 to 9 attrString = "dcterms:type,task" attrString = attrString>",">"dcterms:title,This is ">counter>" Child" childIds(counter-1) = CreateWorkItem(http, factory_service, attrString) Next ' Then set child workitems to the parent call CreateParentChild(http, update_service, parentId, childIds)
工作項在進入循環之前被 創建為父工作項。然後該腳本創建了 9 個子工作項。該工作項 ID 被設置為 array。這些父工作項和子工作 項被傳遞到 CreateParentChild() 函數。該腳本執行過程的 GUI 表示如圖 4 所示。
圖 4. 從腳本返 回的實際工作項 GUI 結果
圖 4 表明 Links 選項卡擁有此腳 本創建的子工作項的鏈接。
與另一個系統集成
目前為止,該腳本僅處理工作項的創建和一些更 新,比如更新工作項信息或添加子工作項。該腳本的核心是提供與某個現有系統集成的最輕松的方式。這種集 成應稱為數據交換類型的集成(圖 5)。
圖 5. My System 和 Rational Team Concert 之間的集成戰 略
如果現有的系統有一個接口,比如 COM+,那麼它可以提供一種訪問 Visual Basic 腳本語言的更輕松的 方法。一個典型的接口應類似於清單 12 中的代碼。
清單 12. 訪問 My System 中的信息的典型 Visual Basic 代碼
Set app = CreateObject(“System.Application”) ' Create application object Call app.login(“<user>”, “<password>”) ' Login to the system set recordList = app.GetRecordList() ' Obtain list of records ' Loop to obtain information For Each record In recordList ' do something Next Call app.Quit() ' Terminate application.
在這個偽示例中,應用程序提供了一個接口來獲取完 整的記錄,然後在某個循環中訪問每條記錄。可以對這個示例進行擴展,以創建 Rational Team Concert 工 作項,如清單 13 所示。
清單 13. 擴展後可在 Rational Team Concert 中創建工作項的樣例代碼
Set app = CreateObject(“System.Application”)' Create application object Call app.login(“<user>”, “<password>”) ' Login to the system set recordList = app.GetRecordList() ' Obtain list of records For Each record In recordList ' convert record into attribute pairs attrString = ConvertRecord(record) Call CreateWorkItem(http, factory_service, attrString) Next Call app.Quit() ' Terminate application.
該循環已擴展,可調用 ConvertRecord() 偽函數,該 函數應將 My System 記錄轉換為屬性對。然後將屬性對傳遞給 CreateWorkItem() 函數。在本示例中,所有 記錄信息都與 Rational Team Concert 相集成。完成此創建過程後,您應會注意到,集成腳本應使用 UpdateWorkItem() 函數在 My System 和 Rational Team Concert 之間交換數據。
理想情況下,系統 應通過鏈接而不是數據交換來集成。有關鏈接類型的集成的更多信息,請參閱 Eclipse.org 上的 Eclipse Lyo 項目頁面。此項目提供了 SDK 來實現鏈接類型的集成。
該腳本中使用的技術總結
因為您 可能希望修改本文的樣例腳本,所以這一節將介紹樣例腳本的兩個部分。清單 14 是 UpdateWorkItem() 函數 中的代碼。
清單 14. UpdateWorkItem() 函數的一部分
Set workItemDoc = CreateWorkItemDocument(attrString) http.Open "PUT", update_url, False http.setRequestHeader "Content-Type", "application/xml" http.setRequestHeader "Accept", "application/xml" http.setRequestHeader "OSLC-Core-Version", "2.0" http.send(workItemDoc)
MSXML 技術允許以簡單方式連接到 Web 服務器。例如,清單 14 中的第 1 行是使用指定的 URL 打開一個 HTTP PUT 請求。該連接首先發送頭部信息,然後發送 CreateWorkItemDocument() 函數創建的實際的 XML 文檔。一定要在頭部中指定 OSLC-Core-Version,以告訴 Rational 服務器與 OSLC V2.0 規范交互。
該腳本中使用多種 XML 操作函數。清單 15 給出了 XML 文檔操作的一部分。
清單 15. XML 文檔操作的一部分
set doc = Http.ResponseXML
set elements = doc.getElementsByTagName("oslc_cm:ChangeRequest")
http.ResponseXML 獲取 Rational Team Concert 服務器返回的 XML 文檔對象。doc.getElementsByTabName() 用於在 XML 文檔 中查找某個標記。通過使用此方法,很容易在 XML 文檔中找到與該標記有關的信息。一種替代方法是使用 XPath,但樣例腳本中沒有使用該方法。