
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