Creación de una revisión personalizada utilizando la API de revisión personalizada

Utilice el ejemplo de cliente Bugzilla para aprender a utilizar la API para crear un proceso de revisión personalizado.

Acerca de esta tarea

Puede utilizar la API para crear un proceso de revisión personalizado que defina escenarios de revisiones y estados específicos. Para aprender a usar la API, utilice el ejemplo del cliente Bugzilla disponible en BugzillReview.jar, que se encuentra en el directorio siguiente: http://host:puerto/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/BugzillaReview.jar, donde host y puerto son el nombre y número de puerto para su servidor Rational Asset Manager.

Abra el archivo de archivado de Java en el directorio siguiente: http://host:puerto/com.ibm.ram.repository.web/extensionExamples/customReviewProcess/CustomReviewAPI.jar, donde host y puerto son el nombre y el número de puerto de su 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;
 

Cuando se inicia un proceso de revisión en Rational Asset Manager, esta ampliación crea un problema en el cliente Bugzilla para hacer un seguimiento al proceso de revisión. Los problemas del cliente Bugzilla tienen un ID de problema asociado, o 'ID de bug'. Este ID se devuelve desde el método start(...) en esta ampliación y se almacena en Rational Asset Manager. Las llamadas posteriores al método incluyen el 'ID de bug' en los datos de la instancia, de forma que la ampliación puede coincidir con una instancia concreta del proceso de revisión con un 'ID de bug' de Bugzilla. Los ejemplos siguientes describen las llamadas de método para instancias en el proceso de revisión:

public class BugzillaReviewProcess extends CustomReviewProcess {	

El estado 'VERIFIED' (VERIFICADO) de Bugzilla representa el estado aprobado en Rational Asset Manager. Los activos que se aprueban se pueden hallar y reutilizar en el repositorio.

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

El estado 'CLOSED' (CERRADO) de Bugzilla representa el estado rechazado en Rational Asset Manager. Los activos que se rechazan se devuelven a su estado de borrador editable.

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

Los estados 'NEW', 'ASSIGNED' y 'RESOLVED' (NUEVO, ASIGNADO y RESUELTO) de Bugzilla se utilizarán para el proceso de revisión en 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"; 	

Cuando conecta a un servidor Rational Asset Manager, debe configurar los detalles siguientes del cliente de Bugzilla: el URL de servidor, nombre de usuario y contraseña. Puede configurar detalles opcionales, como el nombre del proceso de revisión, como detalles relativos a un proceso de revisión concreto.

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

El código siguiente añade un ID para una entrada de bug de cliente de Bugzilla desconocida.

public static final String UNKNOWN_CUSTOM_ID = "-1";
El método siguiente se puede utilizar para limpiar los datos que queden al final de un proceso de revisión, por ejemplo, la notificación de que un usuario ha terminado la revisión.
Nota: El ejemplo siguiente de este método no limpia datos.
public void end(String ramAssetId, String assetVersion, String customAssetId,Map configurationValues, boolean aborted) { 

El método siguiente devuelve los detalles de configuración que ha definido.

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

El método siguiente devuelve la descripción del proceso de Bugzilla.

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

El método siguiente devuelve los nombres de estado aprobados que ha definido. Cuando el activo alcanza este estado, pasa a estado Aprobado en Rational Asset Manager.

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

El método siguiente devuelve los nombres de estado no finales que ha definido. Mientras el activo esté en uno de estos estados, el proceso de revisión estará activado y los revisores pueden acceder para revisar el activo.

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

El código siguiente comunica con el servidor de Bugzilla para determinar el estado del ID de problema que se proporciona en los datos de la instancia.

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

El código siguiente devuelve el URL de un problema específico en base a su 'ID de bug' en los datos de instancia.

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  
{

El código siguiente se invoca cada vez que somete una revisión. En este punto, debe comunicar con el cliente Bugzilla para recuperar el problema asociado a este proceso de servidor, que está determinado por instanceData. Luego deberá continuar para actualizar el estado del problema especificando el comentario de revisión del usuario y anotar si el usuario ha aceptado o rechazado la revisión.

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

El código siguiente se comunica con el cliente Bugzilla para determinar si un proceso de revisión dado está en estado aceptado.

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

El código siguiente se comunica con el cliente Bugzilla para determinar si un proceso de revisión dado está en estado rechazado.

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

El código siguiente se invoca cuando se inicia el proceso de revisión. Rational Asset Manager proporciona el ID de activo, versión del activo y los valores de configuración para este proceso de revisión. Debe comunicar con el cliente Bugzilla para crear un problema para este proceso de revisión. Una vez creado el problema para el proceso de revisión, el 'ID de bug' asociado al problema se devuelve a Rational Asset Manager. En todas las llamadas posteriores para este proceso de revisión, la Serie devuelta desde el método (el ID de bug) se pasa como parámetro de instancia.

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; 
} 	
El código siguiente comunica con el cliente de Bugzilla para determinar el estado de un ID de problema específico o 'ID de bug'.

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

El código siguiente determina el 'ID de bug' de Bugzilla a partir de los datos de instancia almacenados en 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; 
		} 
	} 	 
}

Comentarios