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

gdv.xport.satz.Datensatz Maven / Gradle / Ivy

Go to download

gdv-xport-lib ist die Java-Bibliothek fuer den Umgang mit dem GDV-Format. Sie erleichtert den Export und Export dieses Datenformats.

There is a newer version: 7.2.2
Show newest version
/*
 * Copyright (c) 2009-2020 by Oli B.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * (c)reated 12.10.2009 by Oli B. ([email protected])
 */

package gdv.xport.satz;

import gdv.xport.config.Config;
import gdv.xport.feld.*;
import gdv.xport.io.ImportException;
import gdv.xport.io.PushbackLineNumberReader;
import gdv.xport.satz.feld.common.Kopffelder1bis7;
import gdv.xport.satz.feld.common.TeildatensatzNummer;
import gdv.xport.satz.feld.common.WagnisartLeben;
import gdv.xport.util.SatzTyp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.EOFException;
import java.io.IOException;
import java.io.PushbackReader;
import java.util.List;

import static gdv.xport.feld.Bezeichner.*;

/**
 * Datensatz ist von {@link Satz} abgeleitet, enthaelt aber zusaetzlich noch
 * die Sparte.
 *
 * @author oliver
 * @since 12.10.2009
 */
public class Datensatz extends Satz {

	private static final Logger LOG = LogManager.getLogger(Datensatz.class);
	/** 3 Zeichen, Byte 11 - 13. */
  private final NumFeld sparte = new NumFeld(Kopffelder1bis7.SPARTE);
	/** 1 Zeichen, Byte 59. */
	private final AlphaNumFeld wagnisart = new AlphaNumFeld((WAGNISART), 1, 59);
	/** 1 Zeichen, Byte 256 - 256. */
    private final AlphaNumFeld teildatensatzNummer = new AlphaNumFeld((TEILDATENSATZNUMMER), 1, 256);

