/* $Id: HBCIMsgStatus.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.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.kapott.hbci.manager.HBCIUtilsInternal;
/** <p>Enth�lt alle Status-Informationen zu genau einem Nachrichtenaustausch.
Es ist zu beachten, dass in einer Nachricht Informationen zu
<em>mehreren</em> Gesch�ftsvorf�llen enthalten sein k�nnen, wenn die
gesendete Nachricht mehrere Auftr�ge enthalten hat.
</p><p>
Die direkte Auswertung
der Felder dieser Klasse wird nicht empfohlen, statt dessen sollten nur
die Methoden benutzt werden, die den prinzipiellen Status (OK oder nicht OK)
sowie die eigentlichen Fehler-Informationen zur�ckgeben. </p>*/
public final class HBCIMsgStatus
{
/** Globale Status-Informationen. Das sind Informationen, die die
Nachricht als ganzes betreffen (z.B. wenn die Nachricht nicht signiert
oder verschl�sselt war, oder wenn sie nicht dekodiert werden konnte etc.) */
public HBCIStatus globStatus;
/** Status-Informationen, die einzelne Segmente der Nachricht betreffen.
Hier werden alle R�ckgabecodes gespeichert, die sich konkret auf
einzelne Segmente der gesendeten Nachricht beziehen. */
public HBCIStatus segStatus;
private Properties data;
public HBCIMsgStatus()
{
this.globStatus=new HBCIStatus();
this.segStatus=new HBCIStatus();
this.data=new Properties();
}
/** Wird von der <em>HBCI4Java</em>-Dialog-Engine aufgerufen */
public void addException(Exception e)
{
globStatus.addException(e);
}
/** Wird von der <em>HBCI4Java</em>-Dialog-Engine aufgerufen */
public void setData(Properties data)
{
this.data=data;
extractStatusData();
}
/** Wird von der <em>HBCI4Java</em>-Dialog-Engine aufgerufen */
public void addData(Properties _data)
{
this.data.putAll(_data);
extractStatusData();
}
private void extractStatusData()
{
this.globStatus=new HBCIStatus();
this.segStatus=new HBCIStatus();
// globale return-codes extrahieren
for (int i=0;true;i++) {
HBCIRetVal rv=null;
try {
rv=new HBCIRetVal(data,
HBCIUtilsInternal.withCounter("RetGlob.RetVal",i));
} catch (Exception e) {
break;
}
globStatus.addRetVal(rv);
}
// segment-codes extrahieren
for (int i=0;true;i++) {
String segheader=HBCIUtilsInternal.withCounter("RetSeg",i);
String segref=data.getProperty(segheader+".SegHead.ref");
if (segref==null) {
break;
}
for (int j=0;true;j++) {
HBCIRetVal rv=null;
try {
rv=new HBCIRetVal(data,
HBCIUtilsInternal.withCounter(segheader+".RetVal",j),
segref);
} catch (Exception e) {
break;
}
segStatus.addRetVal(rv);
}
}
}
/** <p>Gibt den eigentlichen Inhalt sowohl der gesendeten wie auch der
empfangenen Nachricht zur�ck. Die <em>keys</em> des Property-Objektes
enthalten die Lowlevelnamen der Datenelemente, die dazugeh�rigen
<em>values</em> enthalten jeweils den Wert des entsprechenden Datenelementes.
Die Bezeichnungen der Datenelemente der <em>gesendeten</em> Nachricht tragen
zur Unterscheidung mit den Datenelementen der empfangenen Nachricht das
Prefix "<code>orig_</code>".</p> */
public Properties getData()
{
return data;
}
/** Gibt zur�ck, ob bei der Ausf�hrung eines Nachrichtenaustauschs Exceptions
aufgetreten sind. Diese Exceptions k�nnen entweder beim Erzeugen bzw.
Versenden der Kundennachricht oder aber beim Empfangen und Auswerten
der Institutsnachricht aufgetreten sein.
@return <code>true</code>, wenn Exceptions aufgetreten sind, sonst
<code>false</code>*/
public boolean hasExceptions()
{
return globStatus.hasExceptions();
}
/** Gibt die Exceptions zur�ck, ob bei der Ausf�hrung eines
Nachrichtenaustauschs aufgetreten sind. Diese Exceptions k�nnen entweder
beim Erzeugen bzw. Versenden der Kundennachricht oder aber beim Empfangen
und Auswerten der Institutsnachricht aufgetreten sein.
@return Array mit aufgetretenen Exceptions, ist niemals <code>null</code>,
kann aber die L�nge 0 haben */
public Exception[] getExceptions()
{
return globStatus.getExceptions();
}
/** Gibt zur�ck, ob ein Nachrichtenaustausch erfolgreich durchgef�hrt wurde. Das
ist dann der Fall, wenn bei der Abarbeitung keine Exceptions aufgetreten
sind und die Antwortnachricht eine Erfolgsmeldung oder zumindest
nur Warnungen (aber keine Fehlermeldung) enth�lt.
@return <code>true</code>, wenn die Nachricht erfolgreich abgearbeitet
wurde, sonst <code>false</code> */
public boolean isOK()
{
// wenn bei einer CustomMsg mit mehreren GVs EINER fehlschlug,
// dann ist auch isOK()==false. Ist das so gewollt?
return globStatus.getStatusCode()==HBCIStatus.STATUS_OK;
}
/** Gibt einen String zur�ck, der alle aufgetretenen Fehler bei der
Durchf�hrung des Nachrichtenaustauschs beschreibt. Dieser String besteht aus
allen Exception-Meldungen sowie allen evtl. empfangenen Fehlermeldungen.
Die Meldungen werden aus den einzelnen
{@link org.kapott.hbci.status.HBCIStatus}-Objekten durch
Aufruf der Methode {@link org.kapott.hbci.status.HBCIStatus#getErrorString()}
erzeugt.
@return String mit allen aufgetretenen Fehlermeldungen */
public String getErrorString()
{
StringBuffer ret=new StringBuffer();
ret.append(globStatus.getErrorString());
ret.append(System.getProperty("line.separator"));
ret.append(segStatus.getErrorString());
return ret.toString().trim();
}
/** Fasst alle Status-Informationen zu einem Nachrichtenaustausch in einem einzigen
String zusammen und gibt diesen zur�ck. Dazu geh�ren alle evtl.
aufgetretenen Exception-Meldungen, alle Fehlermeldungen, Warnungen sowie
Erfolgsmeldungen. Die Meldungen werden aus den einzelnen
{@link org.kapott.hbci.status.HBCIStatus}-Objekten durch
Aufruf der Methode {@link org.kapott.hbci.status.HBCIStatus#toString()}
erzeugt.
@return einen String, der alle Status-Informationen zu einer Nachricht enth�lt */
public String toString()
{
StringBuffer ret=new StringBuffer();
ret.append(globStatus.toString());
ret.append(System.getProperty("line.separator"));
ret.append(segStatus.toString());
return ret.toString().trim();
}
/**
* Gibt zur�ck, ob der Fehler "PIN ung�ltig" zur�ckgemeldet wurde
* @return <code>true</code> oder <code>false</code> */
public boolean isInvalidPIN()
{
boolean result=false;
List<HBCIRetVal> retvals=new ArrayList<HBCIRetVal>(Arrays.asList(globStatus.getErrors()));
retvals.addAll(new ArrayList<HBCIRetVal>(Arrays.asList(segStatus.getErrors())));
for (Iterator<HBCIRetVal> i=retvals.iterator(); i.hasNext();) {
HBCIRetVal ret=i.next();
if (ret.code.equals("9942") || // PIN falsch (konkret)
ret.code.equals("9340")) // Signatur falsch (generisch)
{
result=true;
break;
}
}
return result;
}
}