/* $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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.kapott.hbci.manager.HBCIUtils;
/** <p>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).
</p><p>
Objekte dieser Klasse werden beispielsweise in
{@link org.kapott.hbci.status.HBCIMsgStatus} verwendet,
um globale und segmentbezogene Status-Informationen voneinander getrennt
zu sammeln. </p>*/
public final class HBCIStatus
{
/** Statuscode f�r "alle Statusinformationen besagen OK" */
public static final int STATUS_OK=0;
/** 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;
private List<HBCIRetVal> retVals;
private List<Exception> exceptions;
public HBCIStatus()
{
retVals=new ArrayList<HBCIRetVal>();
exceptions=new ArrayList<Exception>();
}
/** Wird von der <em>HBCI4Java</em>-Dialog-Engine aufgerufen */
public void addException(Exception e)
{
exceptions.add(e);
HBCIUtils.log(e);
}
/** Wird von der <em>HBCI4Java</em>-Dialog-Engine aufgerufen */
public void addRetVal(HBCIRetVal ret)
{
retVals.add(ret);
if (ret.isError()) {
HBCIUtils.log("HBCI error code: "+ret.toString(), HBCIUtils.LOG_ERR);
}
}
/** Gibt zur�ck, ob in diesem Status-Objekt Exceptions gespeichert sind
@return <code>true</code>, falls Exceptions gespeichert sind,
sonst <code>false</code>*/
public boolean hasExceptions()
{
return exceptions.size()!=0;
}
private boolean hasX(char code)
{
boolean ret=false;
for (Iterator<HBCIRetVal> i=retVals.iterator(); i.hasNext();) {
HBCIRetVal retVal= i.next();
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 <code>true</code>, falls Fehlermeldungen vorhanden sind,
sonst <code>false</code>*/
public boolean hasErrors()
{
return hasX('9');
}
/** Gibt zur�ck, ob in den R�ckgabedaten in diesem Objekt Warnungen
enthalten sind
@return <code>true</code>, falls Warnungen vorhanden sind,
sonst <code>false</code>*/
public boolean hasWarnings()
{
return hasX('3');
}
/** Gibt zur�ck, ob in den R�ckgabedaten in diesem Objekt Erfolgsmeldungen
enthalten sind
@return <code>true</code>, falls Erfolgsmeldungen vorhanden sind,
sonst <code>false</code>*/
public boolean hasSuccess()
{
return hasX('0');
}
private HBCIRetVal[] getX(char code)
{
ArrayList<HBCIRetVal> ret_a=new ArrayList<HBCIRetVal>();
for (Iterator<HBCIRetVal> i=retVals.iterator(); i.hasNext();) {
HBCIRetVal retVal= i.next();
if (retVal.code.charAt(0)==code) {
ret_a.add(retVal);
}
}
HBCIRetVal[] ret=new HBCIRetVal[0];
if (ret_a.size()!=0) {
ret=ret_a.toArray(ret);
}
return ret;
}
/** 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[exceptions.size()]);
}
/** Gibt alle in diesem Status-Objekt gespeicherten R�ckgabewerte zur�ck
@return Array mit <code>HBCIRetVal</code>s, die w�hrend der HBCI-Kommunikation
aufgetreten sind. */
public HBCIRetVal[] getRetVals()
{
return retVals.toArray(new HBCIRetVal[retVals.size()]);
}
/** Gibt die in diesem Objekt gespeicherten Fehlermeldungen zur�ck
@return Array mit HBCI-Returncodes, die allesamt Fehlermeldungen beschreiben */
public HBCIRetVal[] getErrors()
{
return getX('9');
}
/** Gibt die in diesem Objekt gespeicherten Warnungen zur�ck
@return Array mit HBCI-Returncodes, die allesamt Warnmeldungen beschreiben */
public HBCIRetVal[] getWarnings()
{
return getX('3');
}
/** Gibt die in diesem Objekt gespeicherten Erfolgsmeldungen zur�ck
@return Array mit HBCI-Returncodes, die allesamt Erfolgsmeldungen beschreiben */
public HBCIRetVal[] 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:
<ul>
<li><code>STATUS_OK</code> wird zur�ckgegeben, wenn es keine Fehlermeldungen
oder Exceptions gegeben hat und mindestens eine Erfolgsmeldung oder
Warnung enthalten ist</li>
<li><code>STATUS_ERR</code> wird zur�ckgegeben, wenn wenigstens eine
Exception aufgetreten ist oder wenigstens eine Fehlermeldung enthalten
ist.</li>
<li><code>STATUS_UNKNOWN</code> wird zur�ckgegeben, wenn keine der beiden
o.g. Bedingungen zutrifft.</li>
</ul>
@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 <code>true</code> 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 String getErrorString()
{
StringBuffer ret=new StringBuffer();
if (hasExceptions()) {
for (Iterator<Exception> i = exceptions.iterator(); i.hasNext();) {
Exception ex = i.next();
ret.append(HBCIUtils.exception2StringShort(ex));
ret.append(System.getProperty("line.separator"));
}
}
if (hasErrors()) {
HBCIRetVal[] errList=getErrors();
for (int i=0;i<errList.length;i++) {
ret.append(errList[i].toString());
ret.append(System.getProperty("line.separator"));
}
}
return ret.toString().trim();
}
/** 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()
{
StringBuffer ret=new StringBuffer();
for (Iterator<Exception> i = exceptions.iterator(); i.hasNext();) {
Exception ex = i.next();
ret.append(HBCIUtils.exception2StringShort(ex));
ret.append(System.getProperty("line.separator"));
}
HBCIRetVal[] errList=getErrors();
for (int i=0;i<errList.length;i++) {
ret.append(errList[i].toString());
ret.append(System.getProperty("line.separator"));
}
HBCIRetVal[] warnList=getWarnings();
for (int i=0;i<warnList.length;i++) {
ret.append(warnList[i].toString());
ret.append(System.getProperty("line.separator"));
}
HBCIRetVal[] succList=getSuccess();
for (int i=0;i<succList.length;i++) {
ret.append(succList[i].toString());
ret.append(System.getProperty("line.separator"));
}
return ret.toString().trim();
}
}