summaryrefslogtreecommitdiff
path: root/src/xml
diff options
context:
space:
mode:
Diffstat (limited to 'src/xml')
-rw-r--r--src/xml/XmlAttributeHandler.hpp138
-rw-r--r--src/xml/XmlElementHandler.hpp146
-rw-r--r--src/xml/XmlReader.cpp155
-rw-r--r--src/xml/XmlReader.hpp87
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_ */
-