Этот API можно использовать для создания пользовательского процесса проверки, определяющего особые состояния и проверяющего сценарии. Для того чтобы научиться пользоваться API, изучите пример клиента Bugzilla в архиве BugzillaReview.jar, он находится в каталоге http://хост:порт/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/BugzillaReview.jar, где хост и порт обозначают хост и номер порта сервера Rational Asset Manager.
Откройте файл архива Java™ в каталоге http://хост:порт/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/CustomReviewAPI.jar, где хост и порт обозначают хост и номер порта сервера 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 {
Состояние 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.
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();
}
Следующий код определяет ИД ошибки Bugzilla по данным экземпляра в Rational Asset Manager.
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;
}
}
}