可使用 API 来创建定义了特定状态和复审方案的定制复审流程。要了解如何使用 API,请使用以下目录中的 BugzillReview.jar 提供的 Bugzilla 客户机示例:http://host:port/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/BugzillaReview.jar,其中 host 和 port 是 Rational® Asset Manager 服务器的名称和端口号。
打开以下目录中的 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 客户机中的每个问题都有关联问题标识或“错误标识”。此标识是从此扩展中的 start(...) 方法返回的,并且存储在 Rational Asset Manager 中。后续方法调用包括实例数据中的“错误标识”,它使得扩展能够将特定复审流程实例与 Bugzilla“错误标识”相匹配。以下示例描述复审流程中的实例的方法调用:
public class BugzillaReviewProcess extends CustomReviewProcess {
Bugzilla 状态“VERIFIED”表示 Rational Asset Manager 中的已核准状态。可在存储库中找到并复用已核准的资产。
public static final String[] APPROVED_STATES = {BugzillaConstants.VERIFIED};
Bugzilla 状态“CLOSED”表示 Rational Asset Manager 中的已拒绝状态。已被拒绝的资产将返回至可编辑草稿状态。
public static final String[] REJECTED_STATES = {BugzillaConstants.CLOSED};
Bugzilla 的“NEW”、“ASSIGNED”和“RESOLVED”状态将用于 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 客户机错误条目添加标识。
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 服务器通信以确定实例数据中提供的问题标识的状态。
public String getState(String assetId, String assetVersion, String instanceData,Map configurationValues)
{
return (String)getStatus(getBugId(instanceData),configurationValues).get(BugzillaXMLHandler.BUG_STATUS_NODE);
}
以下代码返回实例数据中基于“错误标识”的特定问题的 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 提供此复审流程的资产标识、资产版本和配置值。必须与 Bugzilla 客户机通信以针对此复审流程形成问题。针对复审流程形成问题后,与该问题相关联的“错误标识”会返回至 Rational Asset Manager。在此复审流程的所有后续调用中,此方法返回的字符串(错误标识)将作为实例参数进行传递。
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 客户机通信以确定特定问题标识或“错误标识”的状态。@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“错误标识”。
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;
}
}
}