Diseño y desarrollo de la implementación

Antes de desarrollar la implementación, tenga en cuenta los datos que se deben utilizar del archivo XML de resultados. La API Java™ permite utilizar datos de distintas secciones y, si es necesario, mostrarlos en otro orden en el archivo XML de resultados original.

Acerca de esta tarea

Deben observarse las directrices siguientes:
  • Valide siempre la estructura del archivo XML de resultados antes de llevar a cabo cualquier otra tarea.
  • Utilice la clase com.ibm.prs.common.exception.PRSApiException para el manejo de excepciones.

El procedimiento resume cómo utilizar la API Java para realizar las tareas siguientes:

  • Valide el archivo XML de resultados.
  • Determine la cantidad de productos que se han explorado y muestre ese número.
  • Determine la cantidad de productos que han fallado las comprobaciones.
  • Para cada producto, muestre el nombre del producto y la lista de comprobaciones fallidas.

Procedimiento

  1. Cree una clase Java, por ejemplo CheckForFailedScanResults.
  2. Importe los paquetes siguientes:
    //Paquetes de programa de utilidad
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    //Paquetes de API Java de Prerequisite Scanner
    import com.ibm.prs.common.exception.PRSApiException;
    import com.ibm.prs.common.reports.api.PRSXmlResultReader;
    import com.ibm.prs.common.reports.api.impl.PRSXmlResultReaderImpl;
    
    //Paquetes de excepciones de analizador
    import javax.xml.parsers.ParserConfigurationException;
    import org.xml.sax.SAXException;
  3. Declare las variables.
  4. Inicie la clase PRSXmlResultReaderImpl y pase el archivo XML de resultados y el archivo de esquema XML como parámetros de entrada.
  5. Verifique que el archivo XML de resultados tenga una estructura válida utilizando el método isValidXml; registre los mensajes y detecte los errores.
  6. Obtenga la información de cada producto que se ha explorado implementando el método getProductInfo. Asegúrese de comprobar que el archivo XML de resultados tiene datos en el elemento ProductInfo utilizando el método hasProductInfo.
  7. Obtenga los resultados fallidos implementando el método getFailedResults. Asegúrese de comprobar que el archivo XML de resultados contenga los resultados fallidos utilizando el método isScanPassed.
    La implementación de método de ejemplo siguiente llama a los dos métodos siguientes:
    private String getProductName(String productCode)
    Este método obtiene el nombre del producto explorado que está asociado con las comprobaciones fallidas. Adopta el código del producto como parámetro de entrada y devuelve el nombre del producto.
    private void printFailedChecks(Set<Map<String, String>> aSet)
    Este método imprime la lista de comprobaciones fallidas para el producto explorado relevante. Necesita la recopilación Set del método getProductInfo() devuelto.
    //obtener resultados fallidos
    private void getFailedResults() {
    	try {
    		if (!failedResults.isScanPassed())
    		{
    			Map<String, Set<Map<String,String>>> failedResultSet = failedResults.getFailedResults();
    			Iterator<String> keyIter = failedResultSet.keySet().iterator();
    			while (keyIter.hasNext())
    			{
    				String productCode = (String)keyIter.next();
    				Set<Map<String,String>> prodfailedResultSet = failedResultSet.get(productCode);
    				//obtener el nombre del producto utilizando el código del producto
    				String productName = getProductName(productCode);
    				if (productCode!="AGGREGATED")
    				{
    					System.out.println("Total number of failed checks in " 
    + productName + "("+ productCode + ") is " + prodfailedResultSet.size()); //imprimir los nombres de las comprobaciones de requisitos previos fallidas del producto printFailedChecks(prodfailedResultSet); } //manejar las comprobaciones fallidas en la sección agregada else { System.out.println("Total number of failed checks in the "
    + productCode + " section is " + prodfailedResultSet.size()); //imprimir los nombres de las comprobaciones de requisitos previos fallidas de la sección agregada printFailedChecks(prodfailedResultSet); } } } else System.out.println("Scan passed, no issues to report. You can now install myProducts."); } catch (PRSApiException e) { e.printStackTrace(); } }
    //obtener el nombre del producto explorado con las comprobaciones fallidas
    private String getProductName(String productCode) {
    	String aProductName = null;
    	String aProductCode = null;
    	try {
    		if (failedResults.hasProductInfo())
    		{
    			Set<Map<String,String>> failedProductInfo = failedResults.getProductInfo();
    			Iterator<Map<String,String>> productIter = failedProductInfo.iterator();
    			for (int i=0; i<failedProductInfo.size(); i++)
    			{
    				Map<String,String> product = (Map<String,String>)productIter.next();
    				Iterator<String> keyIter = product.keySet().iterator();
    				while (keyIter.hasNext())
    				{
    					String key = (String)keyIter.next();
    					aProductCode = product.get(key);
    					if (aProductCode.equals(productCode))
    					{
    						String isProductName = (String) keyIter.next();
    						if (isProductName=="ProductName"){
    						return aProductName=product.get(isProductName);
    						}
    					}
    				}
    			}
    		}
    		else
    			return aProductName = "ERROR: No product information" ;
    	} catch (PRSApiException e) {
    		e.printStackTrace();
    	}
    	return aProductName="none";
    }
    
    //imprimir las comprobaciones fallidas
    private void printFailedChecks(Set<Map<String, String>> aSet) {
    	Iterator<Map<String,String>> checkIter = aSet.iterator();
    	for (int i=0; i<aSet.size(); i++)
    	{
    		Map<String,String> check = (Map<String,String>)checkIter.next();
    		Set<String> keys = check.keySet();
    		Iterator<String> keyIter = keys.iterator();
    		while (keyIter.hasNext())
    		{
    			String key = (String)keyIter.next();
    			if (key=="PropertyName")
    			System.out.println("\t" + check.get(key));
    		}
    	}
    }
  8. Pruebe, depure y compile el código.

Ejemplo

La clase CheckForFailedScanResults siguiente es el origen completo de la implementación de ejemplo documentada.

//Paquetes de programa de utilidad
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

//Paquetes de API Java de Prerequisite Scanner
import com.ibm.prs.common.exception.PRSApiException;
import com.ibm.prs.common.reports.api.PRSXmlResultReader;
import com.ibm.prs.common.reports.api.impl.PRSXmlResultReaderImpl;

//Paquetes de excepciones de analizador
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;

public class CheckForFailedScanResults {
	private String xmlFileName = null;
	private String schemaFileName = null;
	private PRSXmlResultReader failedResults = null;
	
	public static void main(String[] args) {
	if (args.length != 2)
	{
		System.out.println("Usage: java CheckForFailedScanResults path_to_xmlFileName path_to_schemaFileName");
		System.exit(-1);
	}

	
	CheckForFailedScanResults example = new CheckForFailedScanResults ();
	example.xmlFileName = args[0].trim();
	example.schemaFileName = args[1].trim();
	try {
		example.init();
	} catch (PRSApiException e) {
		System.err.println("ERROR: PRSApiException during instantiation - " + e.getLocalizedMessage());
		e.printStackTrace();
	System.exit(-1);
	}


	//Validar el archivo XML de resultados
	example.validateXml();
	
	//Obtener la información del producto
	example.getProductInfo();
	//Obtener la información del producto
	example.getFailedResults();
}

//Iniciar la implementación de la interfaz PRSXmlResultReader
private void init() throws PRSApiException {
	failedResults = new PRSXmlResultReaderImpl(this.xmlFileName, this.schemaFileName);
}

//Validar XML desde com.ibm.prs.common.reports.api.example.PRSXmlResultReaderExample
private void validateXml() {
	boolean isValid;
	try {
		isValid = failedResults.isValidXml();
		if (!isValid)
		{
			System.err.println("ERROR: The " + this.xmlFileName + " file is not valid.");
			System.exit(-1);
		} else {
			System.out.println("INFO: The " + this.xmlFileName + " file is valid.");
		}
	} catch (PRSApiException e) {
		e.printStackTrace();
	}
}

//Obtener la información del producto de com.ibm.prs.common.reports.api.example.PRSXmlResultReaderExample
private void getProductInfo() {
	try {
		if (failedResults.hasProductInfo())
		{
			Set <Map<String,String>> productInfo = failedResults.getProductInfo();
			int numOfProducts = productInfo.size();
			System.out.println("");
			System.out.println("Total number of products and components scanned is " + numOfProducts);
		} else
			System.out.println("ERROR: No product information found in the result XML file");
	} catch (PRSApiException e) {
		e.printStackTrace();
	}
}

//Implementación del método getFailedResults desde la API
private void getFailedResults() {
	try {
		if (!failedResults.isScanPassed())
		{
			Map<String, Set<Map<String,String>>> failedResultSet = failedResults.getFailedResults();
			Iterator<String> keyIter = failedResultSet.keySet().iterator();
			while (keyIter.hasNext())
			{
				String productCode = (String)keyIter.next();
				Set<Map<String,String>> prodfailedResultSet = failedResultSet.get(productCode);
				//obtener el nombre del producto utilizando el código del producto
				String productName = getProductName(productCode);
				if (productCode!="AGGREGATED")
				{
					System.out.println("Total number of failed checks in " + productName + 
"(" + productCode + ") is " + prodfailedResultSet.size()); //imprimir los nombres de las comprobaciones de requisitos previos fallidas del producto printFailedChecks(prodfailedResultSet); } //manejar las comprobaciones fallidas en la sección agregada else { System.out.println("Total number of failed checks in the " + productCode +
" section is " + prodfailedResultSet.size()); //imprimir los nombres de las comprobaciones de requisitos previos fallidas de la sección agregada printFailedChecks(prodfailedResultSet); } } } else System.out.println("Scan passed, no issues to report. You can now install myProducts."); } catch (PRSApiException e) { e.printStackTrace(); } } //obtener el nombre del producto explorado con las comprobaciones fallidas private String getProductName(String productCode) { String aProductName = null; String aProductCode = null; try { if (failedResults.hasProductInfo()) { Set<Map<String,String>> failedProductInfo = failedResults.getProductInfo(); Iterator<Map<String,String>> productIter = failedProductInfo.iterator(); for (int i=0; i<failedProductInfo.size(); i++) { Map<String,String> product = (Map<String,String>)productIter.next(); Iterator<String> keyIter = product.keySet().iterator(); while (keyIter.hasNext()) { String key = (String)keyIter.next(); aProductCode = product.get(key); if (aProductCode.equals(productCode)) { String isProductName = (String) keyIter.next(); if (isProductName=="ProductName"){ return aProductName=product.get(isProductName); } } } } } else return aProductName = "ERROR: No product information" ; } catch (PRSApiException e) { e.printStackTrace(); } return aProductName="none"; } //imprimir las comprobaciones fallidas private void printFailedChecks(Set<Map<String, String>> aSet) { Iterator<Map<String,String>> checkIter = aSet.iterator(); for (int i=0; i<aSet.size(); i++) { Map<String,String> check = (Map<String,String>)checkIter.next(); Set<String> keys = check.keySet(); Iterator<String> keyIter = keys.iterator(); while (keyIter.hasNext()) { String key = (String)keyIter.next(); if (key=="PropertyName") System.out.println("\t" + check.get(key)); } } } }

Por ejemplo, el comando siguiente ejecuta la implementación CheckForFailedScanResults de ejemplo una vez compilada la clase. El archivo de resultados XML se genera a partir de la ejecución de Prerequisite Scanner con el código de producto DMO.

java CheckForFailedScanResults C:\ips\precheck_windows_20120815\result.xml
C:\ips\precheck_windows_20120815\PRSResults.xsd
Nota: La variable CLASSPATH debe contener la ruta al archivo JAR de la API Prerequisite Scanner Java, es decir, ips_root/api/jar/prs_api.jar.
Figura 1. Salida de implementación de ejemplo
Salida de implementación de ejemplo