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

词法分析

开发平台:

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: StringDatatypeValidator.cpp,v $
  58.  * Revision 1.5  2003/05/15 18:53:27  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.4  2002/12/18 14:17:55  gareth
  62.  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  63.  *
  64.  * Revision 1.3  2002/11/04 14:53:28  tng
  65.  * C++ Namespace Support.
  66.  *
  67.  * Revision 1.2  2002/09/24 19:44:40  tng
  68.  * Performance: use XMLString::equals instead of XMLString::compareString
  69.  *
  70.  * Revision 1.1.1.1  2002/02/01 22:22:42  peiyongz
  71.  * sane_include
  72.  *
  73.  * Revision 1.17  2001/10/09 20:54:35  peiyongz
  74.  * init(): take 1 arg.
  75.  *
  76.  * Revision 1.16  2001/09/27 13:51:25  peiyongz
  77.  * DTV Reorganization: ctor/init created to be used by derived class
  78.  *
  79.  * Revision 1.15  2001/09/25 15:58:14  peiyongz
  80.  * Check baseValidator in assignAdditinoalFacet() and inheritAdditionalFacet()
  81.  *
  82.  * Revision 1.14  2001/09/24 15:31:13  peiyongz
  83.  * DTV Reorganization: inherit from AbstractStringValidator
  84.  *
  85.  * Revision 1.12  2001/08/21 18:42:53  peiyongz
  86.  * Bugzilla# 2816: cleanUp() declared with external linkage and called
  87.  *                          before defined as inline
  88.  *
  89.  * Revision 1.11  2001/06/20 17:56:09  peiyongz
  90.  * support for "fixed" option on constrainning facets
  91.  *
  92.  * Revision 1.10  2001/05/29 19:49:36  tng
  93.  * Schema: Constraint Checking Fix in datatypeValidators.  By Pei Yong Zhang.
  94.  *
  95.  * Revision 1.9  2001/05/28 21:11:18  tng
  96.  * Schema: Various DatatypeValidator fix.  By Pei Yong Zhang
  97.  *
  98.  * Revision 1.8  2001/05/23 16:05:11  tng
  99.  * Schema: NormalizedString fix.  By Pei Yong Zhang.
  100.  *
  101.  * Revision 1.7  2001/05/23 15:45:25  tng
  102.  * Schema: NormalizedString fix.  By Pei Yong Zhang.
  103.  *
  104.  * Revision 1.6  2001/05/18 13:36:48  tng
  105.  * Schema: Catch RegularExpression exception and NumberFormatException
  106.  *
  107.  * Revision 1.5  2001/05/18 13:23:51  tng
  108.  * Schema: Exception messages in DatatypeValidator.  By Pei Yong Zhang.
  109.  *
  110.  * Revision 1.4  2001/05/16 14:33:40  tng
  111.  * Schema Constraint checking fix.
  112.  *
  113.  * Revision 1.3  2001/05/11 17:17:28  tng
  114.  * Schema: DatatypeValidator fixes.  By Pei Yong Zhang.
  115.  *
  116.  * Revision 1.2  2001/05/11 13:27:29  tng
  117.  * Copyright update.
  118.  *
  119.  * Revision 1.1  2001/05/09 18:43:42  tng
  120.  * Add StringDatatypeValidator and BooleanDatatypeValidator.  By Pei Yong Zhang.
  121.  *
  122.  */
  123. // ---------------------------------------------------------------------------
  124. //  Includes
  125. // ---------------------------------------------------------------------------
  126. #include <xercesc/validators/datatype/StringDatatypeValidator.hpp>
  127. #include <xercesc/validators/schema/SchemaSymbols.hpp>
  128. #include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
  129. #include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
  130. XERCES_CPP_NAMESPACE_BEGIN
  131. static const int BUF_LEN = 64;
  132. static XMLCh value1[BUF_LEN+1];
  133. static XMLCh value2[BUF_LEN+1];
  134. // ---------------------------------------------------------------------------
  135. //  Constructors and Destructor
  136. // ---------------------------------------------------------------------------
  137. StringDatatypeValidator::StringDatatypeValidator(MemoryManager* const manager)
  138. :AbstractStringValidator(0, 0, 0, DatatypeValidator::String, manager)
  139. ,fWhiteSpace(DatatypeValidator::PRESERVE)
  140. {}
  141. StringDatatypeValidator::StringDatatypeValidator(
  142.                           DatatypeValidator*            const baseValidator
  143.                         , RefHashTableOf<KVStringPair>* const facets
  144.                         , RefArrayVectorOf<XMLCh>*      const enums
  145.                         , const int                           finalSet
  146.                         , MemoryManager* const                manager)
  147. :AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::String, manager)
  148. ,fWhiteSpace(DatatypeValidator::PRESERVE)
  149. {
  150.     init(enums);
  151. }
  152. StringDatatypeValidator::~StringDatatypeValidator()
  153. {}
  154. DatatypeValidator* StringDatatypeValidator::newInstance
  155. (
  156.       RefHashTableOf<KVStringPair>* const facets
  157.     , RefArrayVectorOf<XMLCh>* const      enums
  158.     , const int                           finalSet
  159.     , MemoryManager* const                manager
  160. )
  161. {
  162.     return (DatatypeValidator*) new (manager) StringDatatypeValidator(this, facets, enums, finalSet, manager);
  163. }
  164. StringDatatypeValidator::StringDatatypeValidator(
  165.                           DatatypeValidator*            const baseValidator
  166.                         , RefHashTableOf<KVStringPair>* const facets
  167.                         , const int                           finalSet
  168.                         , const ValidatorType                 type
  169.                         , MemoryManager* const                manager)
  170. :AbstractStringValidator(baseValidator, facets, finalSet, type, manager)
  171. ,fWhiteSpace(DatatypeValidator::PRESERVE)
  172. {
  173.     // do not invoke init() here!!!
  174. }
  175. short StringDatatypeValidator::getWSFacet() const
  176. {
  177.     return fWhiteSpace;
  178. }
  179. // ---------------------------------------------------------------------------
  180. //  Utilities
  181. // ---------------------------------------------------------------------------
  182. void StringDatatypeValidator::assignAdditionalFacet(const XMLCh* const key
  183.                                                   , const XMLCh* const value)
  184. {
  185.     if (XMLString::equals(key, SchemaSymbols::fgELT_WHITESPACE))
  186.     {
  187.         // whiteSpace = preserve | replace | collapse
  188.         if (XMLString::equals(value, SchemaSymbols::fgWS_PRESERVE))
  189.             setWhiteSpace(DatatypeValidator::PRESERVE);
  190.         else if (XMLString::equals(value, SchemaSymbols::fgWS_REPLACE))
  191.             setWhiteSpace(DatatypeValidator::REPLACE);
  192.         else if (XMLString::equals(value, SchemaSymbols::fgWS_COLLAPSE))
  193.             setWhiteSpace(DatatypeValidator::COLLAPSE);
  194.         else
  195.             ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_WS, value);
  196.         //("whiteSpace value '" + ws + "' must be one of 'preserve', 'replace', 'collapse'.");
  197.         setFacetsDefined(DatatypeValidator::FACET_WHITESPACE);
  198.     }
  199.     else
  200.     {
  201.         ThrowXML1(InvalidDatatypeFacetException
  202.                 , XMLExcepts::FACET_Invalid_Tag
  203.                 , key);
  204.     }
  205. }
  206. void StringDatatypeValidator::inheritAdditionalFacet()
  207. {
  208.     StringDatatypeValidator *pBaseValidator = (StringDatatypeValidator*) getBaseValidator();
  209.     if (!pBaseValidator)
  210.         return;
  211.     // inherit whitespace
  212.     if (((pBaseValidator->getFacetsDefined() & DatatypeValidator::FACET_WHITESPACE) !=0) &&
  213.         ((getFacetsDefined() & DatatypeValidator::FACET_WHITESPACE) == 0))
  214.     {
  215.         setWhiteSpace(getBaseValidator()->getWSFacet());
  216.         setFacetsDefined(DatatypeValidator::FACET_WHITESPACE);
  217.     }
  218. }
  219. void StringDatatypeValidator::checkAdditionalFacetConstraints() const
  220. {
  221.     StringDatatypeValidator *pBaseValidator = (StringDatatypeValidator*) getBaseValidator();
  222.     if (!pBaseValidator)
  223.         return;
  224.     short    thisWSFacet = getWSFacet();
  225.     short    baseWSFacet = pBaseValidator->getWSFacet();
  226.     // check 4.3.6.c1 error: whitespace
  227.     if (((getFacetsDefined() & DatatypeValidator::FACET_WHITESPACE) != 0) &&
  228.         ((pBaseValidator->getFacetsDefined() & DatatypeValidator::FACET_WHITESPACE) != 0 ))
  229.     {
  230.         if ((baseWSFacet == DatatypeValidator::COLLAPSE) &&
  231.             ((thisWSFacet == DatatypeValidator::PRESERVE) ||
  232.              (thisWSFacet == DatatypeValidator::REPLACE)))
  233.              ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_WS_collapse);
  234.         if ((baseWSFacet == DatatypeValidator::REPLACE) &&
  235.             (thisWSFacet == DatatypeValidator::PRESERVE))
  236.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_WS_replace);
  237.         if (((pBaseValidator->getFixed() & DatatypeValidator::FACET_WHITESPACE) !=0) &&
  238.             ( thisWSFacet != baseWSFacet))
  239.         {
  240.             ThrowXML2(InvalidDatatypeFacetException
  241.                         , XMLExcepts::FACET_whitespace_base_fixed
  242.                         , getWSstring(thisWSFacet)
  243.                         , getWSstring(baseWSFacet));
  244.         }
  245.     }
  246. }
  247. void StringDatatypeValidator::checkAdditionalFacet(const XMLCh* const content) const
  248. {
  249.     //
  250.     // check WhiteSpace
  251.     //
  252.     if ((getFacetsDefined() & DatatypeValidator::FACET_WHITESPACE) != 0 )
  253.     {
  254.         if ( getWSFacet() == DatatypeValidator::REPLACE )
  255.         {
  256.             if (!XMLString::isWSReplaced(content))
  257.                 ThrowXML1(InvalidDatatypeValueException, XMLExcepts::VALUE_WS_replaced, content);
  258.         }
  259.         else if ( getWSFacet() == DatatypeValidator::COLLAPSE )
  260.         {
  261.             if (!XMLString::isWSCollapsed(content))
  262.                 ThrowXML1(InvalidDatatypeValueException, XMLExcepts::VALUE_WS_collapsed, content);
  263.         }
  264.     }
  265. }
  266. void StringDatatypeValidator::checkValueSpace(const XMLCh* const content)
  267. {}
  268. int StringDatatypeValidator::getLength(const XMLCh* const content) const
  269. {
  270.     return XMLString::stringLen(content);
  271. }
  272. XERCES_CPP_NAMESPACE_END
  273. /**
  274.   * End of file StringDatatypeValidator.cpp
  275.   */