00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SEMAINE_UTIL_PARSEERRORHANDLER_H
00009 #define SEMAINE_UTIL_PARSEERRORHANDLER_H
00010
00011 #include <xercesc/sax2/DefaultHandler.hpp>
00012
00013 #include <sstream>
00014 #include <semaine/cms/exceptions/SEMAINEException.h>
00015
00016 namespace semaine {
00017
00018 namespace util {
00019
00020 class ParseErrorHandler : public XERCES_CPP_NAMESPACE::DOMErrorHandler {
00021
00022 public:
00023 ParseErrorHandler() {}
00024 virtual ~ParseErrorHandler() {}
00025 bool handleError(const XERCES_CPP_NAMESPACE::DOMError &domError) {
00026 std::stringstream stream;
00027 XERCES_CPP_NAMESPACE::DOMError::ErrorSeverity severity = domError.getSeverity();
00028 bool goOn;
00029 std::string sev;
00030 switch (severity) {
00031 case XERCES_CPP_NAMESPACE::DOMError::DOM_SEVERITY_WARNING:
00032 sev = "warning";
00033 goOn = true;
00034 break;
00035 case XERCES_CPP_NAMESPACE::DOMError::DOM_SEVERITY_ERROR:
00036 sev = "error";
00037 goOn = true;
00038 break;
00039 case XERCES_CPP_NAMESPACE::DOMError::DOM_SEVERITY_FATAL_ERROR:
00040 sev = "fatal error";
00041 goOn = false;
00042 }
00043 stream << "Parser " << sev << ": " << UTF8(domError.getMessage());
00044 XERCES_CPP_NAMESPACE::DOMLocator * loc = domError.getLocation();
00045 if (loc != NULL) {
00046 stream << " in " << loc->getURI() << " line " << loc->getLineNumber() << ", column " << loc->getColumnNumber();
00047 }
00048 errors.push_back(stream.str());
00049
00050
00051
00052 return goOn;
00053 }
00054
00055 bool hasErrors()
00056 {
00057 return !errors.empty();
00058 }
00059
00060 std::string getErrors()
00061 {
00062 std::stringstream stream;
00063 for (std::list<std::string>::iterator it = errors.begin(); it != errors.end(); ++it) {
00064 stream << *it << std::endl;
00065 }
00066 return stream.str();
00067 }
00068 private:
00069 std::list<std::string> errors;
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 };
00101
00102 }
00103
00104 }
00105
00106 #endif