de.bsvrz.pat.datgen.generator.xmlParser
Class SaxHandler

java.lang.Object
  extended by org.xml.sax.helpers.DefaultHandler
      extended by de.bsvrz.pat.datgen.generator.xmlParser.SaxHandler
All Implemented Interfaces:
ContentHandler, DTDHandler, EntityResolver, ErrorHandler

public class SaxHandler
extends DefaultHandler

SAX-Handler für den Zugriff auf die XML-Datei. Datensätze können Felder und Listen (im folgenden NonPlains genannt) enthalten. Würde man die XML-Datei "von Hand" verarbeiten, so hätte eine Methode datenVerarbeiten wohl einen rekursiven Aufbau (vgl DataGenerator.DataCycler#setRandomData:


 IF (tag == "attribut") THEN
                // Wert aus XML-Datei lesen
 ELSE IF (tag == "feld") THEN
                FOR ALL (Feldelemente) DO
                        datenVerarbeiten();
                ENDFOR
 ELSE IF (tag == "liste") THEN
                FOR EACH (listenelement) DO
                        datenVerarbeiten();
                ENDFOR
 ENDIF
 

Durch die Art des Einlesens der XML-Datei mit dem SAX-Parser (jedes Lesen eines Start-/Ende-Tags löst Aufruf einer der hier zu findenden Call-Back-Methoden aus), ist das rekursive Abarbeiten nicht möglich ==> Über einen Stack wird erreicht, daß die Zuordnung der eingelesenen Attribute zu den richtigen Einträgen in der rekursiven Datenstruktur gelingt:

Ein Datensatz vom Typ Data wird "lazy" erzeugt, d. h. enthält er ein NonPlain, so wird beim Erzeugen eines Data lediglich eine "flacher" Datenstruktur erzeugt, in die wiederum Datas für die NonPlains eingesetzt werden, die wiederum Datas für NonPlains enthalten können usw.

Die o. g. zunächst erzeugte flache Datenstruktur ist data. Jedes weitere für NonPlains erzeugte Data wird auf einen Stack gelegt. Durch readTop() wird nun erreicht, daß beim Einlesen eines Attributs immer das Data-Element gefüllt wird, welches sich gerade in Bearbeitung befindet, d. h. der Stack bildet das "Gedächtnis" des Parsers und "aus Sicht der Attribute" ist nur dieses Data-Element bekannt, wie es auch in einer rekursiven Methode der Fall wäre.

Author:
Kappich Systemberatung

Field Summary
private  Aspect asp
          Aspekt
private  AttributeGroup atg
          Attributgruppe
private static int BEFORE_PROTOCOL
          Konstante: Man befindet sich vor dem "Protokoll"-Tag
private static int BEHIND_PROTOCOL
          Konstante: Man befindet sich hinter dem "Protokoll"-Tag.
private  long blockTime
          Gewünschter Sendezeitpunkt für einen Datenblock
private static ClientDavInterface connection
          Verbindung zum DaV
private  Data data
          Datenelement
private  DataGenerator dataGenerator
          Aufrufender Datengenerator
private  DataModel dataModel
          Das benutzte Datenmodell der Applikation
private  DataDescription dd
          Datenbeschreibung (bestehend aus Attributgruppe, Aspekt und Simulationsvariante)
private static Debug debug
          Der Debug-Logger der Klasse
private  boolean hasNoData
          Zeigt an, ob ein Telegramm Daten enthält
private  boolean hasNoSource
          Zeigt an, ob momentan Quelle für das entsprechende Objekt existiert
private  boolean hasObjects
          Gibt an, ob beim Aufruf des Datengenerators Objekte angegeben wurden oder nicht
private  long historicalBlockTime
          Zeitstempel des Blocks in der XML-Datei
private  long historicalOffset
          Offset vom Block zur Startzeit in der XML-Datei
private  long historicalStartTime
          Historische Startzeit (d.
private  long historicalTimeStamp
          Zeit des historischen Zeitstempels
private  int i
           
private static int IN_BLOCK
          Konstante: Man befindet sich im "Block"-Tag.
private static int IN_BODY
          Konstante: Man befindet sich im "Koerper"-Tag.
private static int IN_HEADER
          Konstante: Man befindet sich im "Kopf"-Tag
private static int IN_PROTOCOL
          Konstante: Man befindet sich im "Protokoll"-Tag.
private static int IN_RECORD
          Konstante: Man befindet sich im "Datensatz"-Tag.
private  boolean isDelayed
          Zeigt an, ob ein Datensatz als nachgesendet gekennzeichnet ist
private  boolean isInVerify
          true wenn sich der XML-Parser im Verifizierungsschritt befindet.
private  LinkedList itemStack
          Stack für die Verarbeitung von geschachtelten Data-Objekten
private static int NACH_HEADER
          Konstante: Man befindet sich hinter dem "Kopf"-Tag.
private  int numberOfRecords
          Anzahl der geparsten Datensätze
private  SystemObject object
          Objekt
private  long offset
          Zeitunterschied zwischen Startzeit in der XML-Datei und aktueller Startzeit der Applikation
private  List requestedObjects
          Objekte, für die Daten aus der XML-Datei ausgelesen werden sollen
private  LinkedList requestedResults
          Datensatz eines der vom Anwender erwünschte Objekte, welcher in der XML-Datei gefunden wurde
private  ResultData[] results
          Das aus der XML-Datei gelesene Telegramm
private  SendInterface sendQueue
          Die Sende-Queue des SAX-Handlers
private  short simVariant
          Simulationsvariante
private  boolean simVariantExplicitlySet
          Zeigt an, ob die Simulationsvariante explizit aus der XML-Datei gelesen wurde oder nicht
private  long startTime
          Startzeit der Applikation
private  int state
          Status des SAX-Handlers
private  long timeStamp
          Zeitstempel
private  int timeStampOption
          Zeitstempel-Option: Zeitstempel der Daten aus der XML-Datei wird beim Einspielen der Daten entweder übernommen oder aber die Daten werden in die Jetztzeit verschoben.
 
Constructor Summary
SaxHandler()
          Creates a new instance of SaxHandler
 
Method Summary
 void characters(char[] ch, int start, int length)
          Callback-Methode für die Verarbeitung von Characters.
 void endDocument()
          Ende des Dokuments erreicht
 void endElement(String uri, String localName, String qName)
          Ende-Tag gefunden.
 void error(SAXParseException e)
          Fehler
 void fatalError(SAXParseException e)
          Schwerer Fehler
private  void makeSubscriptions(String argumentString)
          "-rolle"-, "-objekte"- und "-daten"-Einträge aus der XML-Datei auswerten und entsprechende Anmeldungen durchführen.
private  Data popItem()
          Oberstes Element des Data-Stacks lesen
private  void pushItem(Data item)
          Neues Data auf den Stack der Daten-Elemente legen
private  Data readTop()
          Oberstes Element des Data-Stacks lesen, ohne es vom Stack zu entfernen
 InputSource resolveEntity(String publicId, String systemId)
           
 void setConnection(ClientDavInterface cdi)
          Die DaV-Verbindung der Applikation im SAX-Handler eintragen
 void setDataGenerator(DataGenerator dg)
          Den Datengenerator im SAX-Handler eintragen
 void setDataModel(DataModel dm)
          Das Datenmodell der Applikation im SAX-Handler eintragen
 void setIsInVerify(boolean iiv)
          Festlegen, ob sich der Parser in der Verifizierung befindet
 void setRequestedObjects(List objects)
          Die angeforderten Datenobjekte der Applikation im SAX-Handler eintragen
 void setSendQueue(SendInterface sq)
          Sende-Queue der Applikation im SAX-Handler eintragen (in diesen werden die aus der XML-Datei gelesenen Telegramme geschrieben, so daß sie vom Sende-Thread verschickt werden können)
 void setTimeStampOption(int tso)
          Option für den Zeitstempel setzen: Entweder werden die Daten mit den originalen Zeitstempeln wieder eingespielt oder in die Jetztzeit verschoben
 void skippedEntity(String name)
           
 void startDocument()
          Callback-Methode für Start des XML-Dokuments
 void startElement(String uri, String localName, String qName, Attributes attributes)
          Start-Tag gefunden.
 void warning(SAXParseException e)
          Warnung
 
Methods inherited from class org.xml.sax.helpers.DefaultHandler
endPrefixMapping, ignorableWhitespace, notationDecl, processingInstruction, setDocumentLocator, startPrefixMapping, unparsedEntityDecl
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

debug

private static final Debug debug
Der Debug-Logger der Klasse


BEFORE_PROTOCOL

private static final int BEFORE_PROTOCOL
Konstante: Man befindet sich vor dem "Protokoll"-Tag

See Also:
Constant Field Values

IN_PROTOCOL

private static final int IN_PROTOCOL
Konstante: Man befindet sich im "Protokoll"-Tag.

See Also:
Constant Field Values

IN_HEADER

private static final int IN_HEADER
Konstante: Man befindet sich im "Kopf"-Tag

See Also:
Constant Field Values

NACH_HEADER

private static final int NACH_HEADER
Konstante: Man befindet sich hinter dem "Kopf"-Tag.

See Also:
Constant Field Values

IN_BODY

private static final int IN_BODY
Konstante: Man befindet sich im "Koerper"-Tag.

See Also:
Constant Field Values

IN_BLOCK

private static final int IN_BLOCK
Konstante: Man befindet sich im "Block"-Tag.

See Also:
Constant Field Values

IN_RECORD

private static final int IN_RECORD
Konstante: Man befindet sich im "Datensatz"-Tag.

See Also:
Constant Field Values

BEHIND_PROTOCOL

private static final int BEHIND_PROTOCOL
Konstante: Man befindet sich hinter dem "Protokoll"-Tag.

See Also:
Constant Field Values

dataGenerator

private DataGenerator dataGenerator
Aufrufender Datengenerator


hasObjects

private boolean hasObjects
Gibt an, ob beim Aufruf des Datengenerators Objekte angegeben wurden oder nicht


isDelayed

private boolean isDelayed
Zeigt an, ob ein Datensatz als nachgesendet gekennzeichnet ist


isInVerify

private boolean isInVerify
true wenn sich der XML-Parser im Verifizierungsschritt befindet.


results

private ResultData[] results
Das aus der XML-Datei gelesene Telegramm


blockTime

private long blockTime
Gewünschter Sendezeitpunkt für einen Datenblock


object

private SystemObject object
Objekt


dd

private DataDescription dd
Datenbeschreibung (bestehend aus Attributgruppe, Aspekt und Simulationsvariante)


atg

private AttributeGroup atg
Attributgruppe


asp

private Aspect asp
Aspekt


simVariant

private short simVariant
Simulationsvariante


simVariantExplicitlySet

private boolean simVariantExplicitlySet
Zeigt an, ob die Simulationsvariante explizit aus der XML-Datei gelesen wurde oder nicht


timeStamp

private long timeStamp
Zeitstempel


data

private Data data
Datenelement


hasNoData

private boolean hasNoData
Zeigt an, ob ein Telegramm Daten enthält


hasNoSource

private boolean hasNoSource
Zeigt an, ob momentan Quelle für das entsprechende Objekt existiert


historicalBlockTime

private long historicalBlockTime
Zeitstempel des Blocks in der XML-Datei


historicalOffset

private long historicalOffset
Offset vom Block zur Startzeit in der XML-Datei


historicalStartTime

private long historicalStartTime
Historische Startzeit (d. h. Startzeit in der XML-Datei)


historicalTimeStamp

private long historicalTimeStamp
Zeit des historischen Zeitstempels


offset

private long offset
Zeitunterschied zwischen Startzeit in der XML-Datei und aktueller Startzeit der Applikation


startTime

private long startTime
Startzeit der Applikation


state

private int state
Status des SAX-Handlers


numberOfRecords

private int numberOfRecords
Anzahl der geparsten Datensätze


dataModel

private DataModel dataModel
Das benutzte Datenmodell der Applikation


connection

private static ClientDavInterface connection
Verbindung zum DaV


sendQueue

private SendInterface sendQueue
Die Sende-Queue des SAX-Handlers


requestedResults

private LinkedList requestedResults
Datensatz eines der vom Anwender erwünschte Objekte, welcher in der XML-Datei gefunden wurde


itemStack

private LinkedList itemStack
Stack für die Verarbeitung von geschachtelten Data-Objekten


requestedObjects

private List requestedObjects
Objekte, für die Daten aus der XML-Datei ausgelesen werden sollen


timeStampOption

private int timeStampOption
Zeitstempel-Option: Zeitstempel der Daten aus der XML-Datei wird beim Einspielen der Daten entweder übernommen oder aber die Daten werden in die Jetztzeit verschoben.


i

private int i
Constructor Detail

SaxHandler

public SaxHandler()
Creates a new instance of SaxHandler

Method Detail

characters

public void characters(char[] ch,
                       int start,
                       int length)
                throws SAXException
Callback-Methode für die Verarbeitung von Characters.

Specified by:
characters in interface ContentHandler
Overrides:
characters in class DefaultHandler
Parameters:
ch - Feld mit den erparsten chars
start - Startposition
length - Länge des Feldes
Throws:
SAXException - bei Problemen

endDocument

public void endDocument()
                 throws SAXException
Ende des Dokuments erreicht

Specified by:
endDocument in interface ContentHandler
Overrides:
endDocument in class DefaultHandler
Throws:
SAXException - bei Problemen

endElement

public void endElement(String uri,
                       String localName,
                       String qName)
                throws SAXException
Ende-Tag gefunden.

Specified by:
endElement in interface ContentHandler
Overrides:
endElement in class DefaultHandler
Parameters:
uri - URI des Tags
localName - Bezeichner
qName - Qualifizierter Name
Throws:
SAXException - bei Problemen

error

public void error(SAXParseException e)
           throws SAXException
Fehler

Specified by:
error in interface ErrorHandler
Overrides:
error in class DefaultHandler
Parameters:
e - Den Fehler auslösende Exception
Throws:
SAXException - bei Problemen

fatalError

public void fatalError(SAXParseException e)
                throws SAXException
Schwerer Fehler

Specified by:
fatalError in interface ErrorHandler
Overrides:
fatalError in class DefaultHandler
Parameters:
e - Den fatalen Fehler auslösende Exception
Throws:
SAXException - bei Problemen

setConnection

public void setConnection(ClientDavInterface cdi)
Die DaV-Verbindung der Applikation im SAX-Handler eintragen

Parameters:
cdi - Die DaV-Verbindung der Applikation

setDataGenerator

public void setDataGenerator(DataGenerator dg)
Den Datengenerator im SAX-Handler eintragen

Parameters:
dg - DataGenerator, von dem aus u. a. dieses Objekt der Klasse SaxHandler gestartet wurde.

setDataModel

public void setDataModel(DataModel dm)
Das Datenmodell der Applikation im SAX-Handler eintragen

Parameters:
dm - Das Datenmodell der Applikation

setIsInVerify

public void setIsInVerify(boolean iiv)
Festlegen, ob sich der Parser in der Verifizierung befindet

Parameters:
iiv - True, wenn in der Verifizierung, sonst False

setRequestedObjects

public void setRequestedObjects(List objects)
Die angeforderten Datenobjekte der Applikation im SAX-Handler eintragen

Parameters:
objects - Die gewünschten Objekte

setSendQueue

public void setSendQueue(SendInterface sq)
Sende-Queue der Applikation im SAX-Handler eintragen (in diesen werden die aus der XML-Datei gelesenen Telegramme geschrieben, so daß sie vom Sende-Thread verschickt werden können)

Parameters:
sq - Die Sende-Queue

skippedEntity

public void skippedEntity(String name)
                   throws SAXException
Specified by:
skippedEntity in interface ContentHandler
Overrides:
skippedEntity in class DefaultHandler
Throws:
SAXException

startDocument

public void startDocument()
                   throws SAXException
Callback-Methode für Start des XML-Dokuments

Specified by:
startDocument in interface ContentHandler
Overrides:
startDocument in class DefaultHandler
Throws:
SAXException - bei Problemen

startElement

public void startElement(String uri,
                         String localName,
                         String qName,
                         Attributes attributes)
                  throws SAXException
Start-Tag gefunden.

Specified by:
startElement in interface ContentHandler
Overrides:
startElement in class DefaultHandler
Parameters:
uri - URI des Tags
localName - Bezeichner
qName - Qualifizierter Name
attributes - Liste der Attribute des Tags
Throws:
SAXException - bei Problemen

setTimeStampOption

public void setTimeStampOption(int tso)
Option für den Zeitstempel setzen: Entweder werden die Daten mit den originalen Zeitstempeln wieder eingespielt oder in die Jetztzeit verschoben

Parameters:
tso - Gibt an, ob die Daten mit den originalen Zeitstempeln wieder eingespielt oder in die Jetztzeit verschoben werden sollen.

warning

public void warning(SAXParseException e)
             throws SAXException
Warnung

Specified by:
warning in interface ErrorHandler
Overrides:
warning in class DefaultHandler
Parameters:
e - Die Warnung auslösende Exception
Throws:
SAXException - bei Problemen

readTop

private Data readTop()
Oberstes Element des Data-Stacks lesen, ohne es vom Stack zu entfernen

Returns:
Data-Element, welches zuoberst auf dem Stack liegt

makeSubscriptions

private void makeSubscriptions(String argumentString)
"-rolle"-, "-objekte"- und "-daten"-Einträge aus der XML-Datei auswerten und entsprechende Anmeldungen durchführen. Andere in der Datei festgehaltene Parameter werden ignoriert.

Parameters:
argumentString - String mit den Aufrufparametern, die in der XML-Datei gespeichert sind.

popItem

private Data popItem()
Oberstes Element des Data-Stacks lesen

Returns:
Data-Element, welches zuoberst auf dem Stack liegt

pushItem

private void pushItem(Data item)
Neues Data auf den Stack der Daten-Elemente legen

Parameters:
item - Datenelement, welches auf den Stack gelegt wird

resolveEntity

public InputSource resolveEntity(String publicId,
                                 String systemId)
                          throws SAXException,
                                 IOException
Specified by:
resolveEntity in interface EntityResolver
Overrides:
resolveEntity in class DefaultHandler
Throws:
SAXException
IOException