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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 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) 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.  * $Log: AbstractStringValidator.cpp,v $
  58.  * Revision 1.12  2003/05/16 06:01:57  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.11  2003/05/15 18:53:26  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.10  2003/02/22 18:28:26  peiyongz
  65.  * Schema Errata E2-35 Length, minLength and maxLength in different derivation steps.
  66.  *
  67.  * Revision 1.9  2003/01/27 19:24:17  peiyongz
  68.  * normalize Base64 data before checking against enumeration.
  69.  *
  70.  * Revision 1.8  2003/01/24 23:18:34  peiyongz
  71.  * normalizeEnumeration() added to remove optional ws in Base64 data.
  72.  *
  73.  * Revision 1.7  2002/12/18 14:17:55  gareth
  74.  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  75.  *
  76.  * Revision 1.6  2002/11/04 14:53:27  tng
  77.  * C++ Namespace Support.
  78.  *
  79.  * Revision 1.5  2002/10/02 13:29:12  tng
  80.  * Since the compare function return int, so use XMLString::compareString instead of XMLString::equals there.
  81.  *
  82.  * Revision 1.4  2002/09/24 19:44:40  tng
  83.  * Performance: use XMLString::equals instead of XMLString::compareString
  84.  *
  85.  * Revision 1.3  2002/04/01 20:17:46  peiyongz
  86.  * Bug#7551: Exceptions are caught by value, rather than by reference
  87.  *
  88.  * Revision 1.2  2002/02/14 15:17:31  peiyongz
  89.  * getEnumString()
  90.  *
  91.  * Revision 1.1.1.1  2002/02/01 22:22:39  peiyongz
  92.  * sane_include
  93.  *
  94.  * Revision 1.7  2001/12/13 16:48:29  peiyongz
  95.  * Avoid dangling pointer
  96.  *
  97.  * Revision 1.6  2001/10/15 20:57:27  tng
  98.  * Schema: we should propagate the exception thrown from checkContent.
  99.  *
  100.  * Revision 1.5  2001/10/09 21:00:54  peiyongz
  101.  * . init() take 1 arg,
  102.  * . make inspectFacetBase() virtual to allow ListDTV provide its own method,
  103.  * . reorganize init() into assignFacet(), inspectFacet(), inspectFacetBase() and
  104.  * inheritFacet() to improve mantainability.
  105.  * . macro to simplify code
  106.  * . save get***() to temp vars
  107.  *
  108.  * Revision 1.4  2001/09/24 15:30:16  peiyongz
  109.  * DTV Reorganization: init() to be invoked from derived class' ctor to allow
  110.  *        correct resolution of virtual methods like assignAdditionalFacet(),
  111.  *        inheritAdditionalFacet(), etc.
  112.  *
  113.  * Revision 1.3  2001/09/19 18:48:27  peiyongz
  114.  * DTV reorganization:getLength() added, move inline to class declaration to avoid inline
  115.  * function interdependency.
  116.  *
  117.  * Revision 1.2  2001/09/18 21:16:42  peiyongz
  118.  * DTV reorganization: temp vars to replace repeated invocation of getFacetsDefined()
  119.  *
  120.  * Revision 1.1  2001/09/18 14:45:04  peiyongz
  121.  * DTV reorganization
  122.  *
  123.  *
  124.  */
  125. // ---------------------------------------------------------------------------
  126. //  Includes
  127. // ---------------------------------------------------------------------------
  128. #include <xercesc/validators/datatype/AbstractStringValidator.hpp>
  129. #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
  130. #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
  131. #include <xercesc/util/NumberFormatException.hpp>
  132. XERCES_CPP_NAMESPACE_BEGIN
  133. static const int BUF_LEN = 64;
  134. static XMLCh value1[BUF_LEN+1];
  135. static XMLCh value2[BUF_LEN+1];
  136. #define  REPORT_FACET_ERROR(val1, val2, except_code)    
  137.    XMLString::binToText(val1, value1, BUF_LEN, 10);     
  138.    XMLString::binToText(val2, value2, BUF_LEN, 10);     
  139.    ThrowXML2(InvalidDatatypeFacetException              
  140.            , except_code                                
  141.            , value1                                     
  142.            , value2);
  143. #define  REPORT_VALUE_ERROR(data, val1, val2, except_code)      
  144.    XMLString::binToText(val1, value1, BUF_LEN, 10);             
  145.    XMLString::binToText(val2, value2, BUF_LEN, 10);             
  146.    ThrowXML3(InvalidDatatypeValueException                      
  147.            , except_code                                        
  148.            , data                                               
  149.            , value1                                             
  150.            , value2);
  151. // ---------------------------------------------------------------------------
  152. //  Constructors and Destructor
  153. // ---------------------------------------------------------------------------
  154. AbstractStringValidator::~AbstractStringValidator()
  155. {
  156.     //~RefVectorOf will delete all adopted elements
  157.     if ( !fEnumerationInherited && fEnumeration)
  158.     {
  159.         delete fEnumeration;
  160.         fEnumeration = 0;
  161.     }
  162. }
  163. AbstractStringValidator::AbstractStringValidator(
  164.                           DatatypeValidator*            const baseValidator
  165.                         , RefHashTableOf<KVStringPair>* const facets
  166.                         , const int                           finalSet
  167.                         , const ValidatorType                 type
  168.                         , MemoryManager* const                manager)
  169. :DatatypeValidator(baseValidator, facets, finalSet, type, manager)
  170. ,fLength(0)
  171. ,fMaxLength(SchemaSymbols::fgINT_MAX_VALUE)
  172. ,fMinLength(0)
  173. ,fEnumerationInherited(false)
  174. ,fEnumeration(0)
  175. {
  176.     // init() is invoked from derived class's ctor instead of from
  177.     // here to allow correct resolution of virutal method, such as
  178.     // assigneAdditionalFacet(), inheritAdditionalFacet().
  179. }
  180. void AbstractStringValidator::init(RefArrayVectorOf<XMLCh>*           const enums)
  181. {
  182.     if (enums)
  183.     {
  184.         setEnumeration(enums, false);
  185.         normalizeEnumeration();
  186.     }
  187.     assignFacet();
  188.     inspectFacet();
  189.     inspectFacetBase();
  190.     inheritFacet();
  191. }
  192. //
  193. //   Assign facets
  194. //        assign common facets
  195. //        assign additional facet
  196. //
  197. void AbstractStringValidator::assignFacet()
  198. {
  199.     RefHashTableOf<KVStringPair>* facets = getFacets();
  200.     if (!facets)
  201.         return;
  202.     XMLCh* key;
  203.     XMLCh* value;
  204.     RefHashTableOfEnumerator<KVStringPair> e(facets);
  205.     while (e.hasMoreElements())
  206.     {
  207.         KVStringPair pair = e.nextElement();
  208.         key = pair.getKey();
  209.         value = pair.getValue();
  210.         if (XMLString::equals(key, SchemaSymbols::fgELT_LENGTH))
  211.         {
  212.             int val;
  213.             try
  214.             {
  215.                 val = XMLString::parseInt(value);
  216.             }
  217.             catch (NumberFormatException&)
  218.             {
  219.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_Len, value);
  220.             }
  221.             if ( val < 0 )
  222.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_Len, value);
  223.                 setLength(val);
  224.                 setFacetsDefined(DatatypeValidator::FACET_LENGTH);
  225.         }
  226.         else if (XMLString::equals(key, SchemaSymbols::fgELT_MINLENGTH))
  227.         {
  228.             int val;
  229.             try
  230.             {
  231.                 val = XMLString::parseInt(value);
  232.             }
  233.             catch (NumberFormatException&)
  234.             {
  235.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_minLen, value);
  236.             }
  237.             if ( val < 0 )
  238.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_minLen, value);
  239.             setMinLength(val);
  240.             setFacetsDefined(DatatypeValidator::FACET_MINLENGTH);
  241.         }
  242.         else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXLENGTH))
  243.         {
  244.             int val;
  245.             try
  246.             {
  247.                 val = XMLString::parseInt(value);
  248.             }
  249.             catch (NumberFormatException&)
  250.             {
  251.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_maxLen, value);
  252.             }
  253.             if ( val < 0 )
  254.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_maxLen, value);
  255.             setMaxLength(val);
  256.             setFacetsDefined(DatatypeValidator::FACET_MAXLENGTH);
  257.         }
  258.         else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
  259.         {
  260.             setPattern(value);
  261.             if (getPattern())
  262.                 setFacetsDefined(DatatypeValidator::FACET_PATTERN);
  263.             // do not construct regex until needed
  264.         }
  265.         else if (XMLString::equals(key, SchemaSymbols::fgATT_FIXED))
  266.         {
  267.             unsigned int val;
  268.             bool         retStatus;
  269.             try
  270.             {
  271.                 retStatus = XMLString::textToBin(value, val);
  272.             }
  273.             catch (RuntimeException&)
  274.             {
  275.                 ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed);
  276.             }
  277.             if (!retStatus)
  278.             {
  279.                 ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed);
  280.             }
  281.             setFixed(val);
  282.             //no setFacetsDefined here
  283.         }
  284.         //
  285.         // else if (XMLString::equals(key, SchemaSymbols::fgELT_SPECIAL_TOKEN))
  286.         // TODO
  287.         //
  288.         // Note: whitespace is taken care of by TraverseSchema.
  289.         //
  290.         else
  291.         {
  292.             assignAdditionalFacet(key, value);
  293.         }
  294.     }//while
  295. }//end of assigneFacet()
  296. //
  297. // Check facet among self
  298. //         check common facets
  299. //         check Additional Facet Constraint
  300. //
  301. void AbstractStringValidator::inspectFacet()
  302. {
  303.     int thisFacetsDefined = getFacetsDefined();
  304.     if (!thisFacetsDefined)
  305.         return;
  306.     // check 4.3.1.c1 error: length & (maxLength | minLength)
  307.     if ((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) != 0)
  308.     {
  309.         if ((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) != 0)
  310.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
  311.         else if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) != 0))
  312.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_minLen);
  313.     }
  314.     // check 4.3.2.c1 must: minLength <= maxLength
  315.     if ((thisFacetsDefined & (DatatypeValidator::FACET_MINLENGTH
  316.         |DatatypeValidator::FACET_MAXLENGTH)) != 0)
  317.     {
  318.         int thisMinLength = getMinLength();
  319.         int thisMaxLength = getMaxLength();
  320.         if ( thisMinLength > thisMaxLength )
  321.         {
  322.             REPORT_FACET_ERROR(thisMaxLength
  323.                              , thisMinLength
  324.                              , XMLExcepts::FACET_maxLen_minLen)
  325.         }
  326.     }
  327. }// end of inspectFacet()
  328. //
  329. //  Check vs base
  330. //         check common facets
  331. //         check enumeration
  332. //         check Additional Facet Constraint
  333. //
  334. void AbstractStringValidator::inspectFacetBase()
  335. {
  336.     AbstractStringValidator *pBaseValidator = (AbstractStringValidator*) getBaseValidator();
  337.     int thisFacetsDefined = getFacetsDefined();
  338.     if ( (!thisFacetsDefined && !fEnumeration) ||
  339.          (!pBaseValidator)                      )
  340.         return;
  341.     int baseFacetsDefined = pBaseValidator->getFacetsDefined();
  342.     int thisLength    = getLength();
  343.     int thisMinLength = getMinLength();
  344.     int thisMaxLength = getMaxLength();
  345.     int baseLength    = pBaseValidator->getLength();
  346.     int baseMinLength = pBaseValidator->getMinLength();
  347.     int baseMaxLength = pBaseValidator->getMaxLength();
  348.     int baseFixed     = pBaseValidator->getFixed();
  349.     /***
  350.        check facets against base.facets
  351.        Note: later we need to check the "fix" option of the base type
  352.             and apply that to every individual facet.
  353.     ***/
  354.     /***
  355.                 Non coexistence of derived' length and base'    (minLength | maxLength)
  356.                                    base'    length and derived' (minLength | maxLength)
  357.      E2-35
  358.      It is an 積rror