/** * Setzen eines Job-Parameters. Für alle Highlevel-Jobs ist in der Package-Beschreibung zum * Package {@link org.kapott.hbci.GV} eine Auflistung aller Jobs und deren Parameter zu finden. * Für alle Lowlevel-Jobs kann eine Liste aller Parameter entweder mit dem Tool {@link * org.kapott.hbci.tools.ShowLowlevelGVs} oder zur Laufzeit durch Aufruf der Methode {@link * org.kapott.hbci.manager.HBCIHandler#getLowlevelJobParameterNames(String)} ermittelt werden. * * <p>Bei Verwendung dieser oder einer der anderen <code>setParam()</code>-Methoden werden * zusätzlich einige der Job-Restriktionen (siehe {@link #getJobRestrictions()}) analysiert. Beim * Verletzen einer der überprüften Einschränkungen wird eine Exception mit einer entsprechenden * Meldung erzeugt. Diese Überprüfung findet allerdings nur bei Highlevel-Jobs statt. * * @param paramName der Name des zu setzenden Parameters. * @param index Der index oder <code>null</code>, wenn kein Index gewünscht ist * @param value Wert, auf den der Parameter gesetzt werden soll */ @Override public void setParam(String paramName, Integer index, String value) { // wenn der Parameter einen LogFilter-Level gesetzt hat, dann den // betreffenden Wert zum Logfilter hinzufügen Integer logFilterLevel = logFilterLevels.get(paramName); if (logFilterLevel != null && logFilterLevel.intValue() != 0) { LogFilter.getInstance().addSecretData(value, "X", logFilterLevel.intValue()); } String[][] destinations = constraints.get(paramName); HBCIPassportInternal passport = getMainPassport(); if (destinations == null) { String msg = HBCIUtilsInternal.getLocMsg( "EXCMSG_PARAM_NOTNEEDED", new String[] {paramName, getName()}); if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg)) throw new InvalidUserDataException(msg); destinations = new String[0][]; } if (value == null || value.length() == 0) { String msg = HBCIUtilsInternal.getLocMsg("EXCMSG_PARAM_EMPTY", new String[] {paramName, getName()}); if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg)) throw new InvalidUserDataException(msg); value = ""; } if (index != null && !indexedConstraints.contains(paramName)) { String msg = HBCIUtilsInternal.getLocMsg( "EXCMSG_PARAM_NOTINDEXED", new String[] {paramName, getName()}); if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg)) throw new InvalidUserDataException(msg); } for (int i = 0; i < destinations.length; i++) { String[] valuePair = destinations[i]; String lowlevelname = valuePair[0]; if (index != null && indexedConstraints.contains(paramName)) { lowlevelname = insertIndex(lowlevelname, index); } setLowlevelParam(lowlevelname, value); } }
public void verifyConstraints() { HBCIPassportInternal passport = getMainPassport(); // durch alle gespeicherten constraints durchlaufen for (Iterator<String> i = constraints.keySet().iterator(); i.hasNext(); ) { // den frontendnamen für das constraint ermitteln String frontendName = (i.next()); // dazu alle ziel-lowlevelparameter mit default-wert extrahieren String[][] values = (constraints.get(frontendName)); // durch alle ziel-lowlevel-parameternamen durchlaufen, die gesetzt werden müssen for (int j = 0; j < values.length; j++) { // Array mit Pfadname und default Wert String[] value = values[j]; // lowlevel-name (Pfadname) des parameters (z.B. wird Frontendname src.bic zum Pfad My.bic String destination = value[0]; // default-wert des parameters, wenn keiner angegeben wurde String defValue = value[1]; String givenContent = getLowlevelParam(destination); if (givenContent == null && indexedConstraints.contains(frontendName)) { givenContent = getLowlevelParam(insertIndex(destination, 0)); } String content = null; content = defValue; if (givenContent != null && givenContent.length() != 0) content = givenContent; if (content == null) { String msg = HBCIUtilsInternal.getLocMsg("EXC_MISSING_HL_PROPERTY", frontendName); if (!HBCIUtilsInternal.ignoreError( passport, "client.errors.ignoreWrongJobDataErrors", msg)) throw new InvalidUserDataException(msg); content = ""; } // evtl. default-wert als aktuellen wert setzen (naemlich dann, // wenn kein content angegeben wurde (givenContent==null), aber // ein default-Content definiert wurde (content.length()!=0) if (content.length() != 0 && givenContent == null) setLowlevelParam(destination, content); } } // verify if segment can be created SEG seg = null; try { seg = createJobSegment(); seg.validate(); } catch (Exception ex) { throw new HBCI_Exception("*** the job segment for this task can not be created", ex); } finally { if (seg != null) { SEGFactory.getInstance().unuseObject(seg); } } }
/* füllt das Objekt mit den Rückgabedaten. Dazu wird zuerst eine Liste aller Segmente erstellt, die Rückgabedaten für diesen Task enthalten. Anschließend werden die HBCI-Rückgabewerte (RetSegs) im outStore gespeichert. Danach werden die GV-spezifischen Daten im outStore abgelegt */ public void fillJobResult(HBCIMsgStatus status, int offset) { try { executed = true; Properties result = status.getData(); // nachsehen, welche antwortsegmente ueberhaupt // zu diesem task gehoeren // res-num --> segmentheader (wird für sortierung der // antwort-segmente benötigt) Hashtable<Integer, String> keyHeaders = new Hashtable<Integer, String>(); for (Enumeration i = result.keys(); i.hasMoreElements(); ) { String key = (String) (i.nextElement()); if (key.startsWith("GVRes") && key.endsWith(".SegHead.ref")) { String segref = result.getProperty(key); if ((Integer.parseInt(segref)) - offset == idx) { // nummer des antwortsegments ermitteln int resnum = 0; if (key.startsWith("GVRes_")) { resnum = Integer.parseInt(key.substring(key.indexOf('_') + 1, key.indexOf('.'))); } keyHeaders.put( new Integer(resnum), key.substring(0, key.length() - (".SegHead.ref").length())); } } } saveBasicValues(result, idx + offset); saveReturnValues(status, idx + offset); // segment-header-namen der antwortsegmente in der reihenfolge des // eintreffens sortieren Object[] resnums = keyHeaders.keySet().toArray(new Object[0]); Arrays.sort(resnums); // alle antwortsegmente durchlaufen for (int i = 0; i < resnums.length; i++) { // dabei reihenfolge des eintreffens beachten String header = keyHeaders.get(resnums[i]); extractPlaintextResults(status, header, contentCounter); extractResults(status, header, contentCounter++); // der contentCounter wird fuer jedes antwortsegment um 1 erhoeht } } catch (Exception e) { String msg = HBCIUtilsInternal.getLocMsg("EXCMSG_CANTSTORERES", getName()); if (!HBCIUtilsInternal.ignoreError( getMainPassport(), "client.errors.ignoreJobResultStoreErrors", msg + ": " + HBCIUtils.exception2String(e))) { throw new HBCI_Exception(msg, e); } } }
public int checkSegSeq(int value) { int num = Integer.parseInt(getValueOfDE(getPath() + ".SegHead.seq")); if (num != value) { if (!HBCIUtilsInternal.ignoreError( null, "client.errors.ignoreSegSeqErrors", HBCIUtilsInternal.getLocMsg( "EXCMSG_INVSEQNUM", new Object[] {getPath(), new Integer(value), new Integer(num)}))) throw new InvalidSegSeqException(getPath(), value, num); } return value + 1; }
private void _checkAccountCRC(String frontendname, String blz, String number) { // pruefsummenberechnung nur wenn blz/kontonummer angegeben sind if (blz == null || number == null) { return; } if (blz.length() == 0 || number.length() == 0) { return; } // daten merken, die im urspruenglich verwendet wurden (um spaeter // zu wissen, ob sie korrigiert wurden) String orig_blz = blz; String orig_number = number; while (true) { // daten validieren boolean crcok = HBCIUtils.checkAccountCRC(blz, number); // aktuelle daten merken String old_blz = blz; String old_number = number; if (!crcok) { // wenn beim validieren ein fehler auftrat, nach neuen daten fragen StringBuffer sb = new StringBuffer(blz).append("|").append(number); HBCIUtilsInternal.getCallback() .callback( getMainPassport(), HBCICallback.HAVE_CRC_ERROR, HBCIUtilsInternal.getLocMsg("CALLB_HAVE_CRC_ERROR"), HBCICallback.TYPE_TEXT, sb); int idx = sb.indexOf("|"); blz = sb.substring(0, idx); number = sb.substring(idx + 1); } if (blz.equals(old_blz) && number.equals(old_number)) { // blz und kontonummer auch nach rueckfrage unveraendert, // also tatsaechlich mit diesen daten weiterarbeiten break; } } if (!blz.equals(orig_blz)) { setParam(frontendname + ".KIK.blz", blz); } if (!number.equals(orig_number)) { setParam(frontendname + ".number", number); } }
private void _checkIBANCRC(String frontendname, String iban) { // pruefsummenberechnung nur wenn iban vorhanden ist if (iban == null || iban.length() == 0) { return; } // daten merken, die im urspruenglich verwendet wurden (um spaeter // zu wissen, ob sie korrigiert wurden) String orig_iban = iban; while (true) { boolean crcok = HBCIUtils.checkIBANCRC(iban); String old_iban = iban; if (!crcok) { StringBuffer sb = new StringBuffer(iban); HBCIUtilsInternal.getCallback() .callback( getMainPassport(), HBCICallback.HAVE_IBAN_ERROR, HBCIUtilsInternal.getLocMsg("CALLB_HAVE_IBAN_ERROR"), HBCICallback.TYPE_TEXT, sb); iban = sb.toString(); } if (iban.equals(old_iban)) { // iban unveraendert break; } } if (!iban.equals(orig_iban)) { setParam(frontendname + ".iban", iban); } }
public static String getLocMsg(String key, Object o) { return HBCIUtilsInternal.getLocMsg(key, new Object[] {o}); }