Escribir sus propias pruebas: Ejemplo 2
El siguiente código fuente es un ejemplo de una prueba que compara los nombres de colas con un convenio de denominación definido. Si se encuentra alguna cola cuyo nombre no cumple el convenio de denominación definido, los detalles se muestran en la vista Resultados de la prueba.
/*
* Material bajo licencia - Propiedad de IBM
*
* 5724-H72, 5655-L82, 5724-L26, 5655R3600
*
* (c) Copyright IBM Corp. 2005, 2020
*
* Derechos restringidos a los usuarios de gobierno de EE.UU. -
* Utilización, duplicación o divulgación restringida por el
* GSA ADP Schedule Contract con IBM Corp.
*/
package com.ibm.mq.explorer.tests.sample;
/**
* Prueba de ejemplo utilizada para comparar nombres de colas con convenios de denominación. Los
* nombres de colas se comprueban si comienzan con cualquiera de un rango establecido de
* prefijos, definido en esta clase. Los nombres que no comienzan con uno de los
* prefijos se generan en la salida como un error.
*
* Este ejemplo utiliza las clases PCF que proporciona el SupportPac MS0B. Descargue el SupportPac
* del sitio web de IBM y luego incluya el archivo jar en la vía de construcción del proyecto.
*/
public class WMQQueueNames extends WMQTest {
/** Mantener una cuenta del número de gestores de colas de los que se espera respuesta. */
private static int numberOfQmgrs = 0;
/** Almacena los prefijos de nombre de cola aceptados. */
private static final String[] ACCEPTED_Q_PREFIXES = {"SALES_", "MARKETING_", "SHIPPING_", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
"INCOMING_", "OUTGOING_"}; //$NON-NLS-1$//$NON-NLS-2$
/** Almacena la preferencia de usuario sobre si deben incluirse o no colas del sistema. */
boolean includeSystemObjs = false;
/**
* Inicia la prueba.
*
*
* @param callback manejador para el motor de pruebas que ejecuta la prueba
* @param guimonitor un manejador para el objeto que supervisa la prueba, que se proporciona
* para permitir que la prueba compruebe periódicamente si el usuario ha intentado cancelar
* la prueba en ejecución y proporcionar retroalimentación de usuario adicional
* @param contextObjects objetos MQExtObjects de contexto pasados al motor de pruebas
* @param treenodeId el ID de nodo de árbol utilizado para lanzar las pruebas
*/
public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
MQExtObject[] contextObjects, TreeNode treenodeId) {
// Empezar con la implementación predeterminada. Esto almacenará un
// manejador en el motor de pruebas que será necesario cuando queramos
// someter cualquier resultado al final de la prueba
super.runTest(callback, guimonitor, contextObjects, treenodeId);
// preparar espacio para almacenar los resultados que queramos devolver
ArrayList testResults = new ArrayList();
// obtener de las Preferencias si debemos incluir o no colas del sistema
includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();
// obtener una lista de gestores de colas de Explorer
ArrayList allQmgrs = new ArrayList();
for (int k = 0; k < contextObjects.length; k++) {
if (contextObjects[k] instanceof MQQmgrExtObject) {
// El objeto es un gestor de colas, añadirlo a la lista
allQmgrs.add(contextObjects[k]);
}
}
// ¿cuántos gestores de colas hay?
numberOfQmgrs = allQmgrs.size();
// utilizar el número de gestores de colas como guía para hacer un seguimiento del progreso
guimonitor.beginTask(getTestName(), numberOfQmgrs);
// para cada gestor de colas, someter una consulta
for (int i = 0; i < numberOfQmgrs; i++) {
// obtener el siguiente gestor de colas
MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);
// sólo someter consultas a gestores de colas conectados
if (nextQueueManager.isConnected()) {
// obtener el nombre del gestor de colas, para utilizarlo en la GUI
String qmgrName = nextQueueManager.getName();
// obtener un manejador para un objeto Java que representa el gestor de colas
MQQueueManager qmgr = nextQueueManager.getMQQueueManager();
try {
// obtener un agente de mensajes PCF para manejar el envío de la consulta PCF
PCFMessageAgent agent = new PCFMessageAgent(qmgr);
// utilizar PCF para someter una consulta 'inquire queue names'
PCFMessage response = submitQueueNamesQuery(qmgrName, agent);
// ¿hemos obtenido una respuesta a la consulta?
if (response != null) {
// obtener los nombres de colas de la respuesta
String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);
// comprobar cada nombre
for (int j = 0; j < qnames.length; j++) {
boolean qnameOkay = checkQueueName(qnames[j]);
if (!qnameOkay) {
// si se ha encontrado un problema con el nombre, generamos
// un mensaje de error y lo añadimos a la colección que
// se va a devolver
testResults.add(generateTestResult(qnames[j], qmgrName));
}
}
}
}
catch (MQException e) {
// anotar detalles de error
e.printStackTrace();
}
}
// se ha terminado de examinar un gestor de colas
guimonitor.worked(1);
}
// devolver todos los resultados que esta prueba ha generado
WMQTestResult[] finalresults = (WMQTestResult[]) testResults
.toArray(new WMQTestResult[testResults.size()]);
testComplete(finalresults);
}
/**
* Se utiliza internamente para someter una consulta PCF INQUIRE_Q_NAMES al gestor de colas especificado.
*
*
* @param qmgrName nombre del gestor de colas al que someter la consulta
* @param agent
* @devolver la respuesta PCF del gestor de colas
*/
private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {
// crear el mensaje pcf
PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$
try {
// enviar el mensaje
PCFMessage[] responseMsgs = agent.send(inquireQNames);
// comprobar si los resultados se han recibido satisfactoriamente
if (responseMsgs[0].getCompCode() == 0) {
return responseMsgs[0];
}
}
catch (IOException e) {
// anotar detalles de error
e.printStackTrace();
}
catch (MQException e) {
// anotar detalles de error
e.printStackTrace();
}
// por alguna razón no tenemos una respuesta, de modo que devolver null
return null;
}
/**
* Se utiliza internamente para comparar el nombre de cola dado con la colección de prefijos aceptables.
*
*
* @param queueName nombre de cola a comprobar
* @return true si el nombre de cola es correcto; de lo contrario, devolver false
*/
private boolean checkQueueName(String queueName) {
// si es un objeto del sistema (es decir, tiene un nombre que comienza con
// "SYSTEM."), comprobamos que
if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
if (!includeSystemObjs) {
// el usuario ha solicitado que no se incluyan objetos
// del sistema en la prueba, por lo que devolvemos true para
// evitar que se notifique cualquier problema para esta cola
return true;
}
}
// como la respuesta PCF rellenará con blancos el nombre de cola, lo recortamos ahora
queueName = queueName.trim();
// comparar el nombre de cola con cada uno de los prefijos aceptados
// uno por uno, y devolver true inmediatamente si cierto
for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
return true;
}
// hemos comparado con todos los prefijos aceptados, sin
// encontrar una coincidencia
return false;
}
/**
* Se utiliza internamente para generar un resultado de prueba para el nombre de cola especificado.
*
*
* @param queueName nombre de cola que no cumple los requisitos
* @param qmgrName nombre del gestor de colas que contiene la cola
* @return el resultado de prueba generado
*/
private WMQTestResult generateTestResult(String queueName, String qmgrName) {
String res = "La cola (" + queueName.trim() + ") no comienza con un prefijo conocido"; //$NON-NLS-1$//$NON-NLS-2$
return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
}
}