Saját tesztek írása: 2. minta

Az alábbi forráskód egy olyan teszt mintája, amely sorneveket ellenőriz megadott elnevezési megállapodások alapján. Ha a rendszer olyan sort talál, amelynek neve nem felel meg a megadott elnevezési megállapodásnak, akkor a részletek megjelennek a Teszteredmények nézetben.


/*                                                    
 * Engedélyköteles anyagok - Az IBM tulajdona
 *  
 * 5724-H72, 5655-L82, 5724-L26, 5655R3600
 * 
 * (c) Copyright IBM Corp. 2005, 2020
 * 
 * USA kormányzati felhasználók korlátozott jogai - A használatot,
 * másolást vagy közlést az IBM Corporation-nel kötött GSA ADP Schedule szerződés szabályozza.
 */
package com.ibm.mq.explorer.tests.sample;

/**
 * Mintateszt a Sornevek ellenőrzéséhez az elnevezési megállapodások alapján. A sornevek ellenőrzésre kerülnek, hogy
 * egy beállított előtag-tartomány valamelyikével kezdődnek-e, amely ebben az osztályban került meghatározásra. Az olyan nevek,
 * amelyek nem egy megadott előtaggal kezdődnek, kimenetre kerülnek egy hibában.
 *
 * Ez a példa az MS0B SupportPac által biztosított PCF osztályokat használja. Töltse le a SupportPac csomagot
 * az IBM webhelyéről, majd foglalja bele a jar fájlt a projekt összeállítási útvonalába.
 */
public class WMQQueueNames extends WMQTest {

  /** Egy szám fenntartása, hogy hány sorkezelőtől várunk választ. */
  private static int numberOfQmgrs = 0;

  /** Az elfogadott sornév előtagok tárolása. */
  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$

  /** A felhasználó beállítását tárolja, hogy tartalmazza-e a rendszersorokat. */
  boolean includeSystemObjs = false;

  /**
   * A teszt elindítása.
   * 
   * 
   * @param callback azonosító a tesztet futtató teszt alrendszerhez
   * @param guimonitor azonosító a tesztet megfigyelő objektumhoz, amely azt biztosítja, hogy a teszt
   * rendszeres időközönként ellenőrizhesse, hogy a felhasználó megpróbálta-e visszavonni a teszt
   * futását, valamint kiegészítő felhasználói visszajelzést biztosít
   * @param contextObjects a teszt alrendszernek átadott MQExtObjects kontextus
   * @param treenodeId a tesztek elindítására használt fa csomópont azonosító
   */
  public void runTest(WMQTestEngine callback, IProgressMonitor guimonitor,
      MQExtObject[] contextObjects, TreeNode treenodeId) {

    // elindítás az alapértelmezett megvalósítással. Ez egy azonosítót tárol
    // a teszt alrendszer számára, amelyre akkor lesz szükség, amikor
    // bármely eredményt el szeretnénk küldeni a teszt végén
    super.runTest(callback, guimonitor, contextObjects, treenodeId);

    // terület előkészítése az eredmények tárolásához, amelyeket vissza kíván küldeni
    ArrayList testResults = new ArrayList();

    // kiolvasás a Beállításokból, hogy tartalmazzon-e rendszersorokat
    includeSystemObjs = PreferenceStoreManager.getIncludeSysObjsPreference();

    // sorkezelők listájának megszerzése az Explorer programból
    ArrayList allQmgrs = new ArrayList();

    for (int k = 0; k < contextObjects.length; k++) {
      if (contextObjects[k] instanceof MQQmgrExtObject) {
        // Az objektum egy sorkezelő, adja hozzá a listához
        allQmgrs.add(contextObjects[k]);
      }
    }

    // mennyi sorkezelő van ott?
    numberOfQmgrs = allQmgrs.size();

    // a sorkezelők számának használata útmutatóként a folyamat nyomon követéséhez
    guimonitor.beginTask(getTestName(), numberOfQmgrs);

    // minden sorkezelő számára egy lekérdezés elküldése
    for (int i = 0; i < numberOfQmgrs; i++) {

      // következő sorkezelő kiolvasása
      MQQmgrExtObject nextQueueManager = (MQQmgrExtObject) allQmgrs.get(i);

      // lekérdezések elküldése csak a csatlakoztatott sorkezelők számára
      if (nextQueueManager.isConnected()) {

        // a sorkezelő nevének beszerzése, a grafikus felületen történő használathoz
        String qmgrName = nextQueueManager.getName();

        // azonosító beszerzése a sorkezelőt képviselő Java objektumhoz
        MQQueueManager qmgr = nextQueueManager.getMQQueueManager();

        try {
          // egy PCF üzenetügynök lekérése a PCF érdeklődés elküldésének kezeléséhez
          PCFMessageAgent agent = new PCFMessageAgent(qmgr);

          // PCF használata egy 'sornevek érdeklődése' lekérdezés elküldéséhez
          PCFMessage response = submitQueueNamesQuery(qmgrName, agent);

          // kaptunk választ a lekérdezésre?
          if (response != null) {
            // a sornevek kiolvasása a válaszból
            String[] qnames = (String[]) response.getParameterValue(CMQCFC.MQCACF_Q_NAMES);

            // minden név ellenőrzése
            for (int j = 0; j < qnames.length; j++) {
              boolean qnameOkay = checkQueueName(qnames[j]);

              if (!qnameOkay) {
                // ha a rendszer problémát talált a névnél, akkor előállítunk
                //  egy hibaüzenetet, és hozzáadjuk a visszaküldendő
                //  gyűjteményhez
                testResults.add(generateTestResult(qnames[j], qmgrName));
              }
            }
          }
        }
        catch (MQException e) {
          // hibarészletek feljegyzése
          e.printStackTrace();
        }
      }

      // sorkezelő megvizsgálása befejeződött
      guimonitor.worked(1);
    }

    // a teszt által előállított eredményeket adja vissza
    WMQTestResult[] finalresults = (WMQTestResult[]) testResults
        .toArray(new WMQTestResult[testResults.size()]);
    testComplete(finalresults);
  }

