protected HBCIJobImpl(HBCIHandler parentHandler, String jobnameLL, HBCIJobResultImpl jobResult) { findSpecNameForGV(jobnameLL, parentHandler); this.llParams = new Properties(); this.passports = new HBCIPassportList(); this.passports.addPassport( (HBCIPassportInternal) parentHandler.getPassport(), HBCIPassport.ROLE_ISS); this.jobResult = jobResult; this.jobResult.setParentJob(this); this.contentCounter = 0; this.constraints = new Hashtable<String, String[][]>(); this.logFilterLevels = new Hashtable<String, Integer>(); this.indexedConstraints = new HashSet<String>(); this.executed = false; this.parentHandler = parentHandler; /* offensichtlich soll ein GV mit dem Namen name in die nachricht aufgenommen werden. da GV durch segmente definiert sind, und einige dieser segmente ein request-tag benoetigen (siehe klasse SyntaxElement), wird hier auf jeden fall das request-tag gesetzt. wenn es *nicht* benoetigt wird, schadet es auch nichts. und es ist auf keinen fall "zu viel" gesetzt, da dieser code nur ausgefuehrt wird, wenn das jeweilige segment tatsaechlich erzeugt werden soll */ llParams.setProperty(this.name, "requested"); }
@Test public void test() { System.out.println("---------Erstelle Job"); HBCIJob job = handler.newJob("DauerSEPAList"); int source_acc_idx = Integer.parseInt(params.getProperty("source_account_idx")); job.setParam("src", passport.getAccounts()[source_acc_idx]); System.out.println("---------Für Job zur Queue"); job.addToQueue(); HBCIExecStatus ret = handler.execute(); HBCIJobResult res = job.getJobResult(); System.out.println("----------Result: " + res.toString()); Assert.assertEquals("Job Result ist nicht OK!", true, res.isOK()); }
private void done() { if (handler != null) { handler.close(); } if (passport != null) { passport.close(); } HBCIUtils.doneThread(); }
public static void main(String[] args) throws IOException { try { HBCIUtils.init(null, new MyCallback()); readBasicParams(); readPassportParams(); passport = AbstractHBCIPassport.getInstance(); readHBCIVersion(); readActions(); if (HBCIUtils.getParam("action.resetBPD").equals("1")) { passport.clearBPD(); } if (HBCIUtils.getParam("action.resetUPD").equals("1")) { passport.clearUPD(); } hbciHandle = new HBCIHandler(HBCIUtils.getParam("client.passport.hbciversion.default"), passport); /* HBCIExecStatus ret=hbciHandle.execute(); System.out.println("ExecStatus"); System.out.println(ret.toString()); System.out.println("ExecStatusEnd"); System.out.println("ExecStatusError"); System.out.println(ret.getErrorString()); System.out.println("ExecStatusErrorEnd"); */ printSupportedGVs(hbciHandle); System.out.println(); System.out.println("finished."); System.out.println(); } finally { if (hbciHandle != null) { hbciHandle.close(); } else if (passport != null) { passport.close(); } } }
/** @see de.willuhn.jameica.hbci.passports.rdh.keyformat.KeyFormat#createKey(java.io.File) */ public RDHKey createKey(File file) throws ApplicationException, OperationCanceledException { HBCIHandler handler = null; RDHKeyImpl key = null; try { key = new RDHKeyImpl(file); key.setFormat(this); // Wir machen den Handler einmal auf und wieder zu, damit // der Schluessel gleich initialisiert wird. HBCIPassport passport = load(key, true); passport.saveChanges(); passport.syncSigId(); passport.syncSysId(); // Bei der Neuerstellung fragen wir immer den User nach der HBCI-Version // Wir fragen die HBCI-Version via Messaging ab, damit sie ggf. auch // (z.Bsp. vom Payment-Server) automatisch beantwortet werden kann. QueryMessage msg = new QueryMessage(passport); Application.getMessagingFactory() .getMessagingQueue("hibiscus.passport.rdh.hbciversion") .sendSyncMessage(msg); Object data = msg.getData(); if (data == null || !(data instanceof String)) throw new ApplicationException(i18n.tr("HBCI-Version nicht ermittelbar")); String version = (String) msg.getData(); Logger.info("using hbci version: " + version); handler = new HBCIHandler(version, passport); handler.close(); handler = null; Application.getMessagingFactory() .sendMessage( new StatusBarMessage( i18n.tr("Schlüssel erfolgreich erstellt"), StatusBarMessage.TYPE_SUCCESS)); return key; } catch (ApplicationException ae) { throw ae; } catch (OperationCanceledException oce) { throw oce; } catch (Exception e) { OperationCanceledException oce = (OperationCanceledException) HBCIFactory.getCause(e, OperationCanceledException.class); if (oce != null) throw oce; ApplicationException ae = (ApplicationException) HBCIFactory.getCause(e, ApplicationException.class); if (ae != null) throw ae; NeedKeyAckException ack = (NeedKeyAckException) HBCIFactory.getCause(e, NeedKeyAckException.class); if (ack != null) { Application.getMessagingFactory() .sendMessage( new StatusBarMessage( i18n.tr("Schlüssel erfolgreich erstellt"), StatusBarMessage.TYPE_SUCCESS)); String msg = i18n.tr( "Bitte senden Sie den INI-Brief an Ihre Bank\nund warten Sie auf die Freischaltung durch die Bank."); try { Application.getCallback().notifyUser(msg); } catch (Exception e2) { Logger.error("unable to notify user", e2); Application.getMessagingFactory() .sendMessage(new StatusBarMessage(msg, StatusBarMessage.TYPE_SUCCESS)); } return key; } Logger.error("unable to create key " + file.getAbsolutePath(), e); throw new ApplicationException( i18n.tr("Fehler beim Erstellen des Schlüssels: {0}", e.getMessage())); } finally { try { if (handler != null) handler.close(); } catch (Throwable t) { Logger.error("error while closing handler", t); } } }
/* gibt zu einem gegebenen jobnamen des namen dieses jobs in der syntax-spez. * zurück (also mit angehängter versionsnummer) */ private void findSpecNameForGV(String jobnameLL, HBCIHandler handler) { int maxVersion = 0; StringBuffer key = new StringBuffer(); // alle param-segmente durchlaufen Properties bpd = handler.getPassport().getBPD(); for (Enumeration i = bpd.propertyNames(); i.hasMoreElements(); ) { String path = (String) i.nextElement(); key.setLength(0); key.append(path); if (key.indexOf("Params") == 0) { key.delete(0, key.indexOf(".") + 1); // wenn segment mit namen des aktuellen jobs gefunden wurde if (key.indexOf(jobnameLL + "Par") == 0 && key.toString().endsWith(".SegHead.code")) { // willuhn 2011-06-06 Maximal zulaessige Segment-Version ermitteln // Hintergrund: Es gibt Szenarien, in denen nicht die hoechste verfuegbare // Versionsnummer verwendet werden kann, weil die Voraussetzungen impliziert, // die beim User nicht gegeben sind. Mit diesem Parameter kann die maximale // Version nach oben begrenzt werden. In AbstractPinTanPassport#setBPD() ist // ein konkretes Beispiel enthalten (Bank macht HITANS5 und damit HHD 1.4, der // User hat aber nur ein HHD-1.3-tauglichen TAN-Generator) int maxAllowedVersion = Integer.parseInt( HBCIUtils.getParam( "kernel.gv." + bpd.getProperty(path, "default") + ".segversion.max", "0")); key.delete(0, jobnameLL.length() + ("Par").length()); // extrahieren der versionsnummer aus dem spez-namen String st = key.substring(0, key.indexOf(".")); int version = 0; try { version = Integer.parseInt(st); } catch (Exception e) { HBCIUtils.log( "found invalid job version: key=" + key + ", jobnameLL=" + jobnameLL + " (this is a known, but harmless bug)", HBCIUtils.LOG_WARN); } // willuhn 2011-06-06 Segment-Versionen ueberspringen, die groesser als die max. // zulaessige sind if (maxAllowedVersion > 0 && version > maxAllowedVersion) { HBCIUtils.log( "skipping segment version " + version + " for task " + jobnameLL + ", larger than allowed version " + maxAllowedVersion, HBCIUtils.LOG_INFO); continue; } // merken der größten jemals aufgetretenen versionsnummer if (version != 0) { HBCIUtils.log( "task " + jobnameLL + " is supported with segment version " + st, HBCIUtils.LOG_DEBUG2); if (version > maxVersion) { maxVersion = version; } } } } } if (maxVersion == 0) { throw new JobNotSupportedException(jobnameLL); } // namen+versionsnummer speichern this.jobName = jobnameLL; this.segVersion = Integer.toString(maxVersion); this.name = jobnameLL + this.segVersion; }