XMLValidator.hpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:20k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56.  /*
  57.   * $Log: XMLValidator.hpp,v $
  58.   * Revision 1.9  2003/05/15 18:26:07  knoaman
  59.   * Partial implementation of the configurable memory manager.
  60.   *
  61.   * Revision 1.8  2003/03/07 18:08:10  tng
  62.   * Return a reference instead of void for operator=
  63.   *
  64.   * Revision 1.7  2002/11/07 21:59:22  tng
  65.   * Pass elemDecl to XMLValidator::validateAttrValue so that we can include element name in error message.
  66.   *
  67.   * Revision 1.6  2002/11/04 15:00:21  tng
  68.   * C++ Namespace Support.
  69.   *
  70.   * Revision 1.5  2002/09/04 18:17:55  tng
  71.   * Do not set IDREF to used during prevalidation.
  72.   *
  73.   * Revision 1.4  2002/08/20 16:54:11  tng
  74.   * [Bug 6251] Info during compilation.
  75.   *
  76.   * Revision 1.3  2002/07/11 18:55:44  knoaman
  77.   * Add a flag to the preContentValidation method to indicate whether to validate
  78.   * default/fixed attributes or not.
  79.   *
  80.   * Revision 1.2  2002/02/20 18:17:01  tng
  81.   * [Bug 5977] Warnings on generating apiDocs.
  82.   *
  83.   * Revision 1.1.1.1  2002/02/01 22:21:52  peiyongz
  84.   * sane_include
  85.   *
  86.   * Revision 1.17  2001/11/30 22:18:18  peiyongz
  87.   * cleanUp function made member function
  88.   * cleanUp object moved to file scope
  89.   * double mutex lock removed
  90.   *
  91.   * Revision 1.16  2001/11/13 13:24:46  tng
  92.   * Deprecate function XMLValidator::checkRootElement.
  93.   *
  94.   * Revision 1.15  2001/10/24 23:46:52  peiyongz
  95.   * [Bug 4342] fix the leak.
  96.   *
  97.   * Revision 1.14  2001/06/05 16:51:17  knoaman
  98.   * Add 'const' to getGrammar - submitted by Peter A. Volchek.
  99.   *
  100.   * Revision 1.13  2001/05/11 13:25:33  tng
  101.   * Copyright update.
  102.   *
  103.   * Revision 1.12  2001/05/03 20:34:22  tng
  104.   * Schema: SchemaValidator update
  105.   *
  106.   * Revision 1.11  2001/04/19 18:16:53  tng
  107.   * Schema: SchemaValidator update, and use QName in Content Model
  108.   *
  109.   * Revision 1.10  2001/03/21 21:56:03  tng
  110.   * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  111.   *
  112.   * Revision 1.9  2001/02/26 19:21:33  tng
  113.   * Schema: add parameter prefix in findElem and findAttr.
  114.   *
  115.   * Revision 1.8  2000/12/14 18:49:58  tng
  116.   * Fix API document generation warning: "Warning: end of member group without matching begin"
  117.   *
  118.   * Revision 1.7  2000/08/09 22:09:09  jpolast
  119.   * added const XMLCh* getURIText()
  120.   * allows parsers to use const URIs instead of appending
  121.   * to a XMLBuffer.
  122.   *
  123.   * Revision 1.6  2000/03/02 19:54:25  roddey
  124.   * This checkin includes many changes done while waiting for the
  125.   * 1.1.0 code to be finished. I can't list them all here, but a list is
  126.   * available elsewhere.
  127.   *
  128.   * Revision 1.5  2000/02/24 20:00:24  abagchi
  129.   * Swat for removing Log from API docs
  130.   *
  131.   * Revision 1.4  2000/02/15 23:59:07  roddey
  132.   * More updated documentation of Framework classes.
  133.   *
  134.   * Revision 1.3  2000/02/15 01:21:31  roddey
  135.   * Some initial documentation improvements. More to come...
  136.   *
  137.   * Revision 1.2  2000/02/06 07:47:49  rahulj
  138.   * Year 2K copyright swat.
  139.   *
  140.   * Revision 1.1.1.1  1999/11/09 01:08:38  twl
  141.   * Initial checkin
  142.   *
  143.   * Revision 1.4  1999/11/08 20:44:41  rahul
  144.   * Swat for adding in Product name and CVS comment log variable.
  145.   *
  146.   */
  147. #if !defined(XMLVALIDATOR_HPP)
  148. #define XMLVALIDATOR_HPP
  149. #include <xercesc/framework/XMLAttr.hpp>
  150. #include <xercesc/framework/XMLValidityCodes.hpp>
  151. XERCES_CPP_NAMESPACE_BEGIN
  152. class ReaderMgr;
  153. class XMLBufferMgr;
  154. class XMLElementDecl;
  155. class XMLScanner;
  156. class Grammar;
  157. /**
  158.  *  This abstract class provides the interface for all validators. This is
  159.  *  the simple amount of API that all validators must honor, in order for
  160.  *  the scanner to use them to do validation. All validators will actually
  161.  *  contain much more functionality than is accessible via this common API,
  162.  *  but that functionality requires that you know what type of validator you
  163.  *  are dealing with.
  164.  *
  165.  *  Basically, at this level, the primary concern is to be able to query
  166.  *  core information about elements and attributes. Adding decls to the
  167.  *  validator requires that you go through the derived interface because they
  168.  *  all have their own decl types. At this level, we can return information
  169.  *  via the base decl classes, from which each validator derives its own
  170.  *  decl classes.
  171.  */
  172. class XMLPARSER_EXPORT XMLValidator : public XMemory
  173. {
  174. public:
  175.     // -----------------------------------------------------------------------
  176.     //  Constructors are hidden, just the virtual destructor is exposed
  177.     // -----------------------------------------------------------------------
  178.     /** @name Destructor */
  179.     //@{
  180.     /**
  181.      *  The derived class should clean up its allocated data, then this class
  182.      *  will do the same for data allocated at this level.
  183.      */
  184.     virtual ~XMLValidator()
  185.     {
  186.     }
  187.     //@}
  188.     // -----------------------------------------------------------------------
  189.     //  The virtual validator interface
  190.     // -----------------------------------------------------------------------
  191.     /** @name Virtual validator interface */
  192.     //@{
  193.     /**
  194.       * The derived class should look up its declaration of the passed element
  195.       * from its element pool. It should then use the content model description
  196.       * contained in that element declaration to validate that the passed list
  197.       * of child elements are valid for that content model. The count can be
  198.       * zero, indicating no child elements.
  199.       *
  200.       * Note that whitespace and text content are not validated here. Those are
  201.       * handled by the scanner. So only element ids are provided here.
  202.       *
  203.       * @param  elemDecl    The element whose content is to be checked.
  204.       *
  205.       * @param  children    An array of element QName which represent the elements
  206.       *                     found within the parent element, i.e. the content
  207.       *                     to be validated.
  208.       *
  209.       * @param  childCount  The number of elements in the childIds array. It can
  210.       *                     be zero if the element had none.
  211.       */
  212.     virtual int checkContent
  213.     (
  214.         XMLElementDecl* const   elemDecl
  215.         , QName** const         children
  216.         , const unsigned int    childCount
  217.     ) = 0;
  218.     /**
  219.       * The derived class should fault in the passed XMLAttr value. It should
  220.       * use the passeed attribute definition (which is passed via the base
  221.       * type so it must often be downcast to the appropriate type for the
  222.       * derived validator class), to fill in the passed attribute. This is done
  223.       * as a performance enhancement since the derived class has more direct
  224.       * access to the information.
  225.       */
  226.     virtual void faultInAttr
  227.     (
  228.                 XMLAttr&    toFill
  229.         , const XMLAttDef&  attDef
  230.     )   const = 0;
  231.     /**
  232.       * This method is called by the scanner after a Grammar is scanned.
  233.       */
  234.     virtual void preContentValidation(bool reuseGrammar,
  235.                                       bool validateDefAttr = false) = 0;
  236.     /**
  237.       * This method is called by the scanner after the parse has completed. It
  238.       * gives the validator a chance to check certain things that can only be
  239.       * checked after the whole document has been parsed, such as referential
  240.       * integrity of ID/IDREF pairs and so forth. The validator should just
  241.       * issue errors for any problems it finds.
  242.       */
  243.     virtual void postParseValidation() = 0;
  244.     /**
  245.       * This method is called by the scanner before a new document is about
  246.       * to start. It gives the validator a change to reset itself in preperation
  247.       * for another validation pass.
  248.       */
  249.     virtual void reset() = 0;
  250.     /**
  251.       * The derived class should return a boolean that indicates whether it
  252.       * requires namespace processing or not. Some do and some allow it to be
  253.       * optional. This flag is used to control whether the client code's
  254.       * requests to disable namespace processing can be honored or not.
  255.       */
  256.     virtual bool requiresNamespaces() const = 0;
  257.     /**
  258.       * The derived class should apply any rules to the passed attribute value
  259.       * that are above and beyond those defined by XML 1.0. The scanner itself
  260.       * will impose XML 1.0 rules, based on the type of the attribute. This
  261.       * will generally be used to check things such as range checks and other
  262.       * datatype related validation.
  263.       *
  264.       * If the value breaks any rules as defined by the derived class, it
  265.       * should just issue errors as usual.
  266.       */
  267.     virtual void validateAttrValue
  268.     (
  269.         const   XMLAttDef*                  attDef
  270.         , const XMLCh* const                attrValue
  271.         , bool                              preValidation = false
  272.         , const XMLElementDecl*             elemDecl = 0
  273.     ) = 0;
  274.     /**
  275.       * The derived class should apply any rules to the passed element decl
  276.       * that are above and beyond those defined by XML 1.0.
  277.       *
  278.       * If the value breaks any rules as defined by the derived class, it
  279.       * should just issue errors as usual.
  280.       */
  281.     virtual void validateElement
  282.     (
  283.         const   XMLElementDecl*             elemDef
  284.     ) = 0;
  285.     /**
  286.       * Retrieve the Grammar used
  287.       */
  288.     virtual Grammar* getGrammar() const =0;
  289.     /**
  290.       * Set the Grammar
  291.       */
  292.     virtual void setGrammar(Grammar* aGrammar) =0;
  293.     //@}
  294.     // -----------------------------------------------------------------------
  295.     //  Virtual DTD handler interface.
  296.     // -----------------------------------------------------------------------
  297.     /** @name Virtual DTD handler interface */
  298.     //@{
  299.     /**
  300.       * This method allows the scanner to ask the validator if it handles
  301.       * DTDs or not.
  302.       */
  303.     virtual bool handlesDTD() const = 0;
  304.     // -----------------------------------------------------------------------
  305.     //  Virtual Schema handler interface.
  306.     // -----------------------------------------------------------------------
  307.     /** @name Virtual Schema handler interface */
  308.     /**
  309.       * This method allows the scanner to ask the validator if it handles
  310.       * Schema or not.
  311.       */
  312.     virtual bool handlesSchema() const = 0;
  313.     //@}
  314.     // -----------------------------------------------------------------------
  315.     //  Setter methods
  316.     //
  317.     //  setScannerInfo() is called by the scanner to tell the validator
  318.     //  about the stuff it needs to have access to.
  319.     // -----------------------------------------------------------------------
  320.     /** @name Setter methods */
  321.     //@{
  322.     /**
  323.       * @param  owningScanner   This is a pointer to the scanner to which the
  324.       *                         validator belongs. The validator will often
  325.       *                         need to query state data from the scanner.
  326.       *
  327.       * @param  readerMgr       This is a pointer to the reader manager that is
  328.       *                         being used by the scanner.
  329.       *
  330.       * @param  bufMgr          This is the buffer manager of the scanner. This
  331.       *                         is provided as a convenience so that the validator
  332.       *                         doesn't have to create its own buffer manager
  333.       *                         during the parse process.
  334.       */
  335.     void setScannerInfo
  336.     (
  337.         XMLScanner* const           owningScanner
  338.         , ReaderMgr* const          readerMgr
  339.         , XMLBufferMgr* const       bufMgr
  340.     );
  341.     /**
  342.       * This method is called to set an error reporter on the validator via
  343.       * which it will report any errors it sees during parsing or validation.
  344.       * This is generally called by the owning scanner.
  345.       *
  346.       * @param  errorReporter   A pointer to the error reporter to use. This
  347.       *                         is not adopted, just referenced so the caller
  348.       *                         remains responsible for its cleanup, if any.
  349.       */
  350.     void setErrorReporter
  351.     (
  352.         XMLErrorReporter* const errorReporter
  353.     );
  354.     //@}
  355.     // -----------------------------------------------------------------------
  356.     //  Error emitter methods
  357.     // -----------------------------------------------------------------------
  358.     /** @name Error emittor methods */
  359.     //@{
  360.     /**
  361.      *  This call is a convenience by which validators can emit errors. Most
  362.      *  of the grunt work of loading the text, getting the current source
  363.      *  location, ect... is handled here.
  364.      *
  365.      *  If the loaded text has replacement parameters, then text strings can be
  366.      *  passed. These will be used to replace the tokens {0}, {1}, {2}, and {3}
  367.      *  in the order passed. So text1 will replace {0}, text2 will replace {1},
  368.      *  and so forth.
  369.      *
  370.      *  textX   Up to four replacement parameters. They can be provided
  371.      *          as either XMLCh strings, or local code page strings which
  372.      *          will be transcoded internally.
  373.      *
  374.      *  @param toEmit   The error code to emit. it must be one of the defined
  375.      *                  validator error codes.
  376.      *
  377.      */
  378.     void emitError(const XMLValid::Codes toEmit);
  379.     void emitError
  380.     (
  381.         const   XMLValid::Codes toEmit
  382.         , const XMLCh* const    text1
  383.         , const XMLCh* const    text2 = 0
  384.         , const XMLCh* const    text3 = 0
  385.         , const XMLCh* const    text4 = 0
  386.     );
  387.     void emitError
  388.     (
  389.         const   XMLValid::Codes toEmit
  390.         , const char* const     text1
  391.         , const char* const     text2 = 0
  392.         , const char* const     text3 = 0
  393.         , const char* const     text4 = 0
  394.     );
  395.     //@}
  396.     // -----------------------------------------------------------------------
  397.     //  Deprecated XMLValidator interface
  398.     // -----------------------------------------------------------------------
  399.     /**
  400.       *
  401.       * DEPRECATED.
  402.       * For those validators that contrain the possible root elements of a
  403.       * document to only particular elements, they should use this call to
  404.       * validate that the passed root element id is a legal root element.
  405.       */
  406.     bool checkRootElement
  407.     (
  408.         const   unsigned int
  409.     ) { return true;};
  410.     // -----------------------------------------------------------------------
  411.     //  Notification that lazy data has been deleted
  412.     // -----------------------------------------------------------------------
  413. static void reinitMsgMutex();
  414. static void reinitMsgLoader();
  415. protected :
  416.     // -----------------------------------------------------------------------
  417.     //  Hidden constructors
  418.     // -----------------------------------------------------------------------
  419.     XMLValidator
  420.     (
  421.         XMLErrorReporter* const errReporter = 0
  422.     );
  423.     // -----------------------------------------------------------------------
  424.     //  Protected getters
  425.     // -----------------------------------------------------------------------
  426.     const XMLBufferMgr* getBufMgr() const;
  427.     XMLBufferMgr* getBufMgr();
  428.     const ReaderMgr* getReaderMgr() const;
  429.     ReaderMgr* getReaderMgr();
  430.     const XMLScanner* getScanner() const;
  431.     XMLScanner* getScanner();
  432. private :
  433.     // -----------------------------------------------------------------------
  434.     //  Unimplemented Constructors and Operators
  435.     // -----------------------------------------------------------------------
  436.     XMLValidator(const XMLValidator&);
  437.     XMLValidator& operator=(const XMLValidator&);
  438.     // -----------------------------------------------------------------------
  439.     //  Private data members
  440.     //
  441.     //  fErrorReporter
  442.     //      The error reporter we are to use, if any.
  443.     //
  444.     // -----------------------------------------------------------------------
  445.     XMLBufferMgr*       fBufMgr;
  446.     XMLErrorReporter*   fErrorReporter;
  447.     ReaderMgr*          fReaderMgr;
  448.     XMLScanner*         fScanner;
  449. };
  450. // -----------------------------------------------------------------------
  451. //  Setter methods
  452. // -----------------------------------------------------------------------
  453. inline void
  454. XMLValidator::setScannerInfo(XMLScanner* const      owningScanner
  455.                             , ReaderMgr* const      readerMgr
  456.                             , XMLBufferMgr* const   bufMgr)
  457. {
  458.     // We don't own any of these, we just reference them
  459.     fScanner = owningScanner;
  460.     fReaderMgr = readerMgr;
  461.     fBufMgr = bufMgr;
  462. }
  463. inline void
  464. XMLValidator::setErrorReporter(XMLErrorReporter* const errorReporter)
  465. {
  466.     fErrorReporter = errorReporter;
  467. }
  468. // ---------------------------------------------------------------------------
  469. //  XMLValidator: Protected getter
  470. // ---------------------------------------------------------------------------
  471. inline const XMLBufferMgr* XMLValidator::getBufMgr() const
  472. {
  473.     return fBufMgr;
  474. }
  475. inline XMLBufferMgr* XMLValidator::getBufMgr()
  476. {
  477.     return fBufMgr;
  478. }
  479. inline const ReaderMgr* XMLValidator::getReaderMgr() const
  480. {
  481.     return fReaderMgr;
  482. }
  483. inline ReaderMgr* XMLValidator::getReaderMgr()
  484. {
  485.     return fReaderMgr;
  486. }
  487. inline const XMLScanner* XMLValidator::getScanner() const
  488. {
  489.     return fScanner;
  490. }
  491. inline XMLScanner* XMLValidator::getScanner()
  492. {
  493.     return fScanner;
  494. }
  495. XERCES_CPP_NAMESPACE_END
  496. #endif