All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.bund.bva.isyfact.batchrahmen.test.BatchProtokollTester Maven / Gradle / Ivy

There is a newer version: 3.2.1
Show newest version
/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 * The Federal Office of Administration (Bundesverwaltungsamt, BVA)
 * licenses this file to you under the Apache License, Version 2.0 (the
 * License). You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package de.bund.bva.isyfact.batchrahmen.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * Helper-Klasse um Protokoll-Dateien zu parsen und auf bestimmte Kriterien und Fehlerkennungen hin zu prüfen.
 * Stellt Funktionen bereit um Batchprotokolle auf Fehlerfreiheit oder das Vorkommen von bestimmenten Fehlern
 * zu prüfen. Daneben können Statistikwerte abgefragt werden.
 * 
 * 
 */
public class BatchProtokollTester {

    /** Das BatchProtokoll Document. **/
    private Document batchProtokoll;

    /** Das XPath-Object. **/
    private XPath xpath;

    /**
     * Konstruktor. Parst die Eingabe-Datei.
     * @param ergebnisDatei
     *            Das zu überprüfende Batchprotokoll.
     */
    public BatchProtokollTester(String ergebnisDatei) {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);
        DocumentBuilder builder;
        try {
            builder = docFactory.newDocumentBuilder();
            batchProtokoll = builder.parse(ergebnisDatei);

            XPathFactory xpathFactory = XPathFactory.newInstance();
            xpath = xpathFactory.newXPath();
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Überprüft ob das Batchprotokoll mindestens eine Meldung mit der angegebenen ID enthält.
     * @param id
     *            Die gesucht MeldungsID
     * @return true/false
     */
    public boolean enthaeltMeldungsId(String id) {
        String xpathQuery = "//Meldung[@ID='" + id + "']";
        return getNodeListFromXpath(xpathQuery).getLength() != 0;
    }

    /**
     * Liefert zurück ob das Batchprotokoll Fehler enthält.
     * @return true/false
     */
    public boolean isFehlerfrei() {
        String xpathQuery = "//Meldung[@Typ='F']";
        return getNodeListFromXpath(xpathQuery).getLength() == 0;
    }

    /**
     * Liefert zurück ob die übergebene FehlerID min. einmal im Protokoll vorkommt.
     * @param fehlerId
     *            Die gesuchte FehlerId
     * @return true/false
     */
    public boolean enthaeltFehler(String fehlerId) {
        String xpathQuery = "//Meldung[@Typ='F' and @ID='" + fehlerId + "']";
        return getNodeListFromXpath(xpathQuery).getLength() != 0;
    }

    /**
     * Liefert zurück ob ein Fehler mit der angegebenen ID im Protokoll vorkommt, dessen Fehlertext den
     * gesuchten Wortteil enthält. Nützlich um parametrisierte Fehlermeldungen auf Ausprägungen zu überprüfen.
     * 
     * @param fehlerId
     *            FehlerID des gesuchten Fehlers
     * @param textTeil
     *            Der gesuchte Text im Fehlertext
     * @return true/false
     */
    public boolean enthaeltFehler(String fehlerId, String textTeil) {
        String xpathQuery = "//Meldung[@Typ='F' and @ID='" + fehlerId + "' and contains(@Text, '" + textTeil + "')]";
        return getNodeListFromXpath(xpathQuery).getLength() != 0;
    }

    /**
     * Liefert alle FehlerIDs zurück (inklusive Duplikaten).
     * @return Liste der FehlerIDs als Strings.
     */
    public Collection getFehlerIds() {
        ArrayList fehlerListe = new ArrayList<>();
        String xpathQuery = "//Meldung[@Typ='F']";
        if (getNodeListFromXpath(xpathQuery).getLength() != 0) {
            NodeList nodes = getNodeListFromXpath(xpathQuery);
            for (int i = 0; i < nodes.getLength(); i++) {
                NamedNodeMap attributMap = nodes.item(i).getAttributes();
                fehlerListe.add(attributMap.getNamedItem("ID").getNodeValue());
            }
        }
        return fehlerListe;
    }

    /**
     * Liefert alle eindeutigen FehlerIDs zurück (ohne Duplikate).
     * @return Menge der eindeutigen FehlerIDs
     */
    public Set getFehlerIdsEindeutig() {
        HashSet fehlerIdsEindeutig = new HashSet<>();
        for (String fehlerId : getFehlerIds()) {
            if (!fehlerIdsEindeutig.contains(fehlerId)) {
                fehlerIdsEindeutig.add(fehlerId);
            }
        }
        return fehlerIdsEindeutig;
    }

    /**
     * Überprüft ob das Batchprotokoll ausgibt, dass der Batch im Restart-Modus gestartet wurde.
     * @return true wenn der Batch im Modus Restart gestartet wurde, ansonsten false
     * 
     */
    public boolean isStartmodusRestart() {
        String xpathQuery = "//Meldung[@ID='RESTART']";
        return getNodeListFromXpath(xpathQuery).getLength() != 0;
    }

    /**
     * Liefert die Anzahl Fehler zurück.
     * @return Anzahl Fehler.
     */
    public int getAnzahlFehler() {
        return getFehlerIds().size();
    }

    /**
     * Liefert die Anzahl Fehler zurück.
     * @param id
     *            Die ID des gesuchten Fehlers.
     * @return Anzahl Fehler.
     */
    public int getAnzahlFehler(String id) {
        String xpathQuery = "//Meldung[@Typ='F' and @ID='" + id + "']";
        return getNodeListFromXpath(xpathQuery).getLength();
    }

    /**
     * Liefert die Anzahl der eindeutigen FehlerIDs zurück.
     * @return Anzahl Fehler ohne Duplikate
     */
    public int getAnzahlFehlerEindeutig() {
        return getFehlerIdsEindeutig().size();
    }

    /**
     * Liest einen Statistikwert aus dem Protokoll.
     * @param id
     *            Die ID des Statistik-Eintrags.
     * @return Wert des Statistikeintrags. -1 wenn der Statistikeintrag unbekannt ist.
     */
    public int getStatistikwert(String id) {
        String xpathQuery = "//Statistik-Eintrag[@ID='" + id + "']";
        if (getNodeListFromXpath(xpathQuery).getLength() != 1) {
            return -1;
        } else {
            NodeList nodes = getNodeListFromXpath(xpathQuery);
            NamedNodeMap attributMap = nodes.item(0).getAttributes();
            return Integer.parseInt(attributMap.getNamedItem("Wert").getNodeValue());
        }
    }

    /**
     * Führt einen XPath-Query auf dem Protokoll aus und liefert die Ergebnisse als NodeList zurück.
     * @param xpathQuery
     *            Der auszuführende XPath-Query.
     * @return Die NodeList der Ergebnisse
     */
    public NodeList getNodeListFromXpath(String xpathQuery) {
        try {
            XPathExpression expr = xpath.compile(xpathQuery);
            return (NodeList) expr.evaluate(batchProtokoll, XPathConstants.NODESET);
        } catch (XPathExpressionException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Liefert das Feld 'xpath' zurück.
     * @return Wert von xpath
     */
    public XPath getXpath() {
        return xpath;
    }

    /**
     * Setzt das Feld 'xpath'.
     * @param xpath
     *            Neuer Wert für xpath
     */
    public void setXpath(XPath xpath) {
        this.xpath = xpath;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy