XsdValidator.cxx
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:6k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include "XsdValidator.h"
  19. log4cxx::LoggerPtr XsdValidator::logger(
  20. log4cxx::Logger::getLogger("XsdValidator"));
  21. MYHandler::MYHandler()
  22. : fSawErrors(false)
  23. {
  24. LOG4CXX_TRACE(XsdValidator::getLogger(), "Created MYHandler");
  25. }
  26. MYHandler::~MYHandler()
  27. {
  28. LOG4CXX_TRACE(XsdValidator::getLogger(), "Destroyed MYHandler");
  29. }
  30. void MYHandler::error(const SAXParseException& e)
  31. {
  32. LOG4CXX_ERROR(XsdValidator::getLogger(), "Error at file " << StrX(e.getSystemId())
  33. << ", line " << e.getLineNumber()
  34. << ", char " << e.getColumnNumber()
  35. << " Message: " << StrX(e.getMessage()));
  36. }
  37. void MYHandler::fatalError(const SAXParseException& e)
  38. {
  39. LOG4CXX_FATAL(XsdValidator::getLogger(), "Fatal Error at file " << StrX(e.getSystemId())
  40. << ", line " << e.getLineNumber()
  41. << ", char " << e.getColumnNumber()
  42. << " Message: " << StrX(e.getMessage()));
  43. }
  44. void MYHandler::warning(const SAXParseException& e)
  45. {
  46. LOG4CXX_WARN(XsdValidator::getLogger(), "Warning at file " << StrX(e.getSystemId())
  47. << ", line " << e.getLineNumber()
  48. << ", char " << e.getColumnNumber()
  49. << " Message: " << StrX(e.getMessage()));
  50. }
  51. XsdValidator::XsdValidator()
  52. {
  53. try {
  54. XMLPlatformUtils::Initialize();
  55. isInitial = true;
  56.    } catch (const XMLException& toCatch){
  57. LOG4CXX_ERROR(logger, "Error during initialization! Message:"
  58. << StrX(toCatch.getMessage()));
  59. isInitial = false;
  60. }
  61. }
  62. XsdValidator::~XsdValidator()
  63. {
  64. XMLPlatformUtils::Terminate();
  65. }
  66. bool XsdValidator::checkFile(const char* fname, const char* suffix)
  67. {
  68. int flen, slen, len;
  69. FILE* fp;
  70. if(fname == NULL || suffix == NULL) {
  71. return false;
  72. }
  73. flen = strlen(fname);
  74. slen = strlen(suffix);
  75. len  = flen - slen;
  76. if(len > 0 && slen > 0 && fname[len-1] == '.' && strncmp(fname+len, suffix, len) == 0) {
  77. fp = fopen(fname, "r");
  78. if(fp == NULL) {
  79. LOG4CXX_DEBUG(logger, fname << " does not exist");
  80. return false;
  81. }
  82. fclose(fp);
  83. return true;
  84. }
  85. LOG4CXX_ERROR(logger, fname << " does not suffix " << suffix);
  86. return false;
  87. }
  88. bool XsdValidator::buildXSDParser(const char* aXSDFileName)
  89. {
  90. LOG4CXX_DEBUG(logger, "checkFile " << aXSDFileName << ": start");
  91. if(checkFile(aXSDFileName, "xsd") == false) {
  92. LOG4CXX_DEBUG(logger, "checkFile " << aXSDFileName << ": fail");
  93. return false;
  94. }
  95. LOG4CXX_DEBUG(logger, "checkFile " << aXSDFileName << ": ok");
  96. try {
  97. // Create a SAX2 parser object.
  98. parser = XMLReaderFactory::createXMLReader();
  99. LOG4CXX_DEBUG(logger, "create schema parser");
  100. // Set the appropriate features on the parser.
  101. // Enable namespaces, schema validation, and the checking 
  102. // of all Schema constraint
  103. parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
  104. parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
  105. parser->setFeature(XMLUni::fgXercesDynamic, false);
  106. parser->setFeature(XMLUni::fgXercesSchema, true);
  107. parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);
  108. // Preprocess the XML Schema and cache it.
  109. parser->loadGrammar(aXSDFileName, Grammar::SchemaGrammarType, true);
  110. // Instruct the parser to use the cached schema 
  111. // when processing XML documents.
  112. parser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
  113. return true;
  114. } catch (const OutOfMemoryException&) {
  115. LOG4CXX_ERROR(logger, "OutOfMemoryException during parsing: " << aXSDFileName);
  116. } catch (const XMLException& e) {
  117. LOG4CXX_ERROR(logger, "Error during parsing: " << aXSDFileName
  118.  << " Exception message is: " << StrX(e.getMessage()));
  119. } catch (...) {
  120. LOG4CXX_ERROR(logger, "Unexpected exception during parsing: " << aXSDFileName);
  121. delete parser;
  122. LOG4CXX_DEBUG(logger, "destory schema parser");
  123. return false;
  124. }
  125. bool XsdValidator::validate(const char* aXSDFileName, const char* aXMLFileName)
  126. {
  127. int  errorCount = 0;
  128. bool result     = false;
  129. if(isInitial == false) {
  130. LOG4CXX_ERROR(logger, "XERCES Initailization failed!");
  131. return false;
  132. }
  133. if(aXSDFileName == NULL || aXMLFileName == NULL) {
  134. LOG4CXX_ERROR(logger, "parameters violation");
  135. return false;
  136. }
  137. LOG4CXX_DEBUG(logger, "checkFile " << aXMLFileName << ": start");
  138. if(checkFile(aXMLFileName, "xml") == false) {
  139. LOG4CXX_DEBUG(logger, "checkFile " << aXMLFileName << ": fail");
  140. return false;
  141. }
  142. LOG4CXX_DEBUG(logger, "checkFile " << aXMLFileName << ": ok");
  143. if(buildXSDParser(aXSDFileName) == true) {
  144. try{
  145. MYHandler handler;
  146. parser->setContentHandler(&handler);
  147. parser->setErrorHandler(&handler);
  148. parser->setEntityResolver(&handler);
  149. parser->parse(aXMLFileName);
  150. errorCount = parser->getErrorCount();
  151. LOG4CXX_DEBUG(logger, "errorCount is " << errorCount);
  152. if(errorCount != 0) {
  153. LOG4CXX_ERROR(logger, aXMLFileName << " is not validate with "
  154. << aXSDFileName);
  155. result = false;
  156. } else {
  157. LOG4CXX_DEBUG(logger, aXMLFileName << " is validate with "
  158. << aXSDFileName);
  159. result = true;
  160. }
  161. } catch (const OutOfMemoryException&) {
  162. LOG4CXX_ERROR(logger, "OutOfMemoryException during parsing: " << aXMLFileName);
  163. } catch (const XMLException& e) {
  164. LOG4CXX_ERROR(logger, "Error during parsing: " << aXMLFileName
  165.  << " Exception message is: " << StrX(e.getMessage()));
  166. } catch (...) {
  167. LOG4CXX_ERROR(logger, "Unexpected exception during parsing: " << aXMLFileName);
  168. LOG4CXX_DEBUG(logger, "deleting parser");
  169. delete parser;
  170. LOG4CXX_DEBUG(logger, "deleted parser");
  171. }
  172. return result;
  173. }