aboutsummaryrefslogtreecommitdiff
path: root/src/support/error/error_multiplexer.h
diff options
context:
space:
mode:
authorAdrian Kummerländer2014-06-05 20:44:26 +0200
committerAdrian Kummerländer2014-06-05 20:44:26 +0200
commit78bb3387b15d15d766fb5d17a99612f0480f2bee (patch)
treec87a2516f56d7f6317a704b91b340bc14cabfd28 /src/support/error/error_multiplexer.h
parent11355181c0b5f8377774daefcc17bb5e6bc20f61 (diff)
downloadInputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar.gz
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar.bz2
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar.lz
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar.xz
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.tar.zst
InputXSLT-78bb3387b15d15d766fb5d17a99612f0480f2bee.zip
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
Diffstat (limited to 'src/support/error/error_multiplexer.h')
-rw-r--r--src/support/error/error_multiplexer.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/support/error/error_multiplexer.h b/src/support/error/error_multiplexer.h
new file mode 100644
index 0000000..02cfaf8
--- /dev/null
+++ b/src/support/error/error_multiplexer.h
@@ -0,0 +1,84 @@
+#ifndef INPUTXSLT_SRC_SUPPORT_ERROR_ERROR_MULTIPLEXER_H_
+#define INPUTXSLT_SRC_SUPPORT_ERROR_ERROR_MULTIPLEXER_H_
+
+#include <xercesc/sax/ErrorHandler.hpp>
+
+#include <xalanc/XSLT/ProblemListener.hpp>
+#include <xalanc/XalanTransformer/XalanTransformer.hpp>
+
+#include <vector>
+#include <string>
+
+#include "common.h"
+
+namespace InputXSLT {
+
+class ErrorMultiplexer : public xercesc::ErrorHandler,
+ public xalan::ProblemListener {
+ public:
+ enum class ErrorType;
+ struct Receiver;
+
+ ErrorMultiplexer(xalan::XalanTransformer*);
+ ~ErrorMultiplexer();
+
+ void connectReceiver(Receiver*);
+ void disconnectReceiver(Receiver*);
+
+ 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::XalanDOMString&,
+ 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 setPrintWriter(xalan::PrintWriter*);
+
+ private:
+ xalan::XalanTransformer* const transformer_;
+
+ std::vector<Receiver*> receivers_;
+
+ void multiplex(const ErrorType, const std::string&);
+
+};
+
+enum class ErrorMultiplexer::ErrorType {
+ Warning,
+ Error
+};
+
+struct ErrorMultiplexer::Receiver {
+ virtual void receive(
+ const ErrorMultiplexer::ErrorType,
+ const std::string&
+ ) = 0;
+};
+
+}
+
+#endif // INPUTXSLT_SRC_SUPPORT_ERROR_ERROR_MULTIPLEXER_H_