	/**
	 * Default-Konstruktor (wird zur Registrierung bei der {@link gdv.xport.util.SatzFactory}
	 * benoetigt).
	 * 

* Anm.: In {@link gdv.xport.util.SatzRegistry#getSatz(SatzTyp)} wird der * Default-Constructor per Reflection aufgerufen. Daher kann er nicht * einfach entfernt werden. *

* * @since 0.6 */ public Datensatz() { this(SatzTyp.of(0)); } /** * Instantiiert einen neuen Datensatz mit 1 Teildatensatz.
* Der Teildatensatz besteht nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
*

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. "0100" * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp)} verwenden */ @Deprecated public Datensatz(final String satzart) { this(SatzTyp.of(satzart)); } /** * Instantiiert einen neuen Datensatz mit 1 Teildatensatz.
* Der Teildatensatz besteht nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
*

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp)} verwenden */ @Deprecated public Datensatz(final int satzart) { this(SatzTyp.of(satzart)); } /** * Instantiiert einen neuen Datensatz.
* Der Teildatensatz besteht nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
*

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @param n Anzahl der Teildatensaetze * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp, int)} verwenden */ @Deprecated public Datensatz(final String satzart, final int n) { this(SatzTyp.of(satzart), n); } /** * Instantiiert einen neuen Datensatz. *

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @param tdsList Liste mit den Teildatensaetzen * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp, List)} verwenden */ @Deprecated public Datensatz(final int satzart, final List tdsList) { this(SatzTyp.of(satzart), tdsList); } /** * Instantiiert einen neuen Datensatz mit 1 Teildatensatz.
* Der Teildatensatz besteht nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
*

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @param sparte z.B. 70 (Rechtsschutz) * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp)} verwenden */ @Deprecated public Datensatz(final int satzart, final int sparte) { this(SatzTyp.of(satzart, sparte)); } /** * Instantiiert einen neuen Datensatz mit 1 Teildatensatz.
* Der Teildatensatz besteht nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
* Das Feld 4 (Sparte) im Teildatensatz wird nur bei den vordefinierten GDV-Spartensaetzen belegt. * * @param satzTyp z.B. "0210.040" (Vertragsspezifischer Teil, Haftpflicht) * @since 5.0 */ public Datensatz(SatzTyp satzTyp) { this(satzTyp, 1); } /** * Instantiiert einen neuen Datensatz.
* Die Teildatensaetze bestehen nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
*

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @param sparte z.B. 70 (Rechtsschutz) * @param n Anzahl der Teildatensaetze * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp, int)} verwenden */ @Deprecated public Datensatz(final int satzart, final int sparte, final int n) { this(SatzTyp.of(satzart, sparte), n); } /** * Instantiiert einen neuen Datensatz.
* Die Teildatensaetze bestehen nur aus 8 Feldern:
*
    *
  • Satzart
  • *
  • VU_NUMMER
  • *
  • BUENDELUNGSKENNZEICHEN
  • *
  • SPARTE
  • *
  • VERSICHEURUNGSSCHEINNUMMER
  • *
  • FOLGENUMMER
  • *
  • VERMITTLER
  • *
  • SATZNUMMER
  • *
* Das Feld 4 (Sparte) im Teildatensatz wird nur bei vordefinierten Spartensaetzen belegt. * * @param satzTyp z.B. "0100" (Adressteil) oder "0220.110" (Glas) * @param n Anzahl der Teildatensaetze * @since 5.0 */ public Datensatz(final SatzTyp satzTyp, final int n) { super(satzTyp, n); if (satzTyp.hasSparte()) this.setSparte(satzTyp.getSparte()); this.setUpTeildatensaetze(); } /** * Instantiiert einen neuen Datensatz. *

* TODO: Wird mit v6 entfernt. *

* * @param satzart z.B. 100 * @param sparte z.B. 70 (Rechtsschutz) * @param tdsList Liste mit den Teildatensaetzen * @deprecated bitte {@link Datensatz#Datensatz(SatzTyp, List)} verwenden */ @Deprecated public Datensatz(final int satzart, final int sparte, final List tdsList) { this(SatzTyp.of(satzart, sparte), tdsList); } /** * Instantiiert einen neuen Datensatz. (nur von SatzX) * * @param satzNr die SatzNummer * @param tdsList Liste mit den Teildatensaetzen * @since 0.9 */ protected Datensatz(final SatzTyp satzNr, final List tdsList) { super(satzNr, tdsList); if (tdsList.get(0).hasSparte()) { this.sparte.setInhalt(tdsList.get(0).getSparte()); } this.completeTeildatensaetze(); if (satzNr.hasSparte()) { this.setSparte(satzNr.getSparte()); } if (satzNr.hasWagnisart() && satzNr.getWagnisart() < 10) { this.set(Bezeichner.WAGNISART, Integer.toString(satzNr.getWagnisart())); } if (satzNr.hasTeildatensatzNummer()) { this.setTeildatensatzNummer("" + satzNr.getTeildatensatzNummer()); } } /** * Dies ist der Copy-Constructor, mit dem man einen bestehenden Datensatz * kopieren kann. * * @param other der originale Datensatz */ public Datensatz(final Datensatz other) { super(other, other.cloneTeildatensaetze()); this.sparte.setInhalt(other.sparte.getInhalt()); this.teildatensatzNummer.setInhalt(other.teildatensatzNummer.getInhalt()); this.wagnisart.setInhalt(other.wagnisart.getInhalt()); } /** * Kann von Unterklassen verwendet werden, um die Teildatensaetze * aufzusetzen. */ protected void setUpTeildatensaetze() { for (Teildatensatz tds : this.getTeildatensaetze()) { setUpTeildatensatz(tds); } } /** * Hiermit kann ein einzelner Teildatensatz aufgesetzt werden. *

* Wenn alle Datensaetze nur noch ueber Enums (Soplets) initialisiert * werden, duerfte die Inialisierung hier hinfaellig sein. *

* * @param tds der (leere) Teildatensatz * @since 0.4 */ protected void setUpTeildatensatz(final Teildatensatz tds) { setUpTeildatensatz(tds, this.sparte); } protected static void setUpTeildatensatz(final Teildatensatz tds, final NumFeld sparte) { if (!tds.hasFeld(Kopffelder1bis7.VU_NUMMER.getBezeichner()) && !tds.get(Kopffelder1bis7.SATZART.getBezeichner()) .equalsIgnoreCase("9999")) { setUp(tds, Kopffelder1bis7.VU_NUMMER.getBezeichner(), Config.getVUNummer()); setUp(tds, Kopffelder1bis7.BUENDELUNGSKENNZEICHEN.getBezeichner(), new AlphaNumFeld(Kopffelder1bis7.BUENDELUNGSKENNZEICHEN)); setUp(tds, Kopffelder1bis7.SPARTE.getBezeichner(), sparte); setUp(tds, Kopffelder1bis7.VERSICHERUNGSSCHEINNUMMER.getBezeichner(), new AlphaNumFeld(Kopffelder1bis7.VERSICHERUNGSSCHEINNUMMER)); setUp(tds, Kopffelder1bis7.FOLGENUMMER.getBezeichner(), new NumFeld(Kopffelder1bis7.FOLGENUMMER)); setUp(tds, Kopffelder1bis7.VERMITTLER.getBezeichner(), new AlphaNumFeld(Kopffelder1bis7.VERMITTLER)); LOG.trace(tds + " is set up."); } else if (tds.hasFeld(Kopffelder1bis7.SPARTE)) { tds.getFeld(Kopffelder1bis7.SPARTE.getBezeichner()).setInhalt(sparte.getInhalt()); } } private static void setUp(final Teildatensatz tds, final Bezeichner bezeichner, final Feld value) { if (!tds.hasFeld(bezeichner)) { LOG.trace("{} initialized with value {}.", tds, value); tds.add(value); } } /** * Kann von Unterklassen verwendet werden, um fehlende Felder in den * Teildatensaetze zu vervollstaendigen. Kann aber seit 1.0 nicht mehr * ueberschrieben werden, da diese Methode vom Konstruktor waehrend der * Objekt-Kreierung benoetigt wird. * * @since 0.6 */ protected final void completeTeildatensaetze() { for (Teildatensatz tds : this.getTeildatensaetze()) { setUpTeildatensatz(tds); } } /* * (non-Javadoc) * @see gdv.xport.satz.Satz#addFiller() */ @Override public void addFiller() { for (Teildatensatz tds : this.getTeildatensaetze()) { tds.add(new AlphaNumFeld((LEERSTELLEN), 213, 43)); } } /** * Setzt die Sparte. * * @param x z.B. 70 (Rechtsschutz) */ public void setSparte(final int x) { this.sparte.setInhalt(x); for (Teildatensatz tds : getTeildatensaetze()) { if (tds.getFelder().size() > 3) { tds.getFeld(4).setInhalt(x); } } } /** * Setzt die Sparte. Der uebergebene String kann dabei auch die Art der * Sparte enthalten. * * @param x z.B. "580.01" fuer Sparte 580, Art 01 */ public void setSparte(final String x) { String[] parts = x.split("\\."); this.setSparte(Integer.parseInt(parts[0])); if ((parts.length > 1) && getGdvSatzartName().isEmpty()) { this.setGdvSatzartName(String.format("%04d.%s", getSatzart(), x)); } } /** * Gets the sparte. * * @return die Sparte als int */ @Override public int getSparte() { return this.sparte.toInt(); } /** * Manche Satzarten wie Bausparen haben eine Element fuer die Untersparte, * im Feld Wagnisart oder Art abgespeichert. Dies ist z.B. fuer Satz * 220.580.1 (Bausparen) der Fall. * * @return 0 oder Untersparte / Art */ public int getArt() { return this.getSatzTyp().getArt(); } /** * Wenn der Datensatz ein Element fuer eine Untersparte hat, wird 'true' * zurueckgegeben. Dies ist z.B. fuer Satz 220.580.1 (Bausparen) der Fall. * * @return true, falls der Datensatz eine Untersparte hat. */ public boolean hasArt() { return this.getSatzTyp().hasArt(); } /** * Ueberprueft, ob der Datensatz ueberhaupt eine Sparte gesetzt hat. * * @return true, if successful * @since 0.6 */ @Override public boolean hasSparte() { /* * @Oli: die Abfrage auf Existenz von "sparte" ist noetig, damit es beim Debugging nicht in * "Satz.toString()" zur RuntimeException kommen kann, solange das Datensatz-Objekt noch * nicht fertig ist. */ return this.sparte != null && !this.sparte.isEmpty() && this.getSparte() > 0; } /** * Gets the sparte feld. * * @return die Sparte als Feld */ public NumFeld getSparteFeld() { return this.sparte; } /** * Wenn der Datensatz ein Element fuer eine Untersparte hat, wird 'true' * zurueckgegeben. Dies ist z.B. fuer Satz 220.580.1 (Bausparen) der Fall. * * @return true, falls der Datensatz eine Untersparte hat. */ public boolean hasSatzartNummer() { return !this.getGdvSatzartNummer().isEmpty(); } /** * Sets the vu nummer. * * @param s VU-Nummer (max. 5 Stellen) */ public void setVuNummer(final String s) { this.getFeld(Kopffelder1bis7.VU_NUMMER.getBezeichner()).setInhalt(s); } /** * Gets the vu nummer. * * @return die VU-Nummer */ public String getVuNummer() { return this.getFeld(Kopffelder1bis7.VU_NUMMER.getBezeichner()).getInhalt().trim(); } /** * Sets the versicherungsschein nummer. * * @param nr die Versicherungsschein-Nummer * @since 0.3 */ public void setVersicherungsscheinNummer(final String nr) { this.getFeld(Kopffelder1bis7.VERSICHERUNGSSCHEINNUMMER.getBezeichner()).setInhalt(nr); } /** * Gets the versicherungsschein nummer. * * @return die Versicherungsschein-Nummer * @since 0.3 */ public String getVersicherungsscheinNummer() { return this.getFeld(Kopffelder1bis7.VERSICHERUNGSSCHEINNUMMER.getBezeichner()).getInhalt().trim(); } /** * Gets the teildatensatz nummer. (wird nur von SatzX verwendet!) * * @return the teildatensatz nummer */ public String getTeildatensatzNummer() { return teildatensatzNummer.getInhalt().trim(); } /** * Da nicht alle Satzarten die Satznummer am Ende des Satzes haben, kann * man dies ueber diese Methode korrigieren. * * @param satznummer das neue Feld fuer die Satznummer * @since 3.2 */ public void setSatznummer(Zeichen satznummer) { remove(Bezeichner.SATZNUMMER); for (Teildatensatz tds : getTeildatensaetze()) { tds.setSatznummer(satznummer); } } /** * Sets the teildatensatz nummer. * * @param teildatensatzNummer the new teildatensatz nummer */ public void setTeildatensatzNummer(final String teildatensatzNummer) { this.teildatensatzNummer.setInhalt(teildatensatzNummer); } /** * Hiermit kann die Folgenummer gesetzt werden. * * @param nr man sollte hier bei 1 anfangen mit zaehlen * @since 0.3 */ public void setFolgenummer(final int nr) { this.getFeld(Kopffelder1bis7.FOLGENUMMER.getBezeichner()).setInhalt(Integer.toString(nr)); } /** * Gets the folgenummer. * * @return die Folgenummer * @since 0.3 */ public int getFolgenummer() { NumFeld folgenummer = (NumFeld) this.getFeld(Kopffelder1bis7.FOLGENUMMER.getBezeichner()); return folgenummer.toInt(); } /** * Gets the vermittler. * * @return the vermittler * @since 0.6 */ public String getVermittler() { return this.getFeldInhalt(VERMITTLER); } /** * Liest 14 Bytes, um die Sparte zu bestimmen und stellt die Bytes * anschliessend wieder zurueck in den Reader. * * @param reader muss mind. einen Pushback-Puffer von 14 Zeichen * bereitstellen * @return Sparte * @throws IOException falls was schief gegangen ist */ public static int readSparte(final PushbackReader reader) throws IOException { char[] cbuf = new char[14]; if (reader.read(cbuf) == -1) { throw new IOException("can't read 14 bytes (" + new String(cbuf) + ") from " + reader); } reader.unread(cbuf); String intro = new String(cbuf); try { return Integer.parseInt(intro.substring(10, 13)); } catch (NumberFormatException ex) { throw new ImportException("cannot read sparte from first 14 bytes (\"" + intro + "\")"); } } /** * Liest 49 Bytes, um die Folge-Nr. in Satzart 220, Sparte 20 (Kranken) zu bestimmen und stellt die Bytes * anschliessend wieder zurueck in den Reader. * * @param reader muss mind. einen Pushback-Puffer von 14 Zeichen * bereitstellen * @return Folge-Nr * @throws IOException falls was schief gegangen ist */ public static int readKrankenFolgeNr(final PushbackLineNumberReader reader) throws IOException { int satzart = readSatzart(reader); if (satzart != 220) { throw new IllegalArgumentException("can't read Kranken Folge-Nr., wrong satzart " + satzart +", must be 220"); } int sparte = readSparte(reader); if (sparte != 20) { throw new IllegalArgumentException("can't read Kranken Folge-Nr., wrong sparte " + sparte + ", must be 20"); } char[] cbuf = new char[49]; if (reader.read(cbuf) == -1) { throw new IOException("can't read 49 bytes (" + new String(cbuf) + ") from " + reader); } reader.unread(cbuf); String first10Fields = new String(cbuf); try { return Integer.parseInt(first10Fields.substring(47, 48)); } catch (NumberFormatException ex) { return -1; } } /** * Liest 45 Bytes, um die Bauspar-Art in Satzart 220, Sparte 580 (Bausparen) * zu bestimmen und stellt die Bytes anschliessend wieder zurueck in den * Reader. * * @param reader muss mind. einen Pushback-Puffer von 14 Zeichen bereitstellen * @return Folge-Nr * @throws IOException falls was schief gegangen ist */ public static int readBausparenArt(final PushbackLineNumberReader reader) throws IOException { int satzart = readSatzart(reader); if (satzart != 220) { throw new IllegalArgumentException("can't read Bauspar-Art, wrong satzart " + satzart +", must be 220"); } int sparte = readSparte(reader); if (sparte != 580) { throw new IllegalArgumentException("can't read Bauspar-Art, wrong sparte " + sparte + ", must be 580"); } char[] cbuf = new char[45]; if (reader.read(cbuf) == -1) { throw new IOException("can't read 45 bytes (" + new String(cbuf) + ") from " + reader); } reader.unread(cbuf); String first10Fields = new String(cbuf); try { return Integer.parseInt(first10Fields.substring(43, 44)); } catch (NumberFormatException ex) { return -1; } } /** * Liest 1 Byte, um die Wagnisart zu bestimmen und stellt das Byte * anschliessend wieder zurueck in den Reader. * * @param reader muss mind. einen Pushback-Puffer von 1 Zeichen bereitstellen * @return Wagnisart * @throws IOException falls was schief gegangen ist */ public static WagnisartLeben readWagnisart(final PushbackReader reader) throws IOException { char[] cbuf = new char[60]; if (reader.read(cbuf) == -1) { throw new IOException("can't read 1 bytes (" + new String(cbuf) + ") from " + reader); } reader.unread(cbuf); String wagnisart = new String(cbuf).substring(59, 60); if (wagnisart.trim().length() == 0) { return WagnisartLeben.NULL; } else { try { return WagnisartLeben.isIn(Integer.parseInt(wagnisart)); } catch (NumberFormatException e) { LOG.warn("Not allowed value for wagnisart found. Type Number is required but was \"" + wagnisart + "\"."); return WagnisartLeben.NULL; } } } /** * Prüfe ob die kommende Zeile ein Teildatensatz der letzten ist. Dazu * werden (normalerweise) die ersten 7 Felder abgeglichen. Leider fuehrt * dieses Verfahren nicht immer zum Erfolg, sodass wir uns in bestimmten * Situationen doch den ganzen naechsten Teildatensatz anschauen muessen. * * @param reader ein Reader * @param lastFeld1To7 Feld1..7 als Char-Array (42 Zeichen) der letzten Zeile * oder {@code null} für ersten Teildatensatz * @return {@code true}, falls ein Teildatensatz, {@code false} falls nicht, * d.h. neuer Datensatz. * @throws IOException bei I/O-Fehlern * @see Satz#matchesNextTeildatensatz(PushbackLineNumberReader, char[], Character) * @since 0.5.1 */ @Override protected boolean matchesNextTeildatensatz(final PushbackLineNumberReader reader, char[] lastFeld1To7, Character satznummer) throws IOException { if (super.matchesNextTeildatensatz(reader, lastFeld1To7, satznummer)) { if (lastFeld1To7 == null) { //erster Teildatensatz hat noch keine lastFeld... return matchesFirstTeildatensatz(reader); } else { // TODO: ugly aber ich sehe bisher noch keinen eleganten Weg in der aktuellen Struktur ohne umfangreiche Refaktorings. char[] newLine = new char[256]; int res = reader.read(newLine); if (res < 256) { return false;// EOF } reader.unread(newLine); // wir vergleichen komplett die ersten 7 Felder (42 Zeichen) auf // Gleichheit....wenn ein Unterschied -> neuer Datensatz, for (int i = 0; i < 42; i++) { if (lastFeld1To7[i] != newLine[i]) return false; } return matchesLastFeld(satznummer, newLine); } } return false; } private boolean matchesFirstTeildatensatz(PushbackLineNumberReader reader) throws IOException { if (this.hasSparte()) { return this.getSparte() == readSparte(reader); } return true; } private static boolean matchesLastFeld(Character satznummer, char[] newLine) { // Das letzte Feld wird darauf verglichen, dass es groesser als das // vorherige ist, falls Teildatensaetze uebersprungen werden char newSatznummer = readSatznummer(newLine); return !(Character.isDigit(newSatznummer) && Character.isDigit(satznummer) && newSatznummer <= satznummer); } /** * Read teildatensatz nummer. * * @param reader the reader * @return the teildatensatz nummer * @throws IOException Signals that an I/O exception has occurred. */ public static TeildatensatzNummer readTeildatensatzNummer(final PushbackReader reader) throws IOException { char[] cbuf = new char[256]; if (reader.read(cbuf) == -1) { throw new EOFException("can't read 1 bytes (" + new String(cbuf) + ") from " + reader); } reader.unread(cbuf); String teildatenSatz = new String(cbuf).substring(cbuf.length - 1, cbuf.length); if (teildatenSatz.trim().length() == 0) { return TeildatensatzNummer.NULL; } else { try { return TeildatensatzNummer.isIn(Integer.parseInt(teildatenSatz)); } catch (NumberFormatException e) { LOG.warn("Value \"" + teildatenSatz + "\" for TeildatensatzNummer found, but Number expected."); return TeildatensatzNummer.NULL; } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy