diff options
author | Adrian Kummerländer | 2014-06-05 20:44:26 +0200 |
---|---|---|
committer | Adrian Kummerländer | 2014-06-05 20:44:26 +0200 |
commit | 78bb3387b15d15d766fb5d17a99612f0480f2bee (patch) | |
tree | c87a2516f56d7f6317a704b91b340bc14cabfd28 /src/support/error/error_multiplexer.h | |
parent | 11355181c0b5f8377774daefcc17bb5e6bc20f61 (diff) | |
download | InputXSLT-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.h | 84 |
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_ |