XMLValidator.hpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:18k
源码类别:

xml/soap/webservice

开发平台:

C/C++

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