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