Gravando seus Próprios Testes: Amostra 2
O código-fonte a seguir é o exemplo de um teste que verifica os nomes de filas em relação a uma convenção de nomenclatura definida. Se forem encontradas filas com nomes que não atendam à convenção de nomenclatura definida, os detalhes serão exibidos na visualização Resultados do Teste.
/*
* Licensed Materials - Property of IBM
*
* 5724-H72, 5655-L82, 5724-L26, 5655R3600
*
* (c) Copyright IBM Corp. 2005, 2020
*
* Direitos Restritos para Usuários do Governo dos Estados Unidos - Uso, duplicação ou
* divulgação restritos pelo documento GSA ADP Schedule Contract com a IBM Corp.
*/
package com.ibm.mq.explorer.tests.sample;
/**
* Um teste de amostra utilizado para verificar Nomes de Filas em relação a convenções de nomenclatura. Os nomes de filas serão verificados
* para saber se começam com algum de um intervalo de prefixos configurados definidos nesta classe. Os nomes que não
* iniciarem com um dos prefixos serão informados como erro.
*
* Este exemplo utiliza as classes PCF fornecidas pelo MS0B SupportPac. Faça download do SupportPac a partir do
* Web site da IBM e, em seguida, inclua o arquivo jar no caminho de construção do projeto.
*/
public class WMQQueueNames extends WMQTest {
/** Manter uma contagem de quantos gerenciadores de filas estamos aguardando respostas. */
private static int numberOfQmgrs = 0;
/** Armazena os prefixos de nomes de filas aceitos. */
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$
/** Armazena a preferência do usuário sobre a inclusão de filas do sistema. */
boolean includeSystemObjs = false;
/**
* Inicia o teste.
*
*
* @param callback - identificador para o mecanismo de teste que está executando o teste
* @param guimonitor - um identificador para o objeto que está monitorando o teste, fornecido para que o teste
* verifique periodicamente se o usuário tentou cancelar a execução do teste e fornecer feedback adicional do
* usuário
* @param contextObjects - context MQExtObjects transmitidos ao mecanismo de teste
* @param treenodeId - o treenodeid utilizado para ativar os testes
*/
public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
MQExtObject[] contextObjects, TreeNode treenodeId) {
// Iniciar com a implementação padrão. Isso armazenará um identificador
// no mecanismo de teste que será necessário quando quisermos submeter
// os resultados no final do teste
super.runTest(callback, guimonitor, contextObjects, treenodeId);
// Preparar espaço para armazenamento de resultados que possamos querer retornar
ArrayList testResults = new ArrayList();
// Obter de Preferências se é necessário incluir filas de sistemas
includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();
// Obter uma lista de gerenciadores de filas do Explorer
ArrayList allQmgrs = new ArrayList();
for (int k = 0; k < contextObjects.length; k++) {
if (contextObjects[k] instanceof MQQmgrExtObject) {
// O objeto é um gerenciador de filas, incluir na lista
allQmgrs.add(contextObjects[k]);
}
}
// Quantos gerenciadores de filas existem?
numberOfQmgrs = allQmgrs.size();
// Utilizar o número de gerenciadores de filas como guia para rastrear o progresso
guimonitor.beginTask(getTestName(), numberOfQmgrs);
// Para cada gerenciador de filas, submeter uma consulta
for (int i = 0; i < numberOfQmgrs; i++) {
// Obter o próximo gerenciador de filas
MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);
// Somente submeter consultas a gerenciadores de filas conectados
if (nextQueueManager.isConnected()) {
// Obter o nome do gerenciador de filas para ser utilizado na GUI
String qmgrName = nextQueueManager.getName();
// Configurar um identificador para um objeto Java que representa o gerenciador de filas
MQQueueManager qmgr = nextQueueManager.getMQQueueManager();
try {
// Obter um agente de mensagem PCF para tratar do envio da consulta PCF para
PCFMessageAgent agent = new PCFMessageAgent(qmgr);
// Utilizar o PCF para submeter uma consulta 'consultar nomes de filas'
PCFMessage response = submitQueueNamesQuery(qmgrName, agent);
// Conseguimos uma resposta para a consulta?
if (response != null) {
// Obter os nomes de filas na resposta
String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);
// Verificar cada nome
for (int j = 0; j < qnames.length; j++) {
boolean qnameOkay = checkQueueName(qnames[j]);
if (!qnameOkay) {
// Se tiver sido encontrado algum problema com o nome, geraremos uma
// mensagem de erro e a incluiremos na coleta a ser
// retornada
testResults.add(generateTestResult(qnames[j], qmgrName));
}
}
}
}
catch (MQException e) {
// Registrar detalhes do erro
e.printStackTrace();
}
}
// Concluída a investigação de um gerenciador de filas
guimonitor.worked(1);
}
// Retornar os resultados gerados por este teste
WMQTestResult[] finalresults = (WMQTestResult[]) testResults
.toArray(new WMQTestResult[testResults.size()]);
testComplete(finalresults);
}
/**
* Utilizado internamente para submeter uma consulta INQUIRE_Q_NAMES utilizando o PCF para o gerenciador de filas fornecido.
*
*
* @param qmgrName - nome do gerenciador de filas ao qual submeter a consulta
* @param agent
* @return a resposta de PCF do gerenciador de filas
*/
private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {
// Construir a mensagem do pcf
PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$
try {
// Enviar a mensagem
PCFMessage[] responseMsgs = agent.send(inquireQNames);
// Verificar se os resultados foram recebidos com êxito
if (responseMsgs[0].getCompCode() == 0) {
return responseMsgs[0];
}
}
catch (IOException e) {
// Registrar detalhes do erro
e.printStackTrace();
}
catch (MQException e) {
// Registrar detalhes do erro
e.printStackTrace();
}
// Por algum motivo, não obtivemos a resposta, portanto, retornamos nulo
return null;
}
/**
* Utilizado internamente para verificar o nome de fila fornecido em relação à coleta de prefixos aceitáveis.
*
*
* @param queueName - nome da fila a ser verificado
* @return true, se o nome da fila for adequado, false, caso contrário
*/
private boolean checkQueueName(String queueName) {
// Se este for um objeto de sistema (isto é, tem um nome que começa com
// "SYSTEM."), verificaremos
if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
if (!includeSystemObjs) {
// O usuário solicitou para não incluirmos objetos de
// sistema no teste, portanto, retornaremos true para
// evitar problemas que estão sendo relatados para esta fila
return true;
}
}
// A resposta do PCF preencherá o nome da fila com espaços em branco, portanto, faremos o ajuste agora
queueName = queueName.trim();
// Verificar o nome da fila em relação a cada um dos prefixos aceitáveis
// sucessivamente, retornando true imediatamente se for
for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
return true;
}
// Verificamos em relação a todos os prefixos aceitos, sem
// localizar uma correspondência
return false;
}
/**
* Utilizado internamente para gerar um resultado de teste para o nome de fila fornecido.
*
*
* @param queueName - nome da fila que não atende aos requisitos
* @param qmgrName - nome do gerenciador de filas que hospeda a fila
* @return - o resultado de teste gerado
*/
private WMQTestResult generateTestResult(String queueName, String qmgrName) {
String res = "A fila (" + queueName.trim() + ") não começa com um prefixo conhecido"; //$NON-NLS-1$//$NON-NLS-2$
return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
}
}