aboutsummaryrefslogtreecommitdiff
path: root/src/support/error_capacitor.h
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-05-30 22:19:32 +0200
committerAdrian Kummerländer2014-05-30 22:19:32 +0200
commit79d3e2bdfd441d6eba2f22af78d5bea5e488daf1 (patch)
treeb28b0603958140777ee46d98f2fc4359c9f72c4d /src/support/error_capacitor.h
parent484143667bd6885236b679a8f54dad3c512ea2dd (diff)
downloadInputXSLT-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.h81
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_