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

com.sta.cts.EDIScanner Maven / Gradle / Ivy


package com.sta.cts;

import java.util.Vector;
import java.util.Hashtable;

import java.io.IOException;

/**
 * 

Name: EDIScanner

*

Description: * Die Klasse EDIScanner wurde von Scanner abgeleitet und realisiert einen * Scanner f?r EDIFACT-Dateien. Als Token wird ein Vector geliefert, der alle * Elemente (und Unterelemente - wieder als Vector) einer "Zeile" (Zeilenende * ?'?) enth?lt (Strings). Enth?lt ein Element genau ein Unterelement, wird * dieses nicht als "Vector im Vector", sondern als "String im Vector" * geliefert. Leere Elemente werden durch leere Strings dargestellt. *

*

Copyright: Copyright (c) 2001-2004, 2012, 2014, 2016-2019, 2021

*

Company: >StA-Soft<

* @author StA * @version 1.0 */ public class EDIScanner extends Scanner { /** * Zeichen zur Trennung von Subelementen. */ private char myEOS; // EndOfSubelement /** * Zeichen zur Trennung von Elementen. */ private char myEOE; // EndOfElement /** * Zeichen zur Trennung von Zeilen. */ private char myEOL; // EndOfLine //=========================================================================== /** * Zur Instantiierung. Die Standard-Trennzeichen werden eingestellt. */ public EDIScanner() { setEOs(':', '+', '\''); } /** * Zur Instantiierung. Die Standard-Trennzeichen werden eingestellt. * @param pFileName ist der Name der Quelldatei * @throws IOException falls die Datei nicht gefunden */ public EDIScanner(String pFileName) throws IOException { setEOs(':', '+', '\''); init(pFileName); } //=========================================================================== /** * Zur Initialisierung von EndOfSubElement, EndOfElement und EndOfLine. * @param pEOS ist das Zeichen zur Trennung von Sub-Elementen, in der Regel ein ?:? * @param pEOE ist das Zeichen zur Trennung von Elementen, in der Regel ein ?+? * @param pEOL ist das Zeichen zur Trennung von Zeilen, in der Regel ein ?'? */ public void setEOs(char pEOS, char pEOE, char pEOL) { myEOS = pEOS; myEOE = pEOE; myEOL = pEOL; } /** * Zum Einlesen von EndOfSubElement, EndOfElement und EndOfLine aus der * Quelldatei. * @exception IOException falls ein Lesefehler auftritt */ public void readEOs() throws IOException { char ch1; char ch2; char ch3; char ch; ch1 = getCharT(); if (ch1 == 'U') { ch2 = getCharT(); if (ch2 == 'N') { ch3 = getCharT(); if (ch3 == 'A') { myEOS = getCharT(); // ?:? myEOE = getCharT(); // ?+? ch = getCharT(); // ?.? ch = getCharT(); // ??? ch = getCharT(); // ?*? myEOL = getCharT(); // ?'? } else { ungetChar(ch3); // ) ungetChar(ch2); // )=> Exception ungetChar(ch1); // ) } } else { ungetChar(ch2); // ) ungetChar(ch1); // )=> Exception } } else { ungetChar(ch1); } } @Override public void initH(Hashtable pHT) { } /** * Ein "Unterelement" (SubElement) scannen. * * Alle Zeichen bis EOS (?:?), EOE (?+?), EOL (?'?) und #$00 zu einem String zusammenf?gen und zur?ckliefern. * * Kein Zeichen => Leer-String. * * Das abschlie?ende Zeichen (EOS (?:?), EOE (?+?) oder EOL (?'?)) wird nicht mit verarbeitet. * * Falls das Dateiende vor (!) dem Scannen erreicht ist, wird "null" geliefert. * @return ermittelter String oder null * @throws IOException falls ein Lesefehler auftritt */ String scanSubElement() throws IOException { // OptimizeIt // String subE = ""; StringBuilder sb = new StringBuilder(); char ch = getCharT(); if (ch == 0x00) { return null; } while ((ch != myEOS) && // ?:? (ch != myEOE) && // ?+? (ch != myEOL) && (ch != 0x00)) // ?'? { // OptimizeIt // subE = subE + ch; sb.append(ch); ch = getCharT(); } ungetChar(ch); // if (XDebug) MLogger.deb(" SubElement: " + subE); // OptimizeIt // return subE; return sb.toString(); } /** * Ein "Element" (Element) scannen. * * Solange "Unterelemente" (SubElements) scannen und zu einem Vector zusammenbauen bis kein EOS (?:?) mehr kommt. * * Das abschlie?ende Zeichen (EOE (?+?) oder EOL (?'?)) wird nicht mit verarbeitet. * * Falls das Dateiende vor dem Scannen erreicht ist, wird "null" geliefert. * * Das Ergebnis ist ein Vector (Vector of Strings), falls mehr als ein Element vorkommt, sonst ein String * (kein Zeichen => Leer-String). * @return ein Vector of Strings, ein String oder null, wie oben beschrieben * @throws IOException falls ein Lesefehler auftritt */ Object scanElement() throws IOException { String subE; Vector subElements = new Vector(); char ch; int i = 0; ch = getCharT(); if (ch == 0x00) { return null; } ungetChar(ch); // if (XDebug) MLogger.deb(" Element:"); do { i++; subE = scanSubElement(); if (subE != null) { subElements.add(subE); } ch = getCharT(); } while (ch == myEOS); // ?:? ungetChar(ch); // if (XDebug) MLogger.deb(" Element: Ok."); if (i == 1) { return subE; } else { return subElements; } } /** * Eine "Zeile" (Line) scannen. * * Solange "Elemente" scannen und zu Vektoren (Vector of Vector) zusammenbauen bis kein (EOE) ?+? mehr kommt. * * Das abschlie?ende EOL (?'?) wird nicht mit verarbeitet. * * Falls das Dateiende vor dem Scannen erreicht ist, wird "null" geliefert. * * Das Ergebnis ist ein Vector. * @return ein Vector von Elementen oder null, wie oben beschrieben * @throws IOException falls ein Lesefehler auftritt */ Vector scanLine() throws IOException { Object elem; Vector elements = new Vector(); char ch; ch = getCharT(); if (ch == 0x00) { return null; } ungetChar(ch); // if (XDebug) MLogger.deb("Line ..."); do { elem = scanElement(); if (elem != null) { elements.add(elem); } ch = getCharT(); } while (ch == myEOE); // ?+? ungetChar(ch); // if (XDebug) MLogger.deb("Line: Ok."); return elements; } @Override public Object getNewToken() { Object line; char ch; line = null; try { line = scanLine(); ch = getCharT(); if (ch != myEOL) // ?'? { ungetChar(ch); } } catch (IOException e) { } return line; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy