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_ */ -  | 
