/[kvoss_old]/kvsvv/trunk/src/xmlstreamreader.cpp
ViewVC logotype

Contents of /kvsvv/trunk/src/xmlstreamreader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3719 - (show annotations) (download)
Mon Jul 23 10:26:26 2012 UTC (7 years, 3 months ago) by glennb
File size: 10340 byte(s)
QSettings
1 #include <QtGui>
2 #include <QtXml>
3 #include <iostream>
4 #include <QtXmlPatterns>
5 #include "xmlstreamreader.h"
6 /*Klassen brukes til å finne ut om xmlfila har lovlig struktur. Dette gjøres ved å legge dataene fra xmlfila in i en trestruktur med QXmlStreamReader.
7 Hvis strukturen er ok, hentes observasjonene fra xmlfilene ved å kjøre Xqueries (en spørring for hver parameter)
8 Xqueriene leses fra metadatabasen kvmeta-svv. Statens Vegvesens stasjonsnummere oversettes også til kvalobsstasjonsnummeret ved å spørre kvmeta-svv*/
9
10 XmlStreamReader::XmlStreamReader(QString convertPath1,QString xmlLogFile1,QString databaseName,QString databaseIp,QString port)
11 {
12 canReadFile = true;
13 convertPath = convertPath1;
14 xmlLogFile = xmlLogFile1;
15 this -> databaseName = databaseName;
16 this -> databaseIp = databaseIp;
17 this -> port = port;
18 qDebug() << " convertPath i xmlstreamreader :" <<convertPath;
19 maxLines = 0;
20 }
21
22 XmlStreamReader::~XmlStreamReader()
23 {
24 if(root != NULL){
25 delete root;
26 }
27 }
28
29 QTreeWidgetItem *XmlStreamReader::readFile(const QString &fileName)
30 {
31 // tar vare på xmlfilnavn
32 canReadFile = false;
33 xmlFileName = fileName;
34 QFile file(fileName);
35 if (!file.open(QFile::ReadOnly | QFile::Text)) {
36 std::cerr << "Error: Cannot read file " << qPrintable(fileName)
37 << ": " << qPrintable(file.errorString())
38 << std::endl;
39 //return false;
40 return false;
41 }
42 else
43 {
44 canReadFile = true;
45 return startElements(file,fileName);
46
47 }
48 }
49
50
51
52
53
54
55 QTreeWidgetItem *XmlStreamReader::item(QString name, QTreeWidgetItem* parent=0) {
56 QTreeWidgetItem* retval = new QTreeWidgetItem(parent);
57 retval->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable
58 | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled |
59 Qt::ItemIsEnabled);
60 retval->setText(0, name);
61 return retval;
62 }
63
64
65
66 int XmlStreamReader::deleteNodes2(QTreeWidgetItem *parent)
67 {
68 /*Går igjennom treet av noder rekursivt og sletter alle noder i treet. Starter nederst*/
69
70 if(parent->childCount() >0){
71 int children = parent->childCount();
72 for(int i=0; i<children; i++)
73 {
74 //qDebug() << parent->child(i)->text(0);
75 deleteNodes2(parent->child(i));
76 delete(parent->child(i));
77 if(children > 0){
78 children --;
79 }
80 }
81
82
83 }
84 return 0;
85 }
86
87
88
89
90
91 void XmlStreamReader::XQueries(QString fileName)
92 {
93
94 /*Hvis xmlfila er ok hentes xqueriene fra kvmeta-svv. Oversettelse av Statens Vegvesens stasjonsnummer til kvalobs-stasjonsnummer
95 hentes også fra kvmeta-svv*/
96 qDebug() <<" canReadFile XQuery : " <<canReadFile;
97 if(canReadFile == true){
98
99 qDebug() <<" fileName :" <<fileName <<"\n";
100 QStringList fileL = fileName.split("/");
101 QString fileN = fileL[fileL.size()-1];
102 Stasjon stasjon(fileN,convertPath);
103
104 Eksdb datab(databaseIp,databaseName,port);
105 try{
106 datab.createConnection();
107
108 int nr = datab.numberOfRows("select count(distinct xqueries.id) from xqueries where active='t'"); // antall xqueries i meta-databasen"); // antall xqueries i meta-databasen
109 if(nr > 0){
110 QString param[nr];
111 QString query[nr];
112 datab.querie("select k.kvalobsparamname,x.xquery from xqueries x left join kvalobsparameters k on x.kvalobsparameterid=k.id where x.active = true order by k.kvalobsparamname, x.queryorder asc",&param[0],&query[0] );
113 /*spørring fyller opp param-tabell med kvalobsparametere og query-tabell med tilhørende xqueries*/
114 QString parameterName,xqueryString;
115 parameterName ="";
116 xqueryString ="";
117
118 nrKvalobsId = datab.numberOfRows("select count(distinct id) from stationid_translation_svv_metno");
119 if(nrKvalobsId > 0){
120 QString svvNr[nrKvalobsId];
121 QString kvalobsNr[nrKvalobsId];
122
123
124 QFile file(fileName);
125 QDomDocument doc;
126 doc.setContent(&file, true);
127 QByteArray xmlDoc = doc.toByteArray();
128 QBuffer xmlBuffer(&xmlDoc);
129 if(xmlBuffer.open(QIODevice::ReadOnly)){
130
131 query2.bindVariable("dir", &xmlBuffer);
132
133 datab.querie("select svvstationid,metnostationid from stationid_translation_svv_metno",&svvNr[0],&kvalobsNr[0]);
134
135 for(int i = 0; i < nr; i++){
136 parameterName = param[i];
137 xqueryString = query[i];
138 test(xqueryString,parameterName,fileName,stasjon,svvNr,kvalobsNr);
139 }
140 xmlBuffer.close();
141 }
142 }
143
144 datab.closeConnection();
145
146 qDebug() <<" før utskrift";
147
148
149
150 stasjon.skrivStasjoner(xmlLogFile,createParameterHeader(param,nr));
151
152
153 }
154
155 }catch(const char *message){
156 qDebug() << message;
157 qDebug() <<" feil med håndtering av kvmeta-svv";
158 }
159
160
161 }
162
163
164
165 }
166
167
168
169 QString XmlStreamReader::createParameterHeader(QString *param,int nr)
170 {
171 QString header="";
172 for(int i=0; i < nr; i++){
173 header += param[i];
174 if(i < nr -1)
175 header +=",";
176 }
177 return header;
178
179 }
180
181
182 int XmlStreamReader::indexOfKvalobsNr(QString streng, QString * var, int maxLines)
183 {
184
185 for(int i = 0; i < maxLines; i++){
186 if(streng.trimmed() == var[i].trimmed())
187 return i;
188 }
189 return -1;
190 }
191
192
193
194
195 void XmlStreamReader::test(QString queryString,QString parameterName,QString fileName,Stasjon &stasjon,QString *svvNr,QString *kvalobsNr)
196 {
197
198 query2.setQuery(queryString);
199 QString testOutput;
200 query2.evaluateTo(&testOutput);
201 if(query2.isValid()){
202 collectData(testOutput,fileName,parameterName,stasjon,svvNr,kvalobsNr);
203 }
204
205 }
206
207
208
209
210
211 void XmlStreamReader::nyFeltStasjon(QString stationId,QString tidspunkt,QString parameterValue,QString parameterName,QString nrInKvalobs,Stasjon &stasjon)
212 {
213
214 if(!stasjon.stationInList(stationId)){ //Hvis ikke feltstasjon med id=stationId finnes i lista av feltstasjoner
215 Feltstasjon feltstasjon(stationId);
216 feltstasjon.setKvalobsId(nrInKvalobs);
217 stasjon.leggTilFeltstasjon(feltstasjon); // opprettes det et nytt feltstasjon-objekt med id=stationId, deretter legges det inn i QList feltstasjoner
218 }
219
220 Observasjon obs = stasjon.observasjonIFeltstasjon(tidspunkt,stationId); //finner ut om feltstasjon med stationId har et observasjons-objekt
221 // med måletidspunkt=tidspunkt.
222 if(obs.getMaletidspunkt() == ""){ //Hvis observasjon med måletidspunkt ikke finnes fra før opprettes et observasjons-objekt som legges inn i feltstasjons-objektets
223 // QList observasjoner
224 //obs = new Observasjon(tidspunkt);
225 Observasjon obs2(tidspunkt);
226 obs = obs2;
227
228
229 }
230 stasjon.leggTilObservasjon(stationId,obs,parameterName,parameterValue); //parameter (parameternavn og parameterverdi) legges inn i lista parametere for observasjon med måletidspunkt=tidspunkt for feltstasjon med id=stationId
231
232
233 }
234
235
236 void XmlStreamReader::collectData(QString outString,QString fileName,QString parameterName,Stasjon &stasjon,QString *svvNr,QString *kvalobsNr)
237 {
238
239
240 QStringList liste =outString.split("\n");
241 QString element = "";
242 QStringList liste2;
243 QString stationId,tidspunkt,temperatur;
244
245 for(int i = 0; i < liste.size(); i++){
246 //qDebug() << liste[i] ;
247 element = liste[i];
248 if(element.startsWith(" ")){
249 element = element.remove(0,1);
250 }
251 liste2.clear();
252 //qDebug() <<element <<"\n";
253 liste2 = element.split(" ");
254 if(liste2.size() >= 3){
255 stationId = liste2[0];
256 tidspunkt = liste2[1];
257 temperatur = liste2[2];
258 int index = indexOfKvalobsNr(stationId,svvNr,nrKvalobsId);
259 if(index >=0){
260 QString nrInKvalobs =kvalobsNr[index];
261 if(!stationId.isEmpty() || !tidspunkt.isEmpty() || !temperatur.isEmpty()){
262 nyFeltStasjon(stationId,tidspunkt,temperatur,parameterName,nrInKvalobs,stasjon);
263 }
264 }
265 else{
266 if(!stationId.isEmpty()){
267 Eksdb datab(databaseIp,databaseName,port);
268 QString finnes = "select * from notinkvalobs where svvstationid="+stationId+";";
269 qDebug() <<"finnessql : " << finnes;
270 QString antallSql = "select count(*) from notinkvalobs;";
271 qDebug() << " før stationExistst";
272 if(!datab.stationExists(finnes)){
273 int antallSt = datab.numberOfRows(antallSql);
274 antallSt ++;
275 QVariant antall(antallSt);
276 QString insertSql = "insert into notinkvalobs values('"+antall.toString()+"','"+stationId+"');";
277 qDebug() << "insertSql : " << insertSql;
278 datab.insert(insertSql);
279 }
280 }
281 }
282 }
283 }
284
285
286 }
287
288
289
290
291
292 void XmlStreamReader::start3(QTreeWidgetItem *p){
293 QTreeWidgetItem *newnode = p;
294 while (!reader.atEnd()){
295 reader.readNext();
296 if (reader.isStartElement()){
297 name = reader.name().toString();
298 newnode = item (name,p);
299
300 QXmlStreamAttributes a = reader.attributes();
301 for(int i = 0; i < a.count(); i++){
302 QTreeWidgetItem *childNode = item(a[i].name().toString(),newnode);
303 QString st = a[i].value().toString();
304 childNode->setData(1,0,st);
305 QFont f = childNode->font(0);
306 f.setWeight(QFont::Light);
307 f.setItalic(true);
308 f.setPointSize(f.pointSize()-2);
309 childNode->setFont(0,f);
310 childNode->setFont(1,f);
311 }
312 start3(newnode);
313 }
314 else
315 if (reader.isCharacters()){
316 newnode->setData(1,0,reader.text().toString());
317 }
318 else
319 if (reader.isEndElement()){
320 return;
321 }
322 }
323 }
324
325
326
327 QTreeWidgetItem *XmlStreamReader::startElements(QFile &file,QString fileName)
328 {
329
330
331 canReadFile = true;
332
333 reader.setDevice(&file);
334 reader.readNext();
335 root = item("root");
336
337
338
339 while(!reader.atEnd()){
340
341 start3(root);
342
343 }
344
345
346 file.close();
347 deleteNodes2(root);
348 qDebug() <<" etter deleteNodes2";
349 if(root != NULL){
350 qDebug() <<" deleter root";
351 delete root;
352 root = NULL;
353 }
354 if (reader.hasError()) {
355 std::cerr << "Error: Failed to parse file "
356 << qPrintable(fileName) << ": "
357 << qPrintable(reader.errorString()) << std::endl;
358 canReadFile = false;
359 reader.clear();
360 return NULL;
361 } else if (file.error() != QFile::NoError) {
362 std::cerr << "Error: Cannot read file " << qPrintable(fileName)
363 << ": " << qPrintable(file.errorString())
364 << std::endl;
365
366 canReadFile = false;
367 reader.clear();
368 return NULL;
369 }
370 //return root;
371 reader.clear();
372 //return root;
373 return NULL;
374 }
375
376
377
378
379
380
381
382
383
384
385
386

svn@met.no
ViewVC Help
Powered by ViewVC 1.1.5