From 79d3e2bdfd441d6eba2f22af78d5bea5e488daf1 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Fri, 30 May 2014 22:19:32 +0200 Subject: Rewrote error handling based on exceptions * ErrorHandler is replaced by ErrorCapacitor ** temporarily registers itself as both the ProblemListener and ErrorHandler of a given XalanTransformer instance ** deregisters itself on destruction ** collects all problems and errors during its lifetime inside a internal std::vector instance ** if this instance is not empty it is thrown contained within a ErrorCapacitor::exception by the member method ErrorCapacitor::discharge * this enables using the same code for handling transformation compilation and generation errors and problems * updated test frontend accordingly --- src/support/error_capacitor.cc | 107 +++++++++++++++++++++++++++++++++++++++++ src/support/error_capacitor.h | 81 +++++++++++++++++++++++++++++++ src/support/error_handler.cc | 107 ----------------------------------------- src/support/error_handler.h | 67 -------------------------- 4 files changed, 188 insertions(+), 174 deletions(-) create mode 100644 src/support/error_capacitor.cc create mode 100644 src/support/error_capacitor.h delete mode 100644 src/support/error_handler.cc delete mode 100644 src/support/error_handler.h (limited to 'src/support') diff --git a/src/support/error_capacitor.cc b/src/support/error_capacitor.cc new file mode 100644 index 0000000..e83ba9a --- /dev/null +++ b/src/support/error_capacitor.cc @@ -0,0 +1,107 @@ +#include "error_capacitor.h" + +#include + +#include + +#include "support/xalan_string.h" +#include "support/xerces_string_guard.h" + +namespace { + +inline std::string getMessage(const xercesc::SAXParseException& exception) { + return std::string( + *InputXSLT::XercesStringGuard(exception.getMessage()) + ); +} + +} + +namespace InputXSLT { + +ErrorCapacitor::ErrorCapacitor(xalan::XalanTransformer* transformer): + transformer_(transformer), + error_cache_(new error_cache()) { + this->transformer_->setErrorHandler(this); + this->transformer_->setProblemListener(this); +} + +ErrorCapacitor::~ErrorCapacitor() { + this->transformer_->setErrorHandler(nullptr); + this->transformer_->setProblemListener(nullptr); +} + +void ErrorCapacitor::discharge() { + if ( !this->error_cache_->empty() ) { + throw exception(std::move(this->error_cache_)); + } +} + +void ErrorCapacitor::warning(const xercesc::SAXParseException& exception) { + this->error_cache_->emplace_back( + "Warning: " + getMessage(exception) + ); +} + +void ErrorCapacitor::error(const xercesc::SAXParseException& exception) { + this->error_cache_->emplace_back( + "Error: " + getMessage(exception) + ); +} + +void ErrorCapacitor::fatalError(const xercesc::SAXParseException& exception) { + this->error_cache_->emplace_back( + "Fatal error: " + getMessage(exception) + ); +} + +void ErrorCapacitor::resetErrors() { } + +void ErrorCapacitor::problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanDOMString& message, + const xalan::Locator*, + const xalan::XalanNode* +) { + this->error_cache_->emplace_back( + "XSLT problem: " + toString(message) + ); +} + +void ErrorCapacitor::problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanNode*, + const xalan::ElemTemplateElement*, + const xalan::XalanDOMString& message, + const xalan::XalanDOMChar*, + xalan::XalanFileLoc, + xalan::XalanFileLoc +) { + this->error_cache_->emplace_back( + "XSLT problem: " + toString(message) + ); +} + +void ErrorCapacitor::problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanDOMString& message, + const xalan::XalanNode* +) { + this->error_cache_->emplace_back( + "XSLT problem: " + toString(message) + ); +} + +void ErrorCapacitor::setPrintWriter(xalan::PrintWriter*) { } + +ErrorCapacitor::exception::exception(error_cache_ptr ptr): + error_cache_(std::move(ptr)) { } + +auto ErrorCapacitor::exception::getCachedErrors() const -> const error_cache* { + return this->error_cache_.get(); +} + +} diff --git a/src/support/error_capacitor.h b/src/support/error_capacitor.h new file mode 100644 index 0000000..d89b5ae --- /dev/null +++ b/src/support/error_capacitor.h @@ -0,0 +1,81 @@ +#ifndef INPUTXSLT_SRC_SUPPORT_ERROR_CAPACITOR_H_ +#define INPUTXSLT_SRC_SUPPORT_ERROR_CAPACITOR_H_ + +#include +#include +#include + +#include +#include +#include + +#include "common.h" + +namespace InputXSLT { + +class ErrorCapacitor : public xercesc::ErrorHandler, + public xalan::ProblemListener { + public: + class exception; + + typedef std::vector error_cache; + typedef std::unique_ptr error_cache_ptr; + + ErrorCapacitor(xalan::XalanTransformer*); + ~ErrorCapacitor(); + + void discharge(); + + virtual void warning(const xercesc::SAXParseException&); + virtual void error(const xercesc::SAXParseException&); + virtual void fatalError(const xercesc::SAXParseException&); + virtual void resetErrors(); + + virtual void problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanDOMString&, + const xalan::Locator*, + const xalan::XalanNode* + ); + + virtual void problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanNode*, + const xalan::ElemTemplateElement*, + const xalan::XalanDOMString&, + const xalan::XalanDOMChar*, + xalan::XalanFileLoc, + xalan::XalanFileLoc + ); + + virtual void problem( + xalan::ProblemListenerBase::eSource, + xalan::ProblemListenerBase::eClassification, + const xalan::XalanDOMString&, + const xalan::XalanNode* + ); + + virtual void setPrintWriter(xalan::PrintWriter*); + + private: + xalan::XalanTransformer* const transformer_; + error_cache_ptr error_cache_; + +}; + +class ErrorCapacitor::exception { + public: + exception(error_cache_ptr); + + const error_cache* getCachedErrors() const; + + private: + error_cache_ptr error_cache_; + +}; + +} + +#endif // INPUTXSLT_SRC_SUPPORT_ERROR_CAPACITOR_H_ diff --git a/src/support/error_handler.cc b/src/support/error_handler.cc deleted file mode 100644 index 2ca721d..0000000 --- a/src/support/error_handler.cc +++ /dev/null @@ -1,107 +0,0 @@ -#include "error_handler.h" - -#include - -#include - -#include "support/xalan_string.h" -#include "support/xerces_string_guard.h" - -namespace { - -inline std::string getMessage(const xercesc::SAXParseException& exception) { - return std::string( - *InputXSLT::XercesStringGuard(exception.getMessage()) - ); -} - -} - -namespace InputXSLT { - -ErrorHandler::ErrorHandler(): - error_cache_{} { } - -void ErrorHandler::warning(const xercesc::SAXParseException& exception) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "Warning: " + getMessage(exception) - ); -} - -void ErrorHandler::error(const xercesc::SAXParseException& exception) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "Error: " + getMessage(exception) - ); -} - -void ErrorHandler::fatalError(const xercesc::SAXParseException& exception) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "Fatal error: " + getMessage(exception) - ); -} - -void ErrorHandler::resetErrors() { } - -void ErrorHandler::problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanDOMString& message, - const xalan::Locator*, - const xalan::XalanNode* -) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "XSLT problem: " + toString(message) - ); -} - -void ErrorHandler::problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanNode*, - const xalan::ElemTemplateElement*, - const xalan::XalanDOMString& message, - const xalan::XalanDOMChar*, - xalan::XalanFileLoc, - xalan::XalanFileLoc -) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "XSLT problem: " + toString(message) - ); -} - -void ErrorHandler::problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanDOMString& message, - const xalan::XalanNode* -) { - this->constructErrorCache(); - - this->error_cache_->emplace_back( - "XSLT problem: " + toString(message) - ); -} - -void ErrorHandler::setPrintWriter(xalan::PrintWriter*) { } - -auto ErrorHandler::getCachedErrors() -> error_cache_ptr { - return error_cache_ptr(this->error_cache_.release()); -} - -void ErrorHandler::constructErrorCache() { - if ( !this->error_cache_ ) { - this->error_cache_.reset(new error_cache()); - } -} - -} diff --git a/src/support/error_handler.h b/src/support/error_handler.h deleted file mode 100644 index 02d741e..0000000 --- a/src/support/error_handler.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef INPUTXSLT_SRC_SUPPORT_ERROR_HANDLER_H_ -#define INPUTXSLT_SRC_SUPPORT_ERROR_HANDLER_H_ - -#include -#include - -#include -#include -#include - -#include "common.h" - -namespace InputXSLT { - -class ErrorHandler : public xercesc::ErrorHandler, - public xalan::ProblemListener { - public: - typedef std::vector error_cache; - typedef std::unique_ptr error_cache_ptr; - - ErrorHandler(); - - virtual void warning(const xercesc::SAXParseException&); - virtual void error(const xercesc::SAXParseException&); - virtual void fatalError(const xercesc::SAXParseException&); - virtual void resetErrors(); - - virtual void problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanDOMString&, - const xalan::Locator*, - const xalan::XalanNode* - ); - - virtual void problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanNode*, - const xalan::ElemTemplateElement*, - const xalan::XalanDOMString&, - const xalan::XalanDOMChar*, - xalan::XalanFileLoc, - xalan::XalanFileLoc - ); - - virtual void problem( - xalan::ProblemListenerBase::eSource, - xalan::ProblemListenerBase::eClassification, - const xalan::XalanDOMString&, - const xalan::XalanNode* - ); - - virtual void setPrintWriter(xalan::PrintWriter*); - - error_cache_ptr getCachedErrors(); - - private: - error_cache_ptr error_cache_; - - void constructErrorCache(); - -}; - -} - -#endif // INPUTXSLT_SRC_SUPPORT_ERROR_HANDLER_H_ -- cgit v1.2.3