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
|
lbajardsilogic@15
|
18 SparqlResultsReader::SparqlResultsReader(QueryResultsWidget* resultsWidget) :
|
lbajardsilogic@15
|
19 m_resultsWidget(resultsWidget)
|
lbajardsilogic@15
|
20 {}
|
lbajardsilogic@15
|
21
|
lbajardsilogic@15
|
22 bool SparqlResultsReader::parse(const QString & filename)
|
lbajardsilogic@15
|
23 {
|
lbajardsilogic@15
|
24 SparqlResultsHandler handler(m_resultsWidget);
|
lbajardsilogic@15
|
25 QXmlSimpleReader reader;
|
lbajardsilogic@15
|
26 reader.setContentHandler(&handler);
|
lbajardsilogic@15
|
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 {
|
lbajardsilogic@15
|
38 return true;
|
lbajardsilogic@15
|
39 }
|
lbajardsilogic@15
|
40
|
lbajardsilogic@15
|
41 return false;
|
lbajardsilogic@15
|
42 }
|
lbajardsilogic@15
|
43
|
lbajardsilogic@15
|
44 SparqlResultsHandler::SparqlResultsHandler(QueryResultsWidget* resultsWidget) : QXmlDefaultHandler(),
|
lbajardsilogic@15
|
45 m_resultsWidget(resultsWidget),
|
lbajardsilogic@15
|
46 m_inBinding(false),
|
lbajardsilogic@15
|
47 m_curBindingName("")
|
lbajardsilogic@15
|
48 {}
|
lbajardsilogic@15
|
49
|
lbajardsilogic@15
|
50 bool SparqlResultsHandler::startElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@15
|
51 const QString &qName, const QXmlAttributes &attributes)
|
lbajardsilogic@15
|
52 {
|
lbajardsilogic@15
|
53
|
lbajardsilogic@15
|
54 QString name = qName.toLower();
|
lbajardsilogic@15
|
55
|
lbajardsilogic@15
|
56 bool ok = false;
|
lbajardsilogic@15
|
57
|
lbajardsilogic@15
|
58 // Valid element names:
|
lbajardsilogic@15
|
59 //
|
lbajardsilogic@15
|
60 // sparql
|
lbajardsilogic@15
|
61 // head
|
lbajardsilogic@15
|
62 // variable
|
lbajardsilogic@15
|
63 // results
|
lbajardsilogic@15
|
64 // result
|
lbajardsilogic@15
|
65 // binding
|
lbajardsilogic@15
|
66
|
lbajardsilogic@15
|
67 if (name == "sparql") {
|
lbajardsilogic@15
|
68
|
lbajardsilogic@15
|
69 // nothing needed
|
lbajardsilogic@15
|
70 ok = true;
|
lbajardsilogic@15
|
71
|
lbajardsilogic@15
|
72 } else if (name == "head") {
|
lbajardsilogic@15
|
73
|
lbajardsilogic@15
|
74 // nothing needed
|
lbajardsilogic@15
|
75 ok = true;
|
lbajardsilogic@15
|
76
|
lbajardsilogic@15
|
77 } else if (name == "variable") {
|
lbajardsilogic@15
|
78
|
lbajardsilogic@15
|
79 // nothing needed
|
lbajardsilogic@15
|
80 ok = true;
|
lbajardsilogic@15
|
81
|
lbajardsilogic@15
|
82 } else if (name == "results") {
|
lbajardsilogic@15
|
83
|
lbajardsilogic@15
|
84 // nothing needed
|
lbajardsilogic@15
|
85 ok = true;
|
lbajardsilogic@15
|
86
|
lbajardsilogic@15
|
87 } else if (name == "result") {
|
lbajardsilogic@15
|
88
|
lbajardsilogic@15
|
89 m_resultsWidget->newResult();
|
lbajardsilogic@15
|
90 ok = true;
|
lbajardsilogic@15
|
91
|
lbajardsilogic@15
|
92 } else if (name == "binding") {
|
lbajardsilogic@15
|
93
|
lbajardsilogic@15
|
94 m_curBindingName = attributes.value("name");
|
lbajardsilogic@15
|
95 ok = true;
|
lbajardsilogic@15
|
96
|
lbajardsilogic@15
|
97 } else if ( (name == "uri") || (name == "literal") ) {
|
lbajardsilogic@15
|
98 m_inBinding = true;
|
lbajardsilogic@15
|
99 ok = true;
|
lbajardsilogic@15
|
100 }
|
lbajardsilogic@15
|
101
|
lbajardsilogic@15
|
102 if (!ok) {
|
lbajardsilogic@15
|
103 std::cerr << "WARNING: SparqlResultsHandler-XML: Failed to completely process element \""
|
lbajardsilogic@15
|
104 << name.toLocal8Bit().data() << "\"" << std::endl;
|
lbajardsilogic@15
|
105 }
|
lbajardsilogic@15
|
106
|
lbajardsilogic@15
|
107 return true;
|
lbajardsilogic@15
|
108 }
|
lbajardsilogic@15
|
109
|
lbajardsilogic@15
|
110 bool SparqlResultsHandler::endElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@15
|
111 const QString &qName)
|
lbajardsilogic@15
|
112 {
|
lbajardsilogic@15
|
113 QString name = qName.toLower();
|
lbajardsilogic@15
|
114
|
lbajardsilogic@15
|
115 if ( (name == "uri") || (name == "literal") )
|
lbajardsilogic@15
|
116 {
|
lbajardsilogic@15
|
117 m_inBinding = false;
|
lbajardsilogic@15
|
118 m_curBindingName = "";
|
lbajardsilogic@15
|
119
|
lbajardsilogic@15
|
120 } else if (name == "result")
|
lbajardsilogic@15
|
121 {
|
lbajardsilogic@15
|
122 m_resultsWidget->displayResult();
|
lbajardsilogic@15
|
123 }
|
lbajardsilogic@15
|
124
|
lbajardsilogic@15
|
125 return true;
|
lbajardsilogic@15
|
126 }
|
lbajardsilogic@15
|
127
|
lbajardsilogic@15
|
128 bool SparqlResultsHandler::characters(const QString &str)
|
lbajardsilogic@15
|
129 {
|
lbajardsilogic@15
|
130 if (m_inBinding)
|
lbajardsilogic@15
|
131 {
|
lbajardsilogic@15
|
132 m_resultsWidget->addInfo(m_curBindingName, str);
|
lbajardsilogic@15
|
133 }
|
lbajardsilogic@15
|
134
|
lbajardsilogic@15
|
135 return true;
|
lbajardsilogic@15
|
136 }
|
lbajardsilogic@15
|
137
|
lbajardsilogic@15
|
138 bool SparqlResultsHandler::error(const QXmlParseException &exception)
|
lbajardsilogic@15
|
139 {
|
lbajardsilogic@15
|
140 QString errorString;
|
lbajardsilogic@15
|
141 errorString += QString("ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3")
|
lbajardsilogic@15
|
142 .arg(exception.message())
|
lbajardsilogic@15
|
143 .arg(exception.lineNumber())
|
lbajardsilogic@15
|
144 .arg(exception.columnNumber());
|
lbajardsilogic@15
|
145 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@15
|
146 return QXmlDefaultHandler::error(exception);
|
lbajardsilogic@15
|
147 }
|
lbajardsilogic@15
|
148
|
lbajardsilogic@15
|
149 bool SparqlResultsHandler::fatalError(const QXmlParseException &exception)
|
lbajardsilogic@15
|
150 {
|
lbajardsilogic@15
|
151 QString errorString;
|
lbajardsilogic@15
|
152 errorString += QString("FATAL ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3")
|
lbajardsilogic@15
|
153 .arg(exception.message())
|
lbajardsilogic@15
|
154 .arg(exception.lineNumber())
|
lbajardsilogic@15
|
155 .arg(exception.columnNumber());
|
lbajardsilogic@15
|
156 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@15
|
157 return QXmlDefaultHandler::fatalError(exception);
|
lbajardsilogic@15
|
158 }
|