Criando uma Revisão Customizada Utilizando a API de Revisão Customizada

Utilize a amostra do cliente Bugzilla para aprender a utilizar a API para criar um processo de revisão customizado.

Sobre Esta Tarefa

Você pode utilizar a API para criar um processo de revisão customizado que define estados específicos e revisa cenários. Para saber como usar a API, use o exemplo de cliente Bugzilla disponível em BugzillReview.jar, localizado no seguinte diretório: http://host:port/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/BugzillaReview.jar, em que host e port são o nome e o número da porta do servidor Rational Asset Manager.

Abra o arquivo archive Java localizado no seguinte diretório: http://host:port/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/CustomReviewAPI.jar, em que host e port são o nome e o número da porta do servidor 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;
 

Quando um processo de revisão é iniciado no Rational Asset Manager, essa extensão cria um problema no cliente Bugzilla para rastrear o processo de revisão. Cada problema no cliente Bugzilla tem um ID associado, ou 'ID do erro'. Esse ID é retornado do método start(...) nessa extensão e armazenado no Rational Asset Manager. As chamadas de método subseqüentes incluem o 'ID do erro' nos dados da instância para que a extensão possa comparar uma instância do processo de revisão específica com um 'ID do erro' do Bugzilla. Os exemplos a seguir descrevem as chamadas de método para instâncias no processo de revisão:

public class BugzillaReviewProcess extends CustomReviewProcess {	

O estado do Bugzilla 'VERIFIED' representa o estado aprovado no Rational Asset Manager. Recursos que são aprovados podem ser localizados e reutilizados no repositório.

public static final String[] APPROVED_STATES = {BugzillaConstants.VERIFIED};

O estado do Bugzilla 'CLOSED' representa o estado rejeitado no Rational Asset Manager. Recursos que são rejeitados são retornados para o estado de rascunho editável.

public static final String[] REJECTED_STATES = {BugzillaConstants.CLOSED};

Os estados do Bugzilla 'NEW', 'ASSIGNED' e 'RESOLVED' serão utilizados para o processo de revisão no 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"; 	

Ao conectar-se a um servidor Rational Asset Manager, você deve configurar os seguintes detalhes do cliente Bugzilla: a URL do servidor, o nome do usuário e a senha. É possível configurar detalhes opcionais, como o nome do processo de revisão, como os detalhes se relacionam a um determinado processo de revisão.

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), 	
};

O código a seguirinclui um ID para uma entrada de erro desconhecido do cliente Bugzilla.

public static final String UNKNOWN_CUSTOM_ID = "-1";
O método a seguir pode ser utilizado para limpar os dados que permanecem no final de um processo de revisão, por exemplo, a notificação de que um usuário concluiu uma revisão.
Nota: O exemplo a seguir desse método não limpa os dados.
public void end(String ramAssetId, String assetVersion, String customAssetId,Map configurationValues, boolean aborted) { 

O método a seguir retorna os detalhes de configuração definidos por você.

public String getName() { 
	return "Bugzilla 2.22.2 review process"; 	}

O seguinte método retorna a descrição do processo do Bugzilla.

public String getDescription() { 	
   return "A custom review process that integrates with Bugzilla 2.22.2"; 	}

O método a seguir retorna os nomes de estado aprovados que você definiu. Quando o recurso alcança esse estado, ele é movido para o estado Aprovado no Rational Asset Manager.

public String[] getApprovedStateNames(String assetId, String assetVersion,
String instanceData, Map configurationValues) { 		
	return APPROVED_STATES;
}

O método a seguir retorna os nomes de estado não finais que você definiu. Enquanto o recurso estiver em um desses estados, o processo de revisão ficará ativo e os revisores terão acesso para revisar o recurso.

public String[] getNonFinalStateNames() { 		
	return NON_FINAL_STATES;
 }

O código a seguirse comunica com o servidor Bugzilla para determinar o estado do ID do problema que é fornecido nos dados da instância.

public String getState(String assetId, String assetVersion, String instanceData,Map configurationValues) 
{ 		
return (String)getStatus(getBugId(instanceData),configurationValues).get(BugzillaXMLHandler.BUG_STATUS_NODE); 
}

O código a seguirretorna a URL de um problema específico com base no 'ID do erro' nos dados da instância.

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  
{

O código a seguiré chamado cada vez que você envia uma revisão. Nesse ponto, comunique-se com o Bugzilla para buscar o problema associado a esse processo de revisão, que é determinado pelos dados da instância. Continue então a atualizar o status do problema digitando o comentário de revisão do usuário e observando se o usuário aceitou ou rejeitou a revisão.

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; 
}

O código a seguir se comunica com o cliente Bugzilla para determinar se o processo de revisão específico está em um estado aceito.

public boolean isApproved(String assetId, String assetVersion,String instanceData, Map configurationValues) 
{ 		
return BugzillaConstants.VERIFIED_XML.equals(getState(assetId,assetVersion, instanceData, configurationValues));
}

O código a seguir se comunica com o cliente Bugzilla para determinar se o processo de revisão específico está em um estado rejeitado.

public boolean isRejected(String assetId, String assetVersion, 
	String instanceData,Map configurationValues) 
{ 		
return BugzillaConstants.CLOSED_XML.equals(getState(assetId,assetVersion, instanc Data, configurationValues)); 	
}

O código a seguir é chamado quando o processo de revisão é iniciado. O Rational Asset Manager fornece o ID do recurso, a versão do recurso e os valores de configuração desse processo de revisão. Comunique-se com o cliente Bugzilla para criar um problema para esse processo de revisão. Depois de criar um problema para o processo de revisão, o 'ID do erro' associado ao problema retorna para o Rational Asset Manager. Em todas as chamadas subseqüentes para esse processo de revisão, a cadeia retornada do método (o ID do erro) será transmitida como parâmetro da instância.

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; 
} 	
O código a seguirse comunica com o cliente Bugzilla para determinar o status de um ID de problema ou 'ID de erro' específico.

@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();
}

O código a seguirdetermina o 'ID do erro' do Bugzilla nos dados da instância armazenados no 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; 
		} 
	} 	 
}

Feedback