org.kapott.hbci.status.HBCIStatus Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hbci4j-adorsys Show documentation
Show all versions of hbci4j-adorsys Show documentation
HBCI4j - Home Banking Computer Interface for Java - Clone from https://github.com/hbci4j/hbci4java
/* $Id: HBCIStatus.java,v 1.1 2011/05/04 22:38:02 willuhn Exp $
This file is part of HBCI4Java
Copyright (C) 2001-2008 Stefan Palme
HBCI4Java is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
HBCI4Java is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.kapott.hbci.status;
import lombok.extern.slf4j.Slf4j;
import org.kapott.hbci.manager.HBCIUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Menge zusammengehöriger Status-Informationen. In Objekten dieser
* Klasse kann eine Menge von HBCI-Statuscodes sowie eine Menge von
* Exceptions gespeichert werden. Der Sinn dieser Klasse ist die
* Zusammenfassung von mehreren Status-Informationen, die logisch
* zusammengehören (z.B. alle Status-Informationen, die ein bestimmtes
* Nachrichtensegment betreffen).
*
* Objekte dieser Klasse werden beispielsweise in
* {@link org.kapott.hbci.status.HBCIMsgStatus} verwendet,
* um globale und segmentbezogene Status-Informationen voneinander getrennt
* zu sammeln.
*/
@Slf4j
public final class HBCIStatus {
/**
* Statuscode für "Gesamtstatus kann nicht ermittelt werden". (z.B. weil
* gar keine Informationen in diesem Objekt enthalten sind)
*/
public static final int STATUS_UNKNOWN = 1;
/**
* Statuscode für "es ist mindestens ein Fehlercode enthalten"
*/
public static final int STATUS_ERR = 2;
/**
* Statuscode für "alle Statusinformationen besagen OK"
*/
static final int STATUS_OK = 0;
private List retVals;
private List exceptions;
public HBCIStatus() {
retVals = new ArrayList<>();
exceptions = new ArrayList<>();
}
/**
* Wird von der HBCI4Java-Dialog-Engine aufgerufen
*/
void addException(Exception e) {
exceptions.add(e);
log.error(e.getMessage(), e);
}
/**
* Wird von der HBCI4Java-Dialog-Engine aufgerufen
*/
public void addRetVal(HBCIRetVal ret) {
retVals.add(ret);
if (ret.isError()) {
log.error("HBCI error code: " + ret.toString());
}
}
/**
* Gibt zurück, ob in diesem Status-Objekt Exceptions gespeichert sind
*
* @return true
, falls Exceptions gespeichert sind,
* sonst false
*/
boolean hasExceptions() {
return exceptions.size() != 0;
}
private boolean hasX(char code) {
boolean ret = false;
for (HBCIRetVal retVal : retVals) {
if (retVal.code.charAt(0) == code) {
ret = true;
break;
}
}
return ret;
}
/**
* Gibt zurück, ob in den Rückgabedaten in diesem Objekt Fehlermeldungen
* enthalten sind
*
* @return true
, falls Fehlermeldungen vorhanden sind,
* sonst false
*/
public boolean hasErrors() {
return hasX('9');
}
/**
* Gibt zurück, ob in den Rückgabedaten in diesem Objekt Warnungen
* enthalten sind
*
* @return true
, falls Warnungen vorhanden sind,
* sonst false
*/
private boolean hasWarnings() {
return hasX('3');
}
/**
* Gibt zurück, ob in den Rückgabedaten in diesem Objekt Erfolgsmeldungen
* enthalten sind
*
* @return true
, falls Erfolgsmeldungen vorhanden sind,
* sonst false
*/
private boolean hasSuccess() {
return hasX('0');
}
private List getX(char code) {
ArrayList hbciRetVals = new ArrayList<>();
for (HBCIRetVal retVal : retVals) {
if (retVal.code.charAt(0) == code) {
hbciRetVals.add(retVal);
}
}
return hbciRetVals;
}
/**
* Gibt die in diesem Status-Objekt gespeicherten Exceptions zurück
*
* @return Array mit Exceptions, die während der HBCI-Kommunikation
* aufgetreten sind.
*/
public Exception[] getExceptions() {
return exceptions.toArray(new Exception[0]);
}
/**
* Gibt alle in diesem Status-Objekt gespeicherten Rückgabewerte zurück
*
* @return Array mit HBCIRetVal
s, die während der HBCI-Kommunikation
* aufgetreten sind.
*/
public List getRetVals() {
return retVals;
}
/**
* Gibt die in diesem Objekt gespeicherten Fehlermeldungen zurück
*
* @return Array mit HBCI-Returncodes, die allesamt Fehlermeldungen beschreiben
*/
List getErrors() {
return getX('9');
}
/**
* Gibt die in diesem Objekt gespeicherten Warnungen zurück
*
* @return Array mit HBCI-Returncodes, die allesamt Warnmeldungen beschreiben
*/
public List getWarnings() {
return getX('3');
}
/**
* Gibt die in diesem Objekt gespeicherten Erfolgsmeldungen zurück
*
* @return Array mit HBCI-Returncodes, die allesamt Erfolgsmeldungen beschreiben
*/
private List getSuccess() {
return getX('0');
}
/**
* Gibt einen Code zurück, der den zusammengefassten Status aller in diesem
* Objekt gespeicherten Rückgabewerte beschreibt. Dafür gibt es folgende
* Möglichkeiten:
*
* STATUS_OK
wird zurückgegeben, wenn es keine Fehlermeldungen
* oder Exceptions gegeben hat und mindestens eine Erfolgsmeldung oder
* Warnung enthalten ist
* STATUS_ERR
wird zurückgegeben, wenn wenigstens eine
* Exception aufgetreten ist oder wenigstens eine Fehlermeldung enthalten
* ist.
* STATUS_UNKNOWN
wird zurückgegeben, wenn keine der beiden
* o.g. Bedingungen zutrifft.
*
*
* @return einen Code, der den zusammengefassten Status aller Rückgabewerte
* beschreibt.
*/
public int getStatusCode() {
int code;
/* TODO: eine Exception als Fehler einzustufen ist gefaehrlich: wenn
* ein GV bei einer Bank eingereicht wird und von der Bank erfolgreich
* verarbeitet wird, beim Entgegennehmen der Antwort-Nachricht jedoch
* eine Exception auftritt, sieht der Job aus wie "fehlgeschlagen" -
* dabei ist nur das Parsen der Erfolgsnachricht fehlgeschlagen */
if (hasExceptions() || hasErrors()) {
code = STATUS_ERR;
} else if (hasSuccess() || hasWarnings()) {
code = STATUS_OK;
} else {
code = STATUS_UNKNOWN;
}
return code;
}
/**
* Gibt true
zurück, wenn keine Fehlermeldungen bzw. Exceptions
* aufgetreten sind und wenigstens eine Successmeldung oder Warnung enthalten
* ist
*/
public boolean isOK() {
return getStatusCode() == STATUS_OK;
}
/**
* Gibt einen String zurück, der alle Fehlermeldungen der hier enthaltenen
* Rückgabewerte im Klartext enthält. Für evtl. enthaltene Exception wird
* die entsprechende Beschreibung in Kurz (siehe
* {@link org.kapott.hbci.manager.HBCIUtils#exception2StringShort(Exception)})
* benutzt.
*
* @return String mit allen Fehlermeldungen
*/
public List getErrorList() {
List ret = new ArrayList<>();
if (hasExceptions()) {
for (Exception ex : exceptions) {
ret.add(HBCIUtils.exception2StringShort(ex));
}
}
if (hasErrors()) {
for (HBCIRetVal hbciRetVal : getErrors()) {
ret.add(hbciRetVal.toString());
}
}
return ret;
}
public List getWarningsList() {
List ret = new ArrayList<>();
if (hasWarnings()) {
for (HBCIRetVal hbciRetVal : getWarnings()) {
ret.add(hbciRetVal.toString());
}
}
return ret;
}
/**
* Gibt die Status-Informationen aller enthaltenen Exceptions und
* HBCI-Rückgabewerte als ein String zurück.
*
* @return String mit allen gespeicherten Status-Informationen
*/
public String toString() {
StringBuilder ret = new StringBuilder();
for (Exception ex : exceptions) {
ret.append(HBCIUtils.exception2StringShort(ex));
ret.append(System.getProperty("line.separator"));
}
for (HBCIRetVal hbciRetVal : getErrors()) {
ret.append(hbciRetVal.toString());
ret.append(System.getProperty("line.separator"));
}
for (HBCIRetVal hbciRetVal : getWarnings()) {
ret.append(hbciRetVal.toString());
ret.append(System.getProperty("line.separator"));
}
for (HBCIRetVal hbciRetVal : getSuccess()) {
ret.append(hbciRetVal.toString());
ret.append(System.getProperty("line.separator"));
}
return ret.toString().trim();
}
}