* <code>de.willuhn.jameica.hbci.passport.PassportHandle</code> oder
* @see de.willuhn.jameica.gui.Action#handleAction(java.lang.Object)
*/
public void handleAction(final Object context) throws ApplicationException
{
final I18N i18n = Application.getPluginLoader().getPlugin(HBCI.class).getResources().getI18N();
if (context == null || (!(context instanceof Passport) && !(context instanceof PassportHandle)))
throw new ApplicationException(i18n.tr("Bitte w�hlen Sie ein Sicherheits-Medium aus."));
BackgroundTask task = new BackgroundTask() {
public void run(final ProgressMonitor monitor) throws ApplicationException
{
HBCIHandler handler = null;
Target target = null;
try {
monitor.setStatusText(i18n.tr("Teste Sicherheits-Medium..."));
// Log-Ausgaben temporaer auch mit im Progressbar-Fenster
// ausgeben
target = new Target() {
public void write(Message msg) throws Exception
{
monitor.addPercentComplete(2);
format(monitor,msg.getText());
}
public void close() throws Exception
{
}
};
Logger.addTarget(target);
PassportHandle handle = null;
if (context instanceof Passport)
handle = ((Passport)context).getHandle();
else
handle = (PassportHandle) context;
handler = handle.open();
handle.close(); // nein, nicht im finally, denn wenn das Oeffnen
// fehlschlaegt, ist nichts zum Schliessen da ;)
Logger.flush();
monitor.setStatus(ProgressMonitor.STATUS_DONE);
monitor.setPercentComplete(100);
monitor.setStatusText(i18n.tr("Sicherheits-Medium erfolgreich getestet."));
Application.getMessagingFactory().sendMessage(new StatusBarMessage(i18n.tr("Sicherheits-Medium erfolgreich getestet."), StatusBarMessage.TYPE_SUCCESS));
removeTarget(target);
if (!Application.getCallback().askUser(i18n.tr("Test erfolgreich. Konten automatisch anlegen?")))
return;
try
{
new KontoMerge().handleAction(handle.getKonten());
// Wir starten die aktuelle View neu, damit die Liste der Konten
// gleich aktualisiert wird
GUI.startView(GUI.getCurrentView().getClass(),GUI.getCurrentView().getCurrentObject());
}
catch (Exception e)
{
// Das darf fehlschlagen. Zum Beispiel, wenn die Bank sowas nicht unterstuetzt
Logger.error("unable to fetch accounts",e);
monitor.log(i18n.tr("Automatisches Anlegen der Konten fehlgeschlagen. Bitte legen Sie sie manuell an"));
}
}
catch (ApplicationException ae)
{
// Wenn ein Fehler auftrat, MUSS der PIN-Cache geloescht werden. Denn falls
// es genau deshalb fehlschlug, WEIL der User eine falsche PIN eingegeben
// hat, kriegt er sonst keine Chance, seine Eingabe zu korrigieren
DialogFactory.clearPINCache(handler != null ? handler.getPassport() : null);
Application.getMessagingFactory().sendMessage(new StatusBarMessage(ae.getMessage(), StatusBarMessage.TYPE_ERROR));
monitor.setStatus(ProgressMonitor.STATUS_ERROR);
monitor.setPercentComplete(100);
monitor.setStatusText(ae.getMessage());
removeTarget(target);
}
catch (Exception e)
{
Throwable cause = HBCIProperties.getCause(e);
if (cause == null) cause = e; // NPE proof - man weiss ja nie ;)
Logger.info("test of passport failed: " + cause.getClass() + ": " + cause.getMessage());
// Den kompletten Stacktrace loggen wir nur auf DEBUG, weil der beim Testen bzw. Suchen nach
// einem Kartenleser durchaus auftreten kann.
Logger.write(Level.DEBUG,"error while testing passport",e);
// Wenn ein Fehler auftrat, MUSS der PIN-Cache geloescht werden. Denn falls
// es genau deshalb fehlschlug, WEIL der User eine falsche PIN eingegeben
// hat, kriegt er sonst keine Chance, seine Eingabe zu korrigieren
DialogFactory.clearPINCache(handler != null ? handler.getPassport() : null);
// Wir entfernen das Ding vor dem Ausgeben der Fehlermeldungen.
// die kommen sonst alle doppelt.
removeTarget(target);
monitor.setStatus(ProgressMonitor.STATUS_ERROR);
String errorText = i18n.tr("Fehler beim Testen des Sicherheits-Mediums: {0}",cause.getMessage());
Application.getMessagingFactory().sendMessage(new StatusBarMessage(errorText, StatusBarMessage.TYPE_ERROR));
monitor.setStatusText(errorText);
monitor.log(i18n.tr("Aufgetretene Fehlermeldungen:"));
monitor.log("-----------------------------");
Throwable current = e;
for (int i=0;i<10;++i)
{
if (current == null)