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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-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) 2001, 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.  * $Id: DatatypeValidator.hpp,v 1.12 2003/05/15 18:53:26 knoaman Exp $
  58.  */
  59. #if !defined(DATATYPEVALIDATOR_HPP)
  60. #define DATATYPEVALIDATOR_HPP
  61. #include <xercesc/util/PlatformUtils.hpp>
  62. #include <xercesc/util/RefHashTableOf.hpp>
  63. #include <xercesc/util/KVStringPair.hpp>
  64. #include <xercesc/util/XMLUniDefs.hpp>
  65. #include <xercesc/util/regx/RegularExpression.hpp>
  66. #include <xercesc/validators/schema/SchemaSymbols.hpp>
  67. XERCES_CPP_NAMESPACE_BEGIN
  68. class MemoryManager;
  69. /**
  70.   * DataTypeValidator defines the interface that data type validators must
  71.   * obey. These validators can be supplied by the application writer and may
  72.   * be useful as standalone code as well as plugins to the validator
  73.   * architecture.
  74.   *
  75.   * Notice:
  76.   * The datatype validator will own the facets hashtable passed to it during
  77.   * construction, which means that the datatype validator will be responsible
  78.   * for the deletion. The facets hashtable will be created during parsing and
  79.   * passed to the appropriate datatype validator which in turn will delete it
  80.   * upon its destruction.
  81.   *
  82.   */
  83. class VALIDATORS_EXPORT DatatypeValidator : public XMemory
  84. {
  85. public:
  86.     // -----------------------------------------------------------------------
  87.     // Constant data
  88.     // -----------------------------------------------------------------------
  89. //facets
  90. enum {
  91.         FACET_LENGTH         = 1,
  92.         FACET_MINLENGTH      = 1<<1,
  93.         FACET_MAXLENGTH      = 1<<2,
  94.         FACET_PATTERN        = 1<<3,
  95.         FACET_ENUMERATION    = 1<<4,
  96.         FACET_MAXINCLUSIVE   = 1<<5,
  97.         FACET_MAXEXCLUSIVE   = 1<<6,
  98.         FACET_MININCLUSIVE   = 1<<7,
  99.         FACET_MINEXCLUSIVE   = 1<<8,
  100.         FACET_TOTALDIGITS    = 1<<9,
  101.         FACET_FRACTIONDIGITS = 1<<10,
  102.         FACET_ENCODING       = 1<<11,
  103.         FACET_DURATION       = 1<<12,
  104.         FACET_PERIOD         = 1<<13,
  105.         FACET_WHITESPACE     = 1<<14
  106.     };
  107.     //2.4.2.6 whiteSpace - Datatypes
  108. enum {
  109.         PRESERVE = 0,
  110.         REPLACE  = 1,
  111.         COLLAPSE = 2
  112.     };
  113.     enum ValidatorType {
  114.         String,
  115.         AnyURI,
  116.         QName,
  117.         Name,
  118.         NCName,
  119.         Boolean,
  120.         Float,
  121.         Double,
  122.         Decimal,
  123.         HexBinary,
  124.         Base64Binary,
  125.         Duration,
  126.         DateTime,
  127.         Date,
  128.         Time,
  129.         MonthDay,
  130.         YearMonth,
  131.         Year,
  132.         Month,
  133.         Day,
  134.         ID,
  135.         IDREF,
  136.         ENTITY,
  137.         NOTATION,
  138.         List,
  139.         Union,
  140.         AnySimpleType
  141.     };
  142.     // -----------------------------------------------------------------------
  143.     //  Public Destructor
  144.     // -----------------------------------------------------------------------
  145. /** @name Destructor. */
  146.     //@{
  147.     virtual ~DatatypeValidator();
  148. //@}
  149.     // -----------------------------------------------------------------------
  150.     // Getter methods
  151.     // -----------------------------------------------------------------------
  152.     /** @name Getter Functions */
  153.     //@{
  154.     /**
  155.       * Returns the final values of the simpleType
  156.       */
  157.     int getFinalSet() const;
  158.     /**
  159.       * Returns the datatype facet if any is set.
  160.       */
  161. RefHashTableOf<KVStringPair>* getFacets() const;
  162.     /**
  163.       * Returns default value (collapse) for whiteSpace facet.
  164.       * This function is overwritten in StringDatatypeValidator.
  165.       */
  166.     virtual short getWSFacet () const;
  167.     /**
  168.       * Returns the base datatype validator if set.
  169.       */
  170.     DatatypeValidator* getBaseValidator() const;
  171.     /**
  172.       * Returns the 'class' type of datatype validator
  173.       */
  174.     ValidatorType getType() const;
  175.     /**
  176.       * Returns whether the type is atomic or not
  177.       *
  178.       * To be redefined in List/Union validators
  179.       */
  180.     virtual bool isAtomic() const;
  181.     /**
  182.       * Returns the datatype enumeration if any is set.
  183.   * Derived class shall provide their own copy.
  184.       */
  185. virtual const RefArrayVectorOf<XMLCh>* getEnumString() const = 0;
  186.     /**
  187.      * returns true if this type is anonymous
  188.      **/
  189.     bool getAnonymous() const;
  190.     /**
  191.      * sets this type to be anonymous
  192.      **/
  193.     void setAnonymous();
  194.     //@}
  195.     // -----------------------------------------------------------------------
  196.     // Validation methods
  197.     // -----------------------------------------------------------------------
  198.     /** @name Validation Function */
  199.     //@{
  200.      /**
  201.    * Checks that the "content" string is valid datatype.
  202.        * If invalid, a Datatype validation exception is thrown.
  203.    *
  204.    * @param  content   A string containing the content to be validated
  205.    *
  206.    */
  207. virtual void validate(const XMLCh* const content) = 0;
  208.     /**
  209.       * Checks whether a given type can be used as a substitute
  210.       *
  211.       * @param  toCheck    A datatype validator of the type to be used as a
  212.       *                    substitute
  213.       *
  214.       * To be redefined in UnionDatatypeValidator
  215.       */
  216.     virtual bool isSubstitutableBy(const DatatypeValidator* const toCheck);
  217.  //@}
  218.     // -----------------------------------------------------------------------
  219.     // Compare methods
  220.     // -----------------------------------------------------------------------
  221.     /** @name Compare Function */
  222.     //@{
  223.     /**
  224.       * Compares content in the Domain value vs. lexical value.
  225.       *
  226.       * e.g. If type is a float then 1.0 may be equivalent to 1 even though
  227.       * both are lexically different.
  228.       *
  229.       * @param  value1    string to compare
  230.       *
  231.       * @param  value2    string to compare
  232.       *
  233.       * We will provide a default behavior that should be redefined at the
  234.       * children level, if necessary (i.e. boolean case).
  235.       */
  236.     virtual int compare(const XMLCh* const value1, const XMLCh* const value2);
  237.     //@}
  238.     /**
  239.       * Returns an instance of the base datatype validator class
  240.   * Used by the DatatypeValidatorFactory.
  241.       */
  242. virtual DatatypeValidator* newInstance
  243.     (
  244.         RefHashTableOf<KVStringPair>* const facets
  245.         , RefArrayVectorOf<XMLCh>* const enums
  246.         , const int finalSet
  247.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  248.     ) = 0;
  249.     /**
  250.      * Returns the uri,name of the type this validator is for
  251.      */
  252.     const XMLCh* getTypeName() const;
  253.     /**
  254.      * sets the uri,name that this  validator is for - typeName is uri,name string.
  255.      * due to the internals of xerces this will set the uri to be the schema uri if
  256.      * there is no comma in typeName
  257.      */
  258.     void setTypeName(const XMLCh* const typeName);
  259.     /**
  260.      * sets the uri,name that this  validator is for
  261.      */
  262.     void setTypeName(const XMLCh* const name, const XMLCh* const uri);
  263.     /**
  264.      * Returns the uri of the type this validator is for
  265.      */
  266.     const XMLCh* getTypeUri() const;
  267.     /**
  268.      * Returns the name of the type this validator is for
  269.      */
  270.     const XMLCh* getTypeLocalName() const;
  271.     /**
  272.      * Returns the plugged-in memory manager
  273.      */
  274.     MemoryManager* getMemoryManager() const;
  275. protected:
  276.     // -----------------------------------------------------------------------
  277.     //  Protected Constructors
  278.     // -----------------------------------------------------------------------
  279.     /** @name Constructors */
  280.     //@{
  281.     /**
  282.       *
  283.       * @param  baseValidator  The base datatype validator for derived
  284.       *                        validators. Null if native validator.
  285.       *
  286.       * @param  facets         A hashtable of datatype facets (except enum).
  287.       *
  288.       * @param  finalSet       'final' value of the simpleType
  289.       */
  290. DatatypeValidator(DatatypeValidator* const baseValidator,
  291.                       RefHashTableOf<KVStringPair>* const facets,
  292.                       const int finalSet,
  293.                       const ValidatorType type,
  294.                       MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  295.     //@}
  296. friend class DatatypeValidatorFactory;
  297.     /**
  298.       * facetDefined
  299.   */
  300. int   getFacetsDefined() const;
  301.     void  setFacetsDefined(int);
  302.     /**
  303.       * fixed
  304.   */
  305. int   getFixed() const;
  306.     void  setFixed(int);
  307.     /**
  308.       * fPattern
  309.   */
  310.     const XMLCh* getPattern() const;
  311. void         setPattern(const XMLCh* );
  312.     /**
  313.       * fRegex
  314.   */
  315. RegularExpression* getRegex() const;
  316. void               setRegex(RegularExpression* const);
  317.     /**
  318.       * set fType
  319.       */
  320.     void setType(ValidatorType);
  321.     /**
  322.       * get WSString
  323.       */
  324.     const XMLCh*   getWSstring(const short WSType) const;
  325.     // -----------------------------------------------------------------------
  326.     //  Protected data members
  327.     //
  328.     //  fMemoryManager
  329.     //      Pluggable memory manager for dynamic allocation/deallocation.
  330.     // -----------------------------------------------------------------------
  331.     MemoryManager*                fMemoryManager;
  332. private:
  333.     // -----------------------------------------------------------------------
  334.     //  CleanUp methods
  335.     // -----------------------------------------------------------------------
  336. void cleanUp();
  337.     // -----------------------------------------------------------------------
  338.     //  Private data members
  339.     //
  340.     //  fFinalSet
  341.     //      stores "final" values of simpleTypes
  342.     //
  343.     //  fBaseValidator
  344.     //      This is a pointer to a base datatype validator. If value is null,
  345. //      it means we have a native datatype validator not a derived one.
  346. //
  347.     //  fFacets
  348.     //      This is a hashtable of dataype facets.
  349.     //
  350.     //  fType
  351.     //      Stores the class type of datatype validator
  352.     //
  353.     //  fFacetsDefined
  354.     //      Stores the constaiting facets flag
  355.     //
  356.     //  fPattern
  357.     //      the pointer to the String of the pattern. The actual data is
  358.     //      in the Facets.
  359.     //
  360.     //  fRegex
  361.     //      pointer to the RegularExpress object
  362.     //
  363.     //
  364.     //  fFixed
  365.     //      if {fixed} is true, then types for which this type is the
  366.     //      {base type definition} cannot specify a value for a specific
  367.     //      facet.
  368.     //
  369.     //  fTypeName
  370.     //      the uri,name of the type this validator will validate
  371.     //
  372.     //  fTypeLocalName
  373.     //      the name of the type this validator will validate
  374.     //
  375.     //  fTypeUri
  376.     //      the uri of the type this validator will validate
  377.     //  fAnonymous
  378.     //      true if this type is anonynous
  379.     //
  380.     // -----------------------------------------------------------------------
  381.     bool                          fAnonymous;
  382.     int                           fFinalSet;
  383.     int                           fFacetsDefined;
  384.     int                           fFixed;
  385.     ValidatorType                 fType;
  386. DatatypeValidator*            fBaseValidator;
  387. RefHashTableOf<KVStringPair>* fFacets;
  388.     XMLCh*                        fPattern;
  389.     RegularExpression*            fRegex;
  390.     XMLCh*                        fTypeName;
  391.     const XMLCh*                  fTypeLocalName;
  392.     const XMLCh*                  fTypeUri;
  393. };
  394. // ---------------------------------------------------------------------------
  395. //  DatatypeValidator: Getters
  396. // ---------------------------------------------------------------------------
  397. inline int DatatypeValidator::getFinalSet() const {
  398.     return fFinalSet;
  399. }
  400. inline RefHashTableOf<KVStringPair>* DatatypeValidator::getFacets() const {
  401.     return fFacets;
  402. }
  403. inline DatatypeValidator* DatatypeValidator::getBaseValidator() const {
  404. return fBaseValidator;
  405. }
  406. inline short DatatypeValidator::getWSFacet() const {
  407.     return COLLAPSE;
  408. }
  409. inline DatatypeValidator::ValidatorType DatatypeValidator::getType() const
  410. {
  411.     return fType;
  412. }
  413. inline int DatatypeValidator::getFacetsDefined() const
  414. {
  415.     return fFacetsDefined;
  416. }
  417. inline int DatatypeValidator::getFixed() const
  418. {
  419.     return fFixed;
  420. }
  421. inline const XMLCh* DatatypeValidator::getPattern() const
  422. {
  423.     return fPattern;
  424. }
  425. inline RegularExpression* DatatypeValidator::getRegex() const
  426. {
  427.     return fRegex;
  428. }
  429. inline const XMLCh* DatatypeValidator::getTypeName() const
  430. {
  431.     return fTypeLocalName;
  432. }
  433. inline bool DatatypeValidator::getAnonymous() const
  434. {
  435.     return fAnonymous;
  436. }
  437. inline const XMLCh* DatatypeValidator::getTypeLocalName() const
  438. {
  439.     return fTypeLocalName;
  440. }
  441. inline const XMLCh* DatatypeValidator::getTypeUri() const
  442. {
  443.     return fTypeUri;
  444. }
  445. inline MemoryManager* DatatypeValidator::getMemoryManager() const
  446. {
  447.     return fMemoryManager;
  448. }
  449. // ---------------------------------------------------------------------------
  450. //  DatatypeValidator: Setters
  451. // ---------------------------------------------------------------------------
  452. inline void DatatypeValidator::setType(ValidatorType theType)
  453. {
  454.     fType = theType;
  455. }
  456. inline void DatatypeValidator::setFacetsDefined(int facets)
  457. {
  458.     fFacetsDefined |= facets;
  459. }
  460. inline void DatatypeValidator::setFixed(int fixed)
  461. {
  462.     fFixed |= fixed;
  463. }
  464. inline void DatatypeValidator::setPattern(const XMLCh* pattern)
  465. {
  466.     if (fPattern)
  467.         fMemoryManager->deallocate(fPattern);//delete [] fPattern;
  468.     fPattern = XMLString::replicate(pattern, fMemoryManager);
  469. }
  470. inline void DatatypeValidator::setRegex(RegularExpression* const regex)
  471. {
  472.     fRegex = regex;
  473. }
  474. inline bool DatatypeValidator::isAtomic() const {
  475.     return true;
  476. }
  477. inline void DatatypeValidator::setAnonymous() {
  478.     fAnonymous = true;
  479. }
  480. // ---------------------------------------------------------------------------
  481. //  DatatypeValidators: Compare methods
  482. // ---------------------------------------------------------------------------
  483. inline int DatatypeValidator::compare(const XMLCh* const lValue,
  484.                                       const XMLCh* const rValue)
  485. {
  486.     return XMLString::compareString(lValue, rValue);
  487. }
  488. // ---------------------------------------------------------------------------
  489. //  DatatypeValidators: Validation methods
  490. // ---------------------------------------------------------------------------
  491. inline bool
  492. DatatypeValidator::isSubstitutableBy(const DatatypeValidator* const toCheck)
  493. {
  494.     const DatatypeValidator* dv = toCheck;
  495. while (dv != 0) {
  496.         if (dv == this) {
  497.             return true;
  498.         }
  499.         dv = dv->getBaseValidator();
  500.     }
  501.     return false;
  502. }
  503. XERCES_CPP_NAMESPACE_END
  504. #endif
  505. /**
  506.   * End of file DatatypeValidator.hpp
  507.   */