この API を使用することで、特定の状態を定義してシナリオをレビューするカスタム・レビュー・プロセスを作成することができます。 API の使用方法について学習するには、http://host:port/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/BugzillaReview.jar ディレクトリー (ここで、host および port は、ご使用の Rational® Asset Manager サーバーの名前およびポート番号です) にある BugzillReview.jar の中のサンプル Bugzilla クライアントを使用してください。
この Java アーカイブ・ファイルを開きます。このファイルは、http://host:port/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/CustomReviewAPI.jar ディレクトリー (host および port は、ご使用の Rational Asset Manager サーバーの名前およびポート番号です) にあります。
package com.ibm.ram.extension.demo.review; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import com.ibm.ram.extension.ConfigurationDetails; import com.ibm.ram.extension.CustomReviewProcess;
Rational Asset Manager でレビュー・プロセスが開始されると、この拡張によって、そのレビュー・プロセスを追跡するための問題が Bugzilla クライアント内に作成されます。 Bugzilla クライアント内の各問題には、問題 ID (バグ ID) が関連付けられています。 この ID は、この拡張の start(...) メソッドから返され、Rational Asset Manager に格納されます。 後続のメソッド呼び出しのインスタンス・データには、「バグ ID」が含まれています。これにより拡張は、特定のレビュー・プロセス・インスタンスを Bugzilla の「バグ ID」と突き合わせることができます。 以下に、レビュー・プロセス内のインスタンスに対するメソッド呼び出しの記述例を示します。
public class BugzillaReviewProcess extends CustomReviewProcess {
「VERIFIED」という Bugzilla の状態は 、Rational Asset Manager で承認済み状態を表しています。承認されたアセットは、 リポジトリーで検出したり、再利用したりできます。
public static final String[] APPROVED_STATES = {BugzillaConstants.VERIFIED};
「CLOSED」という Bugzilla の状態は 、Rational Asset Manager で拒否状態を表します。拒否されたアセットは、編集可能なドラフト状態に戻されます。
public static final String[] REJECTED_STATES = {BugzillaConstants.CLOSED};
「NEW」、「ASSIGNED」、および「RESOLVED」という Bugzilla の状態は、レビュー・プロセスのために Rational Asset Manager で使用されます。
public static final String[] NON_FINAL_STATES = {BugzillaConstants.NEW, BugzillaConstants.ASSIGNED,
BugzillaConstants.RESOLVED};
public static final String USER = "user";
public static final String PASSWORD = "password";
public static final String TITLE = "title"; public static
final String PRODUCT = "product";
public static final String COMPONENT = "component";
public static final String PLATFORM = "platform";
public static final String SEVERITY = "severity";
public static final String PRIORITY = "priority";
public static final String OPERATING_SYSTEM = "operatingSystem";
public static final String VERSION = "version";
public static final String URL = "url";
Rational Asset Manager サーバーに接続する際には、Bugzilla クライアントの詳細 (サーバー URL、ユーザー名、およびパスワード) を構成する必要があります。 個々のレビュー・プロセスには詳細が関連付けられているため、レビュー・プロセスの名前など、オプションの詳細を構成できます。
public static final ConfigurationDetails[] CONFIG_DETAILS = {
new ConfigurationDetails (URL, "URL", "The URL of the Bugzilla home page",false, true),
new ConfigurationDetails (USER,"User", "The user account that will be used to access bugzilla", false, true),
new ConfigurationDetails (PASSWORD, "Password","The password for the account that will be used to access bugzilla", true, true),
new ConfigurationDetails(TITLE, "Title", "The title for the submitted review", false, false),
new ConfigurationDetails(PRODUCT, "Product","Prodcut", "TestProduct", false, false),
new ConfigurationDetails(COMPONENT, "Component","Component", "TestComponent", false, false),
new ConfigurationDetails(PLATFORM, "Platform","Platform", "PC", false, false),
new ConfigurationDetails(SEVERITY, "Severity","Severity", "blocker", false, false),
new ConfigurationDetails(PRIORITY, "Priority","Priority", "P1", false, false),
new ConfigurationDetails(OPERATING_SYSTEM,"Operating system","Operating System", "Windows", false, fals),
new ConfigurationDetails(VERSION, "Version","Version", "other", false, false),
};
以下のコードは、Bugzilla クライアントの未知のバグ項目に対して ID を追加します。
public static final String UNKNOWN_CUSTOM_ID = "-1";
public void end(String ramAssetId, String assetVersion, String customAssetId,Map configurationValues, boolean aborted) {
以下のメソッドは、定義した構成の詳細を返します。
public String getName() {
return "Bugzilla 2.22.2 review process"; }
以下のメソッドは、Bugzilla プロセスの説明を返します。
public String getDescription() {
return "A custom review process that integrates with Bugzilla 2.22.2"; }
以下のメソッドは、定義した承認済みの状態名を返します。 この状態になったアセットは、Rational Asset Manager で「承認済み」状態に移行します。
public String[] getApprovedStateNames(String assetId, String assetVersion,
String instanceData, Map configurationValues) {
return APPROVED_STATES;
}
以下のメソッドは、定義した非最終状態名を返します。 アセットがこれらの状態のいずれかにある間、レビュー・プロセスはアクティブであり、レビューアーにはアセットをレビューするアクセス権があります。
public String[] getNonFinalStateNames() {
return NON_FINAL_STATES;
}
以下のコードは、Bugzilla サーバーと通信して、インスタンス・データ内にある問題 ID の状態を判別します。
public String getState(String assetId, String assetVersion, String instanceData,Map configurationValues)
{
return (String)getStatus(getBugId(instanceData),configurationValues).get(BugzillaXMLHandler.BUG_STATUS_NODE);
}
以下のコードは、インスタンス・データ内の「バグ ID」に基づいて、特定の問題の URL を返します。
public String getURL(String assetId, String assetVersion, String instanceData,Map configurationValues)
{
int bugId = getBugId(instanceData);String url = BugzillaClient client = new BugzillaClient(new URL((String)configurationValues.get(URL)));
if(!String.valueOf(bugId).equals(UNKNOWN_CUSTOM_ID))
{
url = client.getURL(bugId).toString();
}
catch(Exception e) {e.printStackTrace();
}
return url;""; try
{
以下のコードは、レビューを登録するたびに呼び出されます。 この時点で Bugzilla クライアントと通信して、このレビュー・プロセスに関連付けられた (instanceData によって判別される) 問題を取り出す必要があります。 続いて、ユーザーのレビュー・コメントを入力し、ユーザーがレビューを受け入れたか拒否したかを通知して、問題の状況を更新する必要があります。
public String handleReviewSubmitted
(String assetId, String assetVersion, String instanceData, String username, bool accepted, String comment, InputStream uploadedContent, String fileName, Map configurationValues)
{
String acceptText = accepted ? "approved" : "rejected"; try
{
BugzillaClient client = new BugzillaClient(new URL((String)configurationValues.get(URL)));
Map bugStatus = getStatus(getBugId(instanceData),configurationValues);client.updateBug
(
(String)configurationValues.get(USER),
(String)configurationValues.get(PASSWORD),getBugId(instanceData),BugzillaConstants.KEEP_CURRENT_STATE,
(String)bugStatus.get(BugzillaXMLHandler.PRODUCT_NODE),
(String)bugStatus.get(BugzillaXMLHandler.COMPONENT_NODE),
(String)bugStatus.get(BugzillaXMLHandler.PLATORM_NODE),
(String)bugStatus.get(BugzillaXMLHandler.SEVERITY_NODE),
(String)bugStatus.get(BugzillaXMLHandler.PRIORITY_NODE),
(String)bugStatus.get(BugzillaXMLHandler.OP_SYS_NODE),
(String)bugStatus.get(BugzillaXMLHandler.VERSION_NODE),"http://",
(String)bugStatus.get(BugzillaXMLHandler.TITLE_NODE), username + " has " + acceptText + " with comment: " + comment);
}
catch(Exceptione)
{
e.printStackTrace();
}
return instanceData;
}
以下のコードは、Bugzilla クライアントと通信して、そのレビュー・プロセスが受け入れ済みの状態にあるかどうかを判別します。
public boolean isApproved(String assetId, String assetVersion,String instanceData, Map configurationValues)
{
return BugzillaConstants.VERIFIED_XML.equals(getState(assetId,assetVersion, instanceData, configurationValues));
}
以下のコードは、Bugzilla クライアントと通信して、そのレビュー・プロセスが拒否状態にあるかどうかを判別します。
public boolean isRejected(String assetId, String assetVersion,
String instanceData,Map configurationValues)
{
return BugzillaConstants.CLOSED_XML.equals(getState(assetId,assetVersion, instanc Data, configurationValues));
}
以下のコードは、レビュー・プロセスの開始時に呼び出されます。 Rational Asset Manager によって、このレビュー・プロセスのアセット ID、アセット・バージョン、および構成値が指定されます。 Bugzilla クライアントと通信して、このレビュー・プロセスの問題を作成する必要があります。 レビュー・プロセスの問題を作成すると、その問題と関連付けられた「バグ ID」が、Rational Asset Manager に返されます。 このレビュー・プロセスに関する後続のすべての呼び出しで、メソッドから返された String (バグ ID) が、インスタンス・パラメーターとして渡されます。
public String start(String assetId, String assetVersion, Map configurationValues)
{
String customId; try
{
BugzillaClient client = new BugzillaClient
(newURL((String)configurationValues.get(URL))); customId = String.valueOf(client.enterBug((String)configurationValues.get(USER),
(String)configurationValues.get(PASSWORD),
(String)configurationValues.get(PRODUCT),
(String)configurationValues.get(COMPONENT),
(String)configurationValues.get(PLATFORM),
(String)configurationValues.get(SEVERITY),
(String)configurationValues.get(PRIORITY),
(String)configurationValues.get(OPERATING_SYSTEM),
(String)configurationValues.get(VERSION),"http://",
(String)configurationValues.get(TITLE), "Review started"));
}
catch(Exception e)
{
e.printStackTrace();customId = UNKNOWN_CUSTOM_ID;
}
return customId;
}
以下のコードは、Bugzilla クライアントと通信して、特定の問題 ID (バグ ID) の状況を判別します。@param bugzillaAssetId
@param configurationValues
@return
private Map getStatus(int bugzillaAssetId, Map configurationValues)
{
BugzillaXMLHandler handler = new BugzillaXMLHandler();
try
{
BugzillaClient client = new BugzillaClient(new URL((String)configurationValues.get(URL))); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(false); SAXParser sp = factory.newSAXParser(); sp.parse(client.getBugStatus((String)configurationValues.get(USER),
(String)configurationValues.get(PASSWORD), bugzillaAssetId), handler);
}
catch(Exception e)
{
e.printStackTrace();
}
return handler.getResult();
}
以下のコードは、Rational Asset Manager に保管されているインスタンス・データの Bugzilla における「バグ ID」を判別します。
public class BugzillaXMLHandler extends DefaultHandler {
public static final String BUG_ID_NODE = "bug_id";
public static final String PRODUCT_NODE = "product";
public static final String COMPONENT_NODE = "component";
public static final String VERSION_NODE = "version";
public static final String PLATORM_NODE = "rep_platform";
public static final String OP_SYS_NODE = "op_sys";
public static final String BUG_STATUS_NODE = "bug_status";
public static final String PRIORITY_NODE = "priority";
public static final String SEVERITY_NODE = "bug_severity";
public static final String TITLE_NODE = "short_desc";
private String node;
private Map valueMap = new HashMap();
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
node = qName;
}
public InputSource resolveEntity(String publicID, String systemID)
{
return new InputSource(BugzillaReviewProcess.class.getResourceAsStream("bugzilla.dtd"));
}
public void characters (char ch[], int start, int length)
{
if(node.equals(BUG_ID_NODE)
|| node.equals(PRODUCT_NODE)
|| node.equals(COMPONENT_NODE)
|| node.equals(VERSION_NODE)
|| node.equals(PLATORM_NODE)
|| node.equals(OP_SYS_NODE)
|| node.equals(BUG_STATUS_NODE)
|| node.equals(PRIORITY_NODE)
|| node.equals(BUG_ID_NODE)
|| node.equals(SEVERITY_NODE)
|| node.equals(TITLE_NODE)) {
valueMap.put(node,new String(ch, start, length));
}
}
public Map getResult()
{
return valueMap;
}
}
}