diff options
Diffstat (limited to 'src/xml')
-rw-r--r-- | src/xml/XmlAttributeHandler.hpp | 138 | ||||
-rw-r--r-- | src/xml/XmlElementHandler.hpp | 146 | ||||
-rw-r--r-- | src/xml/XmlReader.cpp | 155 | ||||
-rw-r--r-- | src/xml/XmlReader.hpp | 87 |
4 files changed, 0 insertions, 526 deletions
diff --git a/src/xml/XmlAttributeHandler.hpp b/src/xml/XmlAttributeHandler.hpp deleted file mode 100644 index 8fae6c3..0000000 --- a/src/xml/XmlAttributeHandler.hpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef _OUSIA_XML_XML_ATTRIBUTE_HANDLER_HPP_ -#define _OUSIA_XML_XML_ATTRIBUTE_HANDLER_HPP_ - -#include <functional> -#include <string> - -namespace ousia { -namespace xml { - -/** - * The attribute handler class is responsible for handling attributes. It - * performs type checks and conversion. Note that the name of the attribute is - * not stored inside the handler, as the attribute handlers are meant to be used - * alongside a map. - */ -class XmlAttributeHandler { - -private: - /** - * Specifies whether this attribute was actually handled (set to true once - * the setter is called). - */ - bool handled; - - /** - * Specifies whether this attribute is required or not. - */ - bool required; - - /** - * Function which returns true if the given string is a valid entry for the - * type the attribute handler represents. - */ - std::function<bool(const std::string&)> valid; - - /** - * Function which gets the attribute value and sets the type. - */ - std::function<void(const std::string&)> setter; - - /** - * Default value (as string) that should be used if no other value for that - * attribute is given. - */ - const char *defaultValue; - -public: - - /** - * Constructor of the XmlAttributeHandler class. - * - * @param required if true, the attribute is marked as "required" and it - * must occur in the xml. - * @param valid is a function reference which specifies whether the given - * string is valid. - * @param setter is the function that is meant to actually set the value - * of the attached class. - * @param defaultValue if given (it does not equal the nullptr), the setter - * is automatically called with the default value, unless the attribute is - * actually specified in the XML. - */ - XmlAttributeHandler(bool required, - const std::function<bool(const std::string&)> &valid, - const std::function<void(const std::string&)> &setter, - const char *defaultValue = nullptr) : - handled(false), required(required), valid(valid), setter(setter), - defaultValue(defaultValue) - { - // Do nothing here - } - - /** - * Returns true if the given value for this attribute is valid. - */ - bool isValid(const std::string &value) - { - return valid(value); - } - - /** - * Calls the setter with the given value. The value should have been checked - * for validity first. - */ - void executeSettter(const std::string &value) - { - handled = true; - setter(value); - } - - /** - * Returns true if this element is required. - */ - bool isRequired() - { - return required; - } - - /** - * Returns the default value. - */ - const char* getDefaultValue() - { - return defaultValue; - } - - /** - * Returns true if the attribute was handled. - */ - bool isHandled() - { - return handled; - } - -}; - -} -} - -#endif /* _OUSIA_XML_XML_ATTRIBUTE_HANDLER_HPP_ */ - diff --git a/src/xml/XmlElementHandler.hpp b/src/xml/XmlElementHandler.hpp deleted file mode 100644 index 5d35b36..0000000 --- a/src/xml/XmlElementHandler.hpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_ -#define _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_ - -#include <functional> - -namespace ousia { -namespace xml { - -/** - * Structure used internally for representing a function that is capable of - * handling a certain xml element tag. - */ -class XmlElementHandler { - -private: - /** - * Name of the XML element the handler is capable of handling. - */ - const char *name; - - /** - * Handler function. - */ - std::function<bool()> handler; - - /** - * Counter that can be used in order to realize elements that may only - * appear a certain number of times. - */ - int count; - - /** - * Contains the current count of matches. Contains the maximum count a - * certain element must appear. If -1 the element may appear a unlimited - * number of times. - */ - int maxCount; - - /** - * A certain other handler this one depends on (the other element must have - * appeared at least once in order for this handler to match). If set to - * nullptr no requirement relationship is established. - */ - const XmlElementHandler *requiredElement; - -public: - - /** - * Constructor of the XmlElementHandler structure. - */ - XmlElementHandler(const char *name, const std::function<bool()> &handler, - int maxCount = -1, const XmlElementHandler *requiredElement = nullptr) : - name(name), handler(handler), count(0), maxCount(maxCount), - requiredElement(requiredElement) - { - // Do nothing here - } - - /** - * Returns the name of the handler. - */ - const char* getName() const - { - return name; - } - - /** - * Returns true if this handler is currently valid. - */ - bool valid() const - { - return ((maxCount < 0) || (count < maxCount)) - && (!requiredElement || (requiredElement->count > 0)); - } - - /** - * Returns true if this handler matches the current state of the given - * QXmlStreamReader. - */ - template<typename StrType> - bool matches(const StrType &tagName) const - { - return valid() && (tagName == name); - } - - /** - * Executes the given handler. - */ - bool execute() - { - count++; - return handler(); - } - - /** - * Function which assembles a string containing the names of the expected - * element types. Used for displaying error messages. - */ - static std::string expectedElementsStr(const std::vector<XmlElementHandler> &handlers) - { - // Calculate a list of valid element handlers - std::vector<const XmlElementHandler*> validHandlers; - for (auto &h : handlers) { - if (h.valid()) { - validHandlers.push_back(&h); - } - } - - // Assemble the string containing the list of expected elements - std::stringstream ss; - bool first = true; - for (auto &h : validHandlers) { - if (!first) { - ss << ", "; - } - ss << h->getName(); - first = false; - } - return ss.str(); - } - -}; - -} -} - -#endif /* _OUSIA_XML_XML_ELEMENT_HANDLER_HPP_ */ - diff --git a/src/xml/XmlReader.cpp b/src/xml/XmlReader.cpp deleted file mode 100644 index 06090d2..0000000 --- a/src/xml/XmlReader.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <QXmlStreamReader> - -#include <functional> -#include <iostream> -#include <sstream> - -#include "XmlAttributeHandler.hpp" -#include "XmlElementHandler.hpp" -#include "XmlReader.hpp" - -namespace ousia { -namespace xml { - -XmlReader::XmlReader(QXmlStreamReader &xml) : - xml(xml) -{ - // Do nothing here -} - -bool XmlReader::expectOneOf(std::vector<XmlElementHandler> &handlers) -{ - // Skip all tokens except for "start element" and "end element" - while (!xml.atEnd()) { - // TODO: Implement mechanism for using the current state of the - // XmlStreamReader instead of always reading the next token? - const auto tokenType = xml.readNext(); - switch (tokenType) { - case QXmlStreamReader::StartElement: - for (auto &h : handlers) { - if (h.matches(xml.name())) { - return h.execute(); - } - } - // Expected tag was not found, display error message - // TODO: Use better logging mechanism! - std::cout << "Expected one of the following tags: (" - << XmlElementHandler::expectedElementsStr(handlers) - << "); but found element \"" - << xml.name().toString().toStdString() - << "\" instead!" << std::endl; - return false; - /* This is Benjamins noob way of handling things: We just ignore them. - case QXmlStreamReader::EndElement: - // Expected tag was not found, instead we found a closing tag! - // TODO: Use better logging mechanism! - std::cout << "Expected one of the following tags: (" - << XmlElementHandler::expectedElementsStr(handlers) - << "); but found end of element \"" - << xml.name().toString().toStdString() - << "\" instead!" << std::endl; - return false;*/ - default: - continue; - } - } - return false; -} - -bool XmlReader::parseArguments(std::map<std::string, XmlAttributeHandler> &handlers) -{ - // Iterate the attributes of the current xml node - for (auto &attr : xml.attributes()) { - // Convert the name to a std string - const std::string name = attr.name().toString().toStdString(); - const std::string value = attr.value().toString().toStdString(); - - // Try to fetch a corresponding attribute in the handlers map - auto it = handlers.find(name); - if (it != handlers.end()) { - XmlAttributeHandler &handler = (*it).second; - if (handler.isValid(value)) { - handler.executeSettter(value); - } else { - std::cout << "Invalid attribute value \"" << value - << "\" for attribute " << name << std::endl; - return false; - } - } else { - std::cout << "Unexpected attribute " << name << std::endl; - return false; - } - } - - // Iterate over all handlers to check whether all required handlers have - // been handled and in order to pass the default value to unhandled handlers - for (auto &it : handlers) { - // Fetch the name of the attribute and the handler - const std::string &name = it.first; - XmlAttributeHandler &handler = it.second; - if (!handler.isHandled()) { - if (handler.isRequired()) { - std::cout << "Attribute " << name - << " is required but was not set!" << std::endl; - return false; - } else if (handler.getDefaultValue()) { - handler.executeSettter(handler.getDefaultValue()); - } - } - } - - return true; -} - -std::shared_ptr<model::GraphNode> XmlReader::process() -{ - std::shared_ptr<model::GraphNode> res{nullptr}; - std::vector<XmlElementHandler> handlers{ - {"domain", [&](){return (res = this->readDomain()) != nullptr;}} - }; - if (!expectOneOf(handlers)) { - std::cout << "Errors occured while parsing XML file!" << std::endl; - return nullptr; - } - return res; -} - -std::shared_ptr<model::domain::Domain> XmlReader::readDomain() -{ - std::shared_ptr<model::domain::Domain> res{new model::domain::Domain()}; - std::map<std::string, XmlAttributeHandler> handlers{ - std::make_pair("name", XmlAttributeHandler( - true, - [&](const std::string& v) -> bool {return true;}, - [&](const std::string& v) -> void {res->setName(v);} - )) - }; - if (!parseArguments(handlers)) { - std::cout << "Errors while parsing arguments for domain node!" << std::endl; - return nullptr; - } - std::cout << res->getName() << std::endl; - return res; -} - -} -} - diff --git a/src/xml/XmlReader.hpp b/src/xml/XmlReader.hpp deleted file mode 100644 index f9b949b..0000000 --- a/src/xml/XmlReader.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - Ousía - Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef _OUSIA_XML_XML_READER_HPP_ -#define _OUSIA_XML_XML_READER_HPP_ - -#include <map> -#include <memory> -#include <string> -#include <vector> - -#include <model/GraphNode.hpp> -#include <model/domain/Domain.hpp> - -class QXmlStreamReader; - -namespace ousia { -namespace xml { - -class XmlElementHandler; -class XmlAttributeHandler; - -/** - * The XmlReader class is responsible for parsing the ousia XML documents and - * deserializing them into the internal object representation. - */ -class XmlReader { - -private: - /** - * Reference to the QXmlStreamReader used for accessing the XML data on a - * token basis. - */ - QXmlStreamReader &xml; - - /** - * Parses a domain definition from the XML file. - */ - std::shared_ptr<model::domain::Domain> readDomain(); - - /** - * Used internally in order to conveniently expect one xml tag in a set of - * elements. Returns true if there was an error while waiting for the tag, - * false otherwise. - */ - bool expectOneOf(std::vector<XmlElementHandler> &handlers); - - /** - * Used internally to parse the current argument map. - */ - bool parseArguments(std::map<std::string, XmlAttributeHandler> &handlers); - -public: - - /** - * Instanciates the XMLReader class for the given instance of the - * QXMLStreamReader class. - */ - XmlReader(QXmlStreamReader &xml); - - /** - * Starts processing the xml and returns the generated graph node. - */ - std::shared_ptr<model::GraphNode> process(); - -}; - -} -} - -#endif /* _OUSIA_XML_XML_READER_HPP_ */ - |