All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kapott.hbci.tools.UpdateBLZProperties Maven / Gradle / Ivy

Go to download

HBCI4j - Home Banking Computer Interface for Java - Clone from https://github.com/hbci4j/hbci4java

There is a newer version: 3.5.46
Show newest version
/**********************************************************************
 * $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();
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy