From 78bb3387b15d15d766fb5d17a99612f0480f2bee Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Thu, 5 Jun 2014 20:44:26 +0200 Subject: Implemented ErrorMultiplexer as primary error handler * ErrorMultiplexer is derived from both xercesc::ErrorHandler and xalan::ProblemListener * registers itself as XalanTransformer's ErrorHandler and ProblemListener * distributes captured errors and warnings to all registered ErrorMultiplexer::Receiver instances ** ErrorCapacitor implements the ErrorMultiplexer::Receiver interface and as such registers itself in a given ErrorMultiplexer instance ** ErrorMultiplexer reduces the different xalan and xercesc internal error classifications into either warnings or errors * this was implemented to make it possible to easily differentiate between warnings and errors ** previously warnings were treated as errors ** ErrorCapacitor ignores warnings and only captures errors ** WarningCapacitor will be implemented to handle warnings during XSLT processing --- src/support/error/error_capacitor.cc | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/support/error/error_capacitor.cc (limited to 'src/support/error/error_capacitor.cc') diff --git a/src/support/error/error_capacitor.cc b/src/support/error/error_capacitor.cc new file mode 100644 index 0000000..58cfb81 --- /dev/null +++ b/src/support/error/error_capacitor.cc @@ -0,0 +1,37 @@ +#include "error_capacitor.h" + +namespace InputXSLT { + +ErrorCapacitor::ErrorCapacitor(ErrorMultiplexer* multiplexer): + multiplexer_(multiplexer), + error_cache_(new error_cache()) { + this->multiplexer_->connectReceiver(this); +} + +ErrorCapacitor::~ErrorCapacitor() { + this->multiplexer_->disconnectReceiver(this); +} + +void ErrorCapacitor::discharge() { + if ( !this->error_cache_->empty() ) { + throw exception(std::move(this->error_cache_)); + } +} + +void ErrorCapacitor::receive( + const ErrorMultiplexer::ErrorType type, + const std::string& message +) { + if ( type == ErrorMultiplexer::ErrorType::Error ) { + this->error_cache_->emplace_back(message); + } +} + +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(); +} + +} -- cgit v1.2.3