00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _SCHEMAVALIDATORFILTER_HPP
00023 #define _SCHEMAVALIDATORFILTER_HPP
00024
00025 #include <vector>
00026
00027 #include <xqilla/events/EventHandler.hpp>
00028
00029 #include <xercesc/framework/XMLDocumentHandler.hpp>
00030 #include <xercesc/framework/XMLErrorReporter.hpp>
00031 #include <xercesc/validators/schema/SchemaValidator.hpp>
00032 #include <xercesc/validators/schema/identity/IdentityConstraintHandler.hpp>
00033 #include <xercesc/internal/XMLScanner.hpp>
00034 #include <xercesc/util/RefHash3KeysIdPool.hpp>
00035
00036 class DynamicContext;
00037 class LocationInfo;
00038
00039 #if _XERCES_VERSION < 30000
00040 typedef XMLSSize_t XMLFileLoc;
00041 #endif
00042
00050 class XQILLA_API SchemaValidatorFilter : public EventFilter,
00051 private XERCES_CPP_NAMESPACE_QUALIFIER XMLScanner,
00052 private XERCES_CPP_NAMESPACE_QUALIFIER XMLDocumentHandler,
00053 private XERCES_CPP_NAMESPACE_QUALIFIER XMLErrorReporter
00054 {
00055 public:
00056 SchemaValidatorFilter(bool strictValidation, EventHandler *next, XERCES_CPP_NAMESPACE_QUALIFIER GrammarResolver *grammarResolver,
00057 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mm, const LocationInfo *info);
00058 virtual ~SchemaValidatorFilter();
00059
00060 void reset();
00061
00062 virtual void startDocumentEvent(const XMLCh *documentURI, const XMLCh *encoding);
00063 virtual void endDocumentEvent();
00064 virtual void startElementEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname);
00065 virtual void endElementEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname,
00066 const XMLCh *typeURI, const XMLCh *typeName);
00067 virtual void piEvent(const XMLCh *target, const XMLCh *value);
00068 virtual void textEvent(const XMLCh *value);
00069 virtual void textEvent(const XMLCh *chars, unsigned int length);
00070 virtual void commentEvent(const XMLCh *value);
00071 virtual void attributeEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname, const XMLCh *value,
00072 const XMLCh *typeURI, const XMLCh *typeName);
00073 virtual void namespaceEvent(const XMLCh *prefix, const XMLCh *uri);
00074
00075 private:
00076
00077 virtual const XMLCh *getName() const { return 0; }
00078 virtual XERCES_CPP_NAMESPACE_QUALIFIER NameIdPool<XERCES_CPP_NAMESPACE_QUALIFIER DTDEntityDecl> *getEntityDeclPool() { return 0; }
00079 virtual const XERCES_CPP_NAMESPACE_QUALIFIER NameIdPool<XERCES_CPP_NAMESPACE_QUALIFIER DTDEntityDecl> *getEntityDeclPool() const { return 0; }
00080 #if _XERCES_VERSION < 30100
00081 virtual unsigned int resolveQName(const XMLCh *const qName, XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer &prefixBufToFill,
00082 const short mode, int &prefixColonPos);
00083 #endif
00084 virtual void scanDocument(const XERCES_CPP_NAMESPACE_QUALIFIER InputSource &src) {}
00085 virtual bool scanNext(XERCES_CPP_NAMESPACE_QUALIFIER XMLPScanToken &toFill) { return false; }
00086 virtual XERCES_CPP_NAMESPACE_QUALIFIER Grammar *loadGrammar(const XERCES_CPP_NAMESPACE_QUALIFIER InputSource &src,
00087 const short grammarType, const bool toCache) { return 0; }
00088
00089 virtual void scanCDSection() {}
00090 virtual void scanCharData(XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer &toToUse) {}
00091 virtual EntityExpRes scanEntityRef(const bool inAttVal, XMLCh &firstCh, XMLCh &secondCh,
00092 bool &escaped) { return EntityExp_Returned; }
00093 virtual void scanDocTypeDecl() {}
00094 virtual void scanReset(const XERCES_CPP_NAMESPACE_QUALIFIER InputSource &src) {}
00095 virtual void sendCharData(XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer &toSend) {}
00096
00097
00098 virtual void startDocument() {}
00099 virtual void endDocument() {}
00100 virtual void resetDocument() {}
00101 #if _XERCES_VERSION >= 30000
00102 virtual void startElement(const XERCES_CPP_NAMESPACE_QUALIFIER XMLElementDecl& elemDecl, const unsigned int urlId,
00103 const XMLCh* const elemPrefix,
00104 const XERCES_CPP_NAMESPACE_QUALIFIER RefVectorOf<XERCES_CPP_NAMESPACE_QUALIFIER XMLAttr>& attrList,
00105 const XMLSize_t attrCount, const bool isEmpty, const bool isRoot) {}
00106 virtual void docCharacters(const XMLCh* const chars, const XMLSize_t length, const bool cdataSection);
00107 virtual void ignorableWhitespace(const XMLCh* const chars, const XMLSize_t length, const bool cdataSection) {}
00108 #else
00109 virtual void startElement(const XERCES_CPP_NAMESPACE_QUALIFIER XMLElementDecl& elemDecl, const unsigned int urlId,
00110 const XMLCh* const elemPrefix,
00111 const XERCES_CPP_NAMESPACE_QUALIFIER RefVectorOf<XERCES_CPP_NAMESPACE_QUALIFIER XMLAttr>& attrList,
00112 const unsigned int attrCount, const bool isEmpty, const bool isRoot) {}
00113 virtual void docCharacters(const XMLCh* const chars, const unsigned int length, const bool cdataSection);
00114 virtual void ignorableWhitespace(const XMLCh* const chars, const unsigned int length, const bool cdataSection) {}
00115 #endif
00116 virtual void endElement(const XERCES_CPP_NAMESPACE_QUALIFIER XMLElementDecl& elemDecl, const unsigned int urlId,
00117 const bool isRoot, const XMLCh* const elemPrefix=0) {}
00118 virtual void docComment(const XMLCh* const comment) {}
00119 virtual void docPI(const XMLCh* const target, const XMLCh* const data) {}
00120 virtual void startEntityReference(const XERCES_CPP_NAMESPACE_QUALIFIER XMLEntityDecl& entDecl) {}
00121 virtual void endEntityReference(const XERCES_CPP_NAMESPACE_QUALIFIER XMLEntityDecl& entDecl) {}
00122 virtual void XMLDecl(const XMLCh* const versionStr, const XMLCh* const encodingStr, const XMLCh* const standaloneStr,
00123 const XMLCh* const actualEncodingStr) {}
00124
00125
00126 virtual void resetErrors() {}
00127 virtual void error(const unsigned int errCode, const XMLCh* const errDomain, const XMLErrorReporter::ErrTypes type, const XMLCh* const errorText,
00128 const XMLCh* const systemId, const XMLCh* const publicId, const XMLFileLoc lineNum, const XMLFileLoc colNum);
00129
00130 private:
00131 void processStartElement();
00132 void processAttrs(XERCES_CPP_NAMESPACE_QUALIFIER XMLElementDecl *elemDecl);
00133
00134 bool switchGrammar(const XMLCh *uri);
00135 bool laxElementValidation(XERCES_CPP_NAMESPACE_QUALIFIER QName* element,
00136 XERCES_CPP_NAMESPACE_QUALIFIER ContentLeafNameTypeVector* cv,
00137 const XERCES_CPP_NAMESPACE_QUALIFIER XMLContentModel *cm,
00138 unsigned int parentElemDepth);
00139 bool anyAttributeValidation(XERCES_CPP_NAMESPACE_QUALIFIER SchemaAttDef* attWildCard, unsigned int uriId, bool& skipThisOne, bool& laxThisOne);
00140 XERCES_CPP_NAMESPACE_QUALIFIER XMLElementDecl *createElementDecl(unsigned int uriId, unsigned int currentScope,
00141 bool laxThisOne);
00142
00143 const LocationInfo *info_;
00144
00145 XERCES_CPP_NAMESPACE_QUALIFIER SchemaValidator *fSchemaValidator;
00146 XERCES_CPP_NAMESPACE_QUALIFIER SchemaGrammar *fSchemaGrammar;
00147 XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer fContent;
00148 XERCES_CPP_NAMESPACE_QUALIFIER IdentityConstraintHandler *fICHandler;
00149 XERCES_CPP_NAMESPACE_QUALIFIER RefHash3KeysIdPool<XERCES_CPP_NAMESPACE_QUALIFIER SchemaElementDecl> *fElemNonDeclPool;
00150
00151 bool strictValidation_;
00152 bool errorOccurred_;
00153
00154 XERCES_CPP_NAMESPACE_QUALIFIER ElemStack::StackElem *parentStack_;
00155 unsigned int elemDepth_;
00156 XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer prefix_;
00157 XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer uri_;
00158 XERCES_CPP_NAMESPACE_QUALIFIER XMLBuffer localname_;
00159 bool elementToProcess_;
00160 const XMLCh *xsiType_;
00161 unsigned int attrCount_;
00162 };
00163
00164 #endif