org.kapott.hbci.tools.UpdateBLZProperties Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hbci4j-adorsys Show documentation
Show all versions of hbci4j-adorsys Show documentation
HBCI4j - Home Banking Computer Interface for Java - Clone from https://github.com/hbci4j/hbci4java
/**********************************************************************
* $Source: /cvsroot/hibiscus/hbci4java/src/org/kapott/hbci/tools/UpdateBLZProperties.java,v $
* $Revision: 1.1 $
* $Date: 2012/04/16 22:24:40 $
* $Author: willuhn $
*
* Copyright (c) by willuhn - software & services
* All rights reserved
*
**********************************************************************/
package org.kapott.hbci.tools;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Util-Klasse, welche die FinTS-Bankenliste im CSV-Format (kann von
* http://www.hbci-zka.de/institute/institut_hersteller.htm bezogen werden)
* parst, un die aktualisierten Daten in die blz.properties von HBCI4Java
* uebernimmt.
*/
public class UpdateBLZProperties {
private final static String ENCODING = "iso-8859-1";
/**
* @param args 1. Pfad/Dateiname zu "fints_institute.csv".
* 2. Pfad/Dateiname zu "blz.properties".
* 3. Pfad/Dateiname zur neuen "blz.properties".
* 4. optional: Pfad/Dateiname zur BLZ-Datei der Bundesbank. Falls angegeben, werden die eventuell
* vorhandene BIC-Updates übernommen
* @throws Exception
*/
public static void main(String[] args) throws Exception {
if (args == null || args.length < 3 || args.length > 4) {
System.err.println("benoetigte Parameter: 1) fints_institute.csv, 2) blz.properties, 3) zu schreibende " +
"blz.properties");
System.err.println("optionaler Parameter: 4) BLZ_20160606.txt (BLZ-Update der Bundesbank)");
System.exit(1);
}
BufferedReader f1 = null;
BufferedReader f2 = null;
BufferedWriter f3 = null;
BufferedReader f4 = null;
String line = null;
try {
Map lookup = new HashMap();
Map versions = new HashMap();
Map bicLokup = new HashMap();
//////////////////////////////////////////////////////////////////////////
// fints_institute.csv lesen
f1 = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), ENCODING));
int count = 0;
while ((line = f1.readLine()) != null) {
if (++count <= 1) continue; // erste Zeile ueberspringen
if (line.trim().length() == 0) continue; // leere Zeile
List values = Arrays.asList(line.split(";"));
if (values.size() <= 20) continue; // Bank hat keine PIN/TAN-URL
String blz = values.get(1).trim();
if (blz.length() == 0) continue; // Die Zeile enthaelt keine BLZ
if (lookup.get(blz) != null) continue; // die Zeile haben wir schon
String url = values.get(23).trim();
if (url.length() == 0) continue; // keine URL gefunden
lookup.put(blz, url);
versions.put(blz, values.get(24).trim());
}
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// BLZ-Datei der Bundesbank einlesen, wenn vorhanden
if (args.length == 4) {
File f = new File(args[3]);
if (f.exists() && f.isFile() && f.canRead()) {
f4 = new BufferedReader(new InputStreamReader(new FileInputStream(f), ENCODING));
while ((line = f4.readLine()) != null) {
BICLine current = new BICLine(line);
if (current.blz == null || current.bic == null)
continue;
bicLokup.put(current.blz, current);
}
}
}
//
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// blz.properties lesen und abgleichen
f2 = new BufferedReader(new InputStreamReader(new FileInputStream(args[1]), ENCODING));
f3 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(args[2]), ENCODING));
while ((line = f2.readLine()) != null) {
String[] values = line.split("=");
Line current = new Line(values[0], values[1]);
String url = lookup.get(current.blz);
String version = versions.get(current.blz);
// Checken, ob sich die BIC geaendert hat
if (f4 != null) {
BICLine bic = bicLokup.get(current.blz);
if (bic != null) {
current.updateBic(bic.bic);
}
}
// URL uebernehmen
current.updateUrl(url);
// Version uebernehmen
current.updateVersion(version);
// Neue Zeile schreiben
f3.write(current.toString());
f3.newLine();
}
//
//////////////////////////////////////////////////////////////////////////
} finally {
if (f1 != null) f1.close();
if (f2 != null) f2.close();
if (f3 != null) f3.close();
if (f4 != null) f4.close();
}
}
/**
* Implementiert eine einzelne Zeile aus der BLZ-Datei der Bundesbank.
*/
private static class BICLine {
private String blz = null;
private String bic = null;
/**
* ct.
*
* @param line die Zeile aus der BLZ-Datei.
*/
private BICLine(String line) {
if (line == null || line.length() < 150)
return;
blz = line.substring(0, 8).trim();
bic = line.substring(139, 150).trim();
if (blz.length() == 0)
blz = null;
if (bic.length() == 0)
bic = null;
}
}
/**
* Implementiert eine einzelne Zeile der blz.properties
*/
private static class Line {
private String blz = null;
private String[] values = new String[9];
/**
* ct.
*
* @param blz die BLZ.
* @param line die Zeile aus der blz.properties
*/
private Line(String blz, String line) {
this.blz = blz;
String[] s = line.split("\\|");
System.arraycopy(s, 0, this.values, 0, s.length);
}
/**
* Speichert die neue URL, wenn vorher keine da war oder eine andere.
*
* @param url die neue URL.
*/
private void updateUrl(String url) {
// Keine neue URL
if (url == null || url.length() == 0)
return;
String current = this.values[5];
current = current != null ? current.trim() : "";
if (!current.equals(url)) {
System.out.println(blz + ": URL \"" + current + "\" -> \"" + url + "\"");
this.values[5] = url;
}
}
/**
* Speichert die neue BIC, wenn vorher keine da war oder eine andere.
*
* @param bic die neue BIC.
*/
private void updateBic(String bic) {
// Keine neue BIC
if (bic == null || bic.length() == 0)
return;
String current = this.values[2];
current = current != null ? current.trim() : "";
if (!current.equals(bic)) {
// Wenn sich die BIC nur in den letzten 3 Stellen unterscheiden, koennen wir nicht mit
// Sicherheit sagen, ob unsere Aenderung korrekt waere. In dem Fall kann es sein,
// dass eine der BIC auf "XXX" endet und keine konkrete Filiale meint. Oder - und das
// ist noch fataler: Es gibt bei einigen Banken zur selben BLZ UNTERSCHIEDLICHE
// BIC. Beispiel Deutsche Bank Kiel und Rendsburg. Beide die BLZ "21070020", jedoch
// unterschiedliche BIC (DEUTDEHH210 und DEUTDEHH214). Da wir das Lookup anhand der BLZ
// machen und der Name der Filiale aus meiner Sicht kein hinreichend eindeutiges
// Erkennungsmerkmal ist, machen wir das BIC-Update nur dann, wenn sich die BIC auf
// den ersten 8 Zeichen aendert. Die letzten 3 Stellen fuer die Filialen lassen
// wir erstmal aussen vor.
if (bic.length() < 8 || current.length() < 8)
return;
String s1 = bic.substring(0, 8);
String s2 = current.substring(0, 8);
if (!s1.equals(s2)) {
System.out.println(blz + ": BIC \"" + current + "\" -> \"" + bic + "\"");
this.values[2] = bic;
}
}
}
/**
* Speichert die neue HBCI-Version, wenn vorher keine da war oder eine andere.
*
* @param die neue HBCI-Version.
*/
private void updateVersion(String version) {
// Keine neue Version
if (version == null || version.length() == 0)
return;
version = version.toLowerCase();
if (version.contains("3.0"))
version = "300";
else if (version.contains("2.2"))
version = "plus";
String current = this.values[7];
current = current != null ? current.trim() : "";
if (!current.equals(version)) {
System.out.println(blz + ": Version \"" + current + "\" -> \"" + version + "\"");
this.values[7] = version;
}
}
/**
* Wandelt die Zeile wieder zurueck in einen String.
*
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(this.blz);
sb.append("=");
for (int i = 0; i < this.values.length; ++i) {
if (i > 0)
sb.append("|");
String s = this.values[i];
if (s != null)
sb.append(s);
}
return sb.toString();
}
}
}