  /**
   * Belső használatra egy INQUIRE_Q_NAMES lekérdezés elküldéséhez PCF használatával az adott sorkezelőhöz.
   * 
   * 
   * @param qmgrName a sorkezelő neve, amelyhez el kell küldeni a lekérdezést
   * @param agent
   * @visszaadja a PCF választ a sorkezelőtől
   */
  private PCFMessage submitQueueNamesQuery(String qmgrName, PCFMessageAgent agent) {

    // pcf üzenet összeállítása
    PCFMessage inquireQNames = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
    inquireQNames.addParameter(CMQC.MQCA_Q_NAME, "*"); //$NON-NLS-1$

    try {
      // üzenet elküldése
      PCFMessage[] responseMsgs = agent.send(inquireQNames);

      // eredmények sikeres fogadásának ellenőrzése
      if (responseMsgs[0].getCompCode() == 0) {
        return responseMsgs[0];
      }
    }
    catch (IOException e) {
      // hibarészletek feljegyzése
      e.printStackTrace();

    }
    catch (MQException e) {
      // hibarészletek feljegyzése
      e.printStackTrace();
    }

    // valamilyen okból nem kaptunk választ, ezért visszatérés a nullértékhez
    return null;
  }

  /**
   * Belső használatra az adott sor nevének ellenőrzéséhez az elfogadható előtagok gyűjteménye alapján.
   * 
   * 
   * @param queueName ellenőrizendő sor neve
   * @return ha a sor neve rendben van: true, ellenkező esetben: false
   */
  private boolean checkQueueName(String queueName) {

    // ha ez egy rendszerobjektum (például a neve
    //   "SYSTEM." kifejezéssel kezdődik), akkor ellenőrizzük a következőt:
    if ((queueName.startsWith("SYSTEM.")) || (queueName.startsWith("AMQ."))) { //$NON-NLS-1$//$NON-NLS-2$
      if (!includeSystemObjs) {
        // a felhasználó azt kérte, hogy rendszerobjektumok
        //  ne legyenek belefoglalva a tesztbe, ezért true értéket küldünk vissza,
        //  hogy erről a sorról ne kerüljön jelentésre probléma
        return true;
      }
    }

    // a PCF válasz üres karakterekkel fogja kitölteni a sor nevét, ezért most rövidre vágjuk
    queueName = queueName.trim();

    // sor nevének ellenőrzése az elfogadható előtagokhoz képest
    // és true érték visszaadása azonnal, ha talál egyezést
    for (int i = 0; i < ACCEPTED_Q_PREFIXES.length; i++) {
      if (queueName.startsWith(ACCEPTED_Q_PREFIXES[i]))
        return true;
    }

    // minden elfogadott előtagot ellenőriztünk,
    //  de nem találtunk egyezést
    return false;
  }

  /**
   * Belső használatra egy teszteredmény előállításához az adott sornév számára.
   *
   * 
   * @param queueName a követelményeknek nem megfelelő sornév
   * @param qmgrName a sort tartalmazó sorkezelő neve
   * @return az előállított teszteredmény
   */
  private WMQTestResult generateTestResult(String queueName, String qmgrName) {
    String res = "Queue (" + queueName.trim() + ") does not begin with a known prefix"; //$NON-NLS-1$//$NON-NLS-2$

    return new WMQTestResult(IMarker.SEVERITY_ERROR, res, qmgrName, getTestSubCategory());
  }
}