From 8992dc8c4359964168da3e9221a31bfe9e4ffe8f Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sat, 17 Jan 2015 15:26:24 +0100 Subject: Improved validation system --- src/core/model/Node.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 3 deletions(-) (limited to 'src/core/model/Node.cpp') diff --git a/src/core/model/Node.cpp b/src/core/model/Node.cpp index 17ee9b3..da83598 100644 --- a/src/core/model/Node.cpp +++ b/src/core/model/Node.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -352,6 +353,63 @@ std::vector Node::resolve(const std::string &name, return resolve(std::vector{name}, type); } +bool Node::doValidate(Logger &logger) const { return true; } + +void Node::invalidate() +{ + // Only perform the invalidation if necessary + if (validationState != ValidationState::UNKNOWN) { + validationState = ValidationState::UNKNOWN; + if (parent != nullptr) { + parent->invalidate(); + } + } +} + +void Node::markInvalid() +{ + // Do not override the validationState if we're currently in the validation + // procedure, try to mark the parent node as invalid + if (validationState != ValidationState::VALIDATING && + validationState != ValidationState::INVALID) { + validationState = ValidationState::INVALID; + if (parent != nullptr) { + parent->markInvalid(); + } + } +} + +bool Node::validate(Logger &logger) const +{ + switch (validationState) { + case ValidationState::UNKNOWN: + validationState = ValidationState::VALIDATING; + try { + if (doValidate(logger)) { + validationState = ValidationState::VALID; + return true; + } + } + catch (OusiaException ex) { + // Make sure the validation state does not stay in the + // "VALIDATING" state + validationState = ValidationState::INVALID; + throw; + } + return false; + case ValidationState::VALID: + return true; + case ValidationState::INVALID: + return false; + case ValidationState::VALIDATING: + // We've run into recursion -- a circular structure cannot be + // properly validated, so return false + logger.error("The given document is cyclic."); + return false; + } + return false; +} + /* RTTI type registrations */ namespace RttiTypes { const Rtti Node = @@ -363,9 +421,10 @@ const Rtti Node = {[](const Variant &value, ousia::Node *obj) { obj->setName(value.asString()); }}}) - .property("parent", {Node, {[](const ousia::Node *obj) { - return Variant::fromObject(obj->getParent()); - }}}); + .property("parent", {Node, + {[](const ousia::Node *obj) { + return Variant::fromObject(obj->getParent()); + }}}); } } -- cgit v1.2.3