lbajardsilogic@15
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@15
|
2
|
lbajardsilogic@15
|
3 /* Sound Access
|
lbajardsilogic@15
|
4 EASAIER client application.
|
lbajardsilogic@15
|
5 Silogic 2007. Laure Bajard.
|
lbajardsilogic@15
|
6
|
lbajardsilogic@15
|
7 This program is free software; you can redistribute it and/or
|
lbajardsilogic@15
|
8 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@15
|
9 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@15
|
10 License, or (at your option) any later version. See the file
|
lbajardsilogic@15
|
11 COPYING included with this distribution for more information.
|
lbajardsilogic@15
|
12 */
|
lbajardsilogic@15
|
13
|
lbajardsilogic@15
|
14 #include "SparqlResultsReader.h"
|
lbajardsilogic@15
|
15
|
lbajardsilogic@15
|
16 #include <iostream>
|
lbajardsilogic@15
|
17
|
benoitrigolleau@280
|
18 SparqlResultsReader::SparqlResultsReader(QueryResultsWidget* resultsWidget) :
|
benoitrigolleau@280
|
19 m_resultsWidget(resultsWidget)
|
benoitrigolleau@280
|
20 {}
|
lbajardsilogic@15
|
21
|
lbajardsilogic@15
|
22 bool SparqlResultsReader::parse(const QString & filename)
|
lbajardsilogic@15
|
23 {
|
benoitrigolleau@280
|
24 SparqlResultsHandler handler(m_resultsWidget);
|
lbajardsilogic@15
|
25 QXmlSimpleReader reader;
|
benoitrigolleau@280
|
26 reader.setContentHandler(&handler);
|
benoitrigolleau@280
|
27 reader.setErrorHandler(&handler);
|
lbajardsilogic@15
|
28
|
lbajardsilogic@15
|
29 QFile file(filename);
|
lbajardsilogic@15
|
30
|
lbajardsilogic@15
|
31 if (!file.open(QFile::ReadOnly | QFile::Text)) {
|
lbajardsilogic@15
|
32 return false;
|
lbajardsilogic@15
|
33 }
|
lbajardsilogic@15
|
34
|
lbajardsilogic@15
|
35 QXmlInputSource xmlInputSource(&file);
|
lbajardsilogic@15
|
36 if (reader.parse(xmlInputSource))
|
lbajardsilogic@15
|
37 {
|
benoitrigolleau@280
|
38 m_resultsWidget->displayResult();
|
lbajardsilogic@15
|
39 return true;
|
lbajardsilogic@15
|
40 }
|
lbajardsilogic@15
|
41
|
lbajardsilogic@15
|
42 return false;
|
lbajardsilogic@15
|
43 }
|
lbajardsilogic@15
|
44
|
benoitrigolleau@280
|
45 SparqlResultsHandler::SparqlResultsHandler(QueryResultsWidget* resultsWidget) : QXmlDefaultHandler(),
|
benoitrigolleau@280
|
46 m_resultsWidget(resultsWidget),
|
benoitrigolleau@280
|
47 m_inBinding(false),
|
benoitrigolleau@280
|
48 m_curBindingName("")
|
benoitrigolleau@280
|
49 {}
|
benoitrigolleau@280
|
50
|
benoitrigolleau@280
|
51 bool SparqlResultsHandler::startElement(const QString &namespaceURI, const QString &localName,
|
benoitrigolleau@280
|
52 const QString &qName, const QXmlAttributes &attributes)
|
benoitrigolleau@280
|
53 {
|
benoitrigolleau@280
|
54
|
benoitrigolleau@280
|
55 QString name = qName.toLower();
|
benoitrigolleau@280
|
56
|
benoitrigolleau@280
|
57 bool ok = false;
|
benoitrigolleau@280
|
58
|
benoitrigolleau@280
|
59 // Valid element names:
|
benoitrigolleau@280
|
60 //
|
benoitrigolleau@280
|
61 // sparql
|
benoitrigolleau@280
|
62 // head
|
benoitrigolleau@280
|
63 // variable
|
benoitrigolleau@280
|
64 // results
|
benoitrigolleau@280
|
65 // result
|
benoitrigolleau@280
|
66 // binding
|
benoitrigolleau@280
|
67
|
benoitrigolleau@280
|
68 if (name == "sparql") {
|
benoitrigolleau@280
|
69
|
benoitrigolleau@280
|
70 // nothing needed
|
benoitrigolleau@280
|
71 ok = true;
|
benoitrigolleau@280
|
72
|
benoitrigolleau@280
|
73 } else if (name == "head") {
|
benoitrigolleau@280
|
74
|
benoitrigolleau@280
|
75 // nothing needed
|
benoitrigolleau@280
|
76 ok = true;
|
benoitrigolleau@280
|
77
|
benoitrigolleau@280
|
78 } else if (name == "variable") {
|
benoitrigolleau@280
|
79
|
benoitrigolleau@280
|
80 // nothing needed
|
benoitrigolleau@280
|
81 ok = true;
|
benoitrigolleau@280
|
82
|
benoitrigolleau@280
|
83 } else if (name == "results") {
|
benoitrigolleau@280
|
84
|
benoitrigolleau@280
|
85 // nothing needed
|
benoitrigolleau@280
|
86 ok = true;
|
benoitrigolleau@280
|
87
|
benoitrigolleau@280
|
88 } else if (name == "result") {
|
benoitrigolleau@280
|
89
|
benoitrigolleau@280
|
90 m_resultsWidget->newResult();
|
benoitrigolleau@280
|
91 ok = true;
|
benoitrigolleau@280
|
92
|
benoitrigolleau@280
|
93 } else if (name == "binding") {
|
benoitrigolleau@280
|
94
|
benoitrigolleau@280
|
95 m_curBindingName = attributes.value("name");
|
benoitrigolleau@280
|
96 ok = true;
|
benoitrigolleau@280
|
97
|
benoitrigolleau@280
|
98 } else if ( (name == "uri") || (name == "literal") ) {
|
benoitrigolleau@280
|
99 m_inBinding = true;
|
benoitrigolleau@280
|
100 ok = true;
|
benoitrigolleau@280
|
101 }
|
benoitrigolleau@280
|
102
|
benoitrigolleau@280
|
103 if (!ok) {
|
benoitrigolleau@280
|
104 std::cerr << "WARNING: SparqlResultsHandler-XML: Failed to completely process element \""
|
benoitrigolleau@280
|
105 << name.toLocal8Bit().data() << "\"" << std::endl;
|
benoitrigolleau@280
|
106 }
|
benoitrigolleau@280
|
107
|
benoitrigolleau@280
|
108 return true;
|
lbajardsilogic@15
|
109 }
|
lbajardsilogic@15
|
110
|
benoitrigolleau@280
|
111 bool SparqlResultsHandler::endElement(const QString &namespaceURI, const QString &localName,
|
benoitrigolleau@280
|
112 const QString &qName)
|
benoitrigolleau@280
|
113 {
|
benoitrigolleau@280
|
114 QString name = qName.toLower();
|
benoitrigolleau@280
|
115
|
benoitrigolleau@280
|
116 if ( (name == "uri") || (name == "literal") )
|
benoitrigolleau@280
|
117 {
|
benoitrigolleau@280
|
118 m_inBinding = false;
|
benoitrigolleau@280
|
119 m_curBindingName = "";
|
benoitrigolleau@280
|
120
|
benoitrigolleau@280
|
121 } else if (name == "result")
|
benoitrigolleau@280
|
122 {
|
benoitrigolleau@280
|
123 /*m_resultsWidget->addInfo("composer", m_composer);
|
benoitrigolleau@280
|
124 m_resultsWidget->addInfo("arranger", m_arranger);
|
benoitrigolleau@280
|
125 m_composer.clear();
|
benoitrigolleau@280
|
126 m_arranger.clear();
|
benoitrigolleau@280
|
127 m_composer.append(" -");
|
benoitrigolleau@280
|
128 m_arranger.append(" -");*/
|
benoitrigolleau@280
|
129
|
benoitrigolleau@280
|
130 m_resultsWidget->saveCurResult();
|
benoitrigolleau@280
|
131 }
|
benoitrigolleau@280
|
132
|
benoitrigolleau@280
|
133 return true;
|
benoitrigolleau@280
|
134 }
|
benoitrigolleau@280
|
135
|
benoitrigolleau@280
|
136 bool SparqlResultsHandler::characters(const QString &str)
|
benoitrigolleau@280
|
137 {
|
benoitrigolleau@280
|
138 if (m_inBinding)
|
benoitrigolleau@280
|
139 {
|
benoitrigolleau@280
|
140 /*if (m_curBindingName.contains("composer"))
|
benoitrigolleau@280
|
141 {
|
benoitrigolleau@280
|
142 m_composer.append(" " + str);
|
benoitrigolleau@280
|
143 }
|
benoitrigolleau@280
|
144 else if (m_curBindingName.contains("arranger"))
|
benoitrigolleau@280
|
145 {
|
benoitrigolleau@280
|
146 m_arranger.append(" " + str);
|
benoitrigolleau@280
|
147 }
|
benoitrigolleau@280
|
148 else
|
benoitrigolleau@280
|
149 {*/
|
benoitrigolleau@280
|
150 m_resultsWidget->addInfo(m_curBindingName, str);
|
benoitrigolleau@280
|
151 //}
|
benoitrigolleau@280
|
152 }
|
benoitrigolleau@280
|
153
|
benoitrigolleau@280
|
154 return true;
|
benoitrigolleau@280
|
155 }
|
benoitrigolleau@280
|
156
|
benoitrigolleau@280
|
157 bool SparqlResultsHandler::error(const QXmlParseException &exception)
|
benoitrigolleau@280
|
158 {
|
benoitrigolleau@280
|
159 QString errorString;
|
benoitrigolleau@280
|
160 errorString += QString("ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3")
|
benoitrigolleau@280
|
161 .arg(exception.message())
|
benoitrigolleau@280
|
162 .arg(exception.lineNumber())
|
benoitrigolleau@280
|
163 .arg(exception.columnNumber());
|
benoitrigolleau@280
|
164 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
benoitrigolleau@280
|
165 return QXmlDefaultHandler::error(exception);
|
benoitrigolleau@280
|
166 }
|
benoitrigolleau@280
|
167
|
benoitrigolleau@280
|
168 bool SparqlResultsHandler::fatalError(const QXmlParseException &exception)
|
benoitrigolleau@280
|
169 {
|
benoitrigolleau@280
|
170 QString errorString;
|
benoitrigolleau@280
|
171 errorString += QString("FATAL ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3")
|
benoitrigolleau@280
|
172 .arg(exception.message())
|
benoitrigolleau@280
|
173 .arg(exception.lineNumber())
|
benoitrigolleau@280
|
174 .arg(exception.columnNumber());
|
benoitrigolleau@280
|
175 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
benoitrigolleau@280
|
176 return QXmlDefaultHandler::fatalError(exception);
|
benoitrigolleau@280
|
177 }
|