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