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.h | |
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.h')
-rw-r--r-- | src/support/error_capacitor.h | 81 |
1 files changed, 81 insertions, 0 deletions
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 <xercesc/sax/ErrorHandler.hpp> +#include <xalanc/XSLT/ProblemListener.hpp> +#include <xalanc/XalanTransformer/XalanTransformer.hpp> + +#include <memory> +#include <vector> +#include <string> + +#include "common.h" + +namespace InputXSLT { + +class ErrorCapacitor : public xercesc::ErrorHandler, + public xalan::ProblemListener { + public: + class exception; + + typedef std::vector<std::string> error_cache; + typedef std::unique_ptr<error_cache> 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_ |