diff options
author | Adrian Kummerländer | 2014-05-30 22:19:32 +0200 |
---|---|---|
committer | Adrian Kummerländer | 2014-05-30 22:19:32 +0200 |
commit | 79d3e2bdfd441d6eba2f22af78d5bea5e488daf1 (patch) | |
tree | b28b0603958140777ee46d98f2fc4359c9f72c4d /src/support/error_capacitor.cc | |
parent | 484143667bd6885236b679a8f54dad3c512ea2dd (diff) | |
download | InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar.gz InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar.bz2 InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar.lz InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar.xz InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.tar.zst InputXSLT-79d3e2bdfd441d6eba2f22af78d5bea5e488daf1.zip |
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<std::string> 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
Diffstat (limited to 'src/support/error_capacitor.cc')
-rw-r--r-- | src/support/error_capacitor.cc | 107 |
1 files changed, 107 insertions, 0 deletions
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 <xercesc/sax/SAXParseException.hpp> + +#include <iostream> + +#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<char>(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(); +} + +} |