00001
00006 #include "SzenarioParser.h"
00007 #include "StructureParser.h"
00008
00009 #include "../Konstanten.h"
00010 #include "../Liste.h"
00011 #include "../Spur.h"
00012 #include "../Fehler.h"
00013
00014 #include <qfile.h>
00015 #include <qxml.h>
00016
00017
00024 SzenarioParser::SzenarioParser()
00025 {
00026
00027 }
00028
00029
00030
00031
00032
00045 SzenarioParser::SzenarioParser( char *file, Spur ***spurenArray, Liste *generatorListe, Liste *kreuzungsListe, Liste *fahrzeugeListe )
00046 {
00047 file_ = file;
00048 spurenArrayTmp_ = spurenArray;
00049 generatorListe_ = generatorListe;
00050 kreuzungsListe_ = kreuzungsListe;
00051 fahrzeugeListe_ = fahrzeugeListe;
00052 }
00053
00054
00055
00056
00057
00068 int SzenarioParser::parseXml()
00069 {
00070 int anzahlSpuren;
00071 long int maxID, nextID;
00072 double wahrschLinks = 0, wahrschMitte = 0, wahrschRechts = 0;
00073
00074
00075 anzahlSpuren = countXml();
00076
00077
00078 maxID = getXml();
00079
00080
00081
00082 *spurenArrayTmp_ = new Spur *[anzahlSpuren];
00083 spurenArray_ = *spurenArrayTmp_;
00084
00085
00086
00087
00088 long int *spurenPosition_;
00089 spurenPosition_ = new long int[maxID+1];
00090
00091 for( int i=0; i<=maxID; i++ )
00092 spurenPosition_[i] = -1;
00093
00094
00095 QFile xmlFile( file_ );
00096
00097 if ( !xmlFile.exists() )
00098 {
00099 Fehler *fehler = new Fehler("XML-Datei konnte nicht gefunden werden.");
00100 throw( fehler );
00101 }
00102
00103
00104
00105 StructureParser handler( spurenArray_, spurenPosition_, generatorListe_, kreuzungsListe_, fahrzeugeListe_ );
00106
00107 QXmlInputSource source( &xmlFile );
00108 QXmlSimpleReader speichern;
00109
00110 speichern.setContentHandler( &handler );
00111 try
00112 {
00113 speichern.parse( source );
00114 }
00115 catch(Fehler *fehler)
00116 {
00117 xmlFile.close();
00118 throw( fehler);
00119 }
00120
00121 xmlFile.close();
00122
00123
00124 for( int i = 0; i < anzahlSpuren; i++ )
00125 {
00126
00127
00128 wahrschLinks = spurenArray_[ i ]->gibWahrscheinlichkeit( LINKS );
00129 if( wahrschLinks != 0 )
00130 {
00131 try
00132 {
00133 nextID = spurenArray_[ i ]->gibNachfolgerId( LINKS );
00134 }
00135 catch(Fehler *f)
00136 {
00137 Fehler *fehler = new Fehler("Eine als Nachfolger deklarierte Spur ist in der XML-Datei nicht selbst definiert worden.");
00138 throw( fehler );
00139 }
00140
00141 spurenArray_[ i ]->setzeNaechstesVerbindungselement( spurenArray_[ spurenPosition_[nextID] ] , LINKS, wahrschLinks );
00142 }
00143
00144 wahrschMitte = spurenArray_[ i ]->gibWahrscheinlichkeit( MITTE );
00145 if( wahrschMitte != 0 )
00146 {
00147 try
00148 {
00149 nextID = spurenArray_[ i ]->gibNachfolgerId( MITTE );
00150 }
00151 catch(Fehler *f)
00152 {
00153 Fehler *fehler = new Fehler("Eine als Nachfolger deklarierte Spur ist in der XML-Datei nicht selbst definiert worden.");
00154 throw( fehler );
00155 }
00156
00157 spurenArray_[ i ]->setzeNaechstesVerbindungselement( spurenArray_[ spurenPosition_[nextID] ] , MITTE, wahrschMitte );
00158 }
00159
00160 wahrschRechts = spurenArray_[ i ]->gibWahrscheinlichkeit( RECHTS );
00161 if( wahrschRechts != 0 )
00162 {
00163 try
00164 {
00165 nextID = spurenArray_[ i ]->gibNachfolgerId( RECHTS );
00166 }
00167 catch(Fehler *f)
00168 {
00169 Fehler *fehler = new Fehler("Eine als Nachfolger deklarierte Spur ist in der XML-Datei nicht selbst definiert worden.");
00170 throw( fehler );
00171 }
00172 spurenArray_[ i ]->setzeNaechstesVerbindungselement( spurenArray_[ spurenPosition_[nextID] ] , RECHTS, wahrschRechts );
00173 }
00174 }
00175
00176 return anzahlSpuren;
00177 }
00178
00179
00180
00181
00182
00191 int SzenarioParser::countXml()
00192 {
00193 QFile xmlFile( file_ );
00194
00195 StructureCounter counter;
00196
00197 QXmlInputSource source( &xmlFile );
00198 QXmlSimpleReader zaehlen;
00199
00200 zaehlen.setContentHandler( &counter );
00201 zaehlen.parse( source );
00202
00203 return counter.gibAnzahlSpuren();
00204 }
00205
00206
00207
00208
00209
00218 long int SzenarioParser::getXml()
00219 {
00220 QFile xmlFile( file_ );
00221
00222 StructureGetter getter;
00223
00224 QXmlInputSource source( &xmlFile );
00225 QXmlSimpleReader idLeser;
00226
00227 idLeser.setContentHandler( &getter );
00228 idLeser.parse( source );
00229
00230 return getter.gibMaxId();
00231 }
00232