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

词法分析

开发平台:

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: DatatypeValidatorFactory.cpp,v $
  58.  * Revision 1.16  2003/05/18 14:02:07  knoaman
  59.  * Memory manager implementation: pass per instance manager.
  60.  *
  61.  * Revision 1.15  2003/05/16 21:43:20  knoaman
  62.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  63.  *
  64.  * Revision 1.14  2003/05/15 18:53:26  knoaman
  65.  * Partial implementation of the configurable memory manager.
  66.  *
  67.  * Revision 1.13  2003/03/18 19:42:17  knoaman
  68.  * Schema Errata E2-18.
  69.  *
  70.  * Revision 1.12  2003/02/26 16:14:27  peiyongz
  71.  * Schema Errata E2-43: disallow trailing decimal point and a new pattern added
  72.  * to the Integer definition.
  73.  *
  74.  * Revision 1.11  2003/01/29 19:51:48  gareth
  75.  * type names / uris are now added to DatatypeValidators.
  76.  *
  77.  * Revision 1.10  2003/01/03 16:39:45  tng
  78.  * Performance: no need to create that many members for fBuiltInRegistry
  79.  *
  80.  * Revision 1.9  2002/12/18 14:17:55  gareth
  81.  * Fix to bug #13438. When you eant a vector that calls delete[] on its members you should use RefArrayVectorOf.
  82.  *
  83.  * Revision 1.8  2002/12/02 16:01:24  gareth
  84.  * Fix to bug #12188. NCNAME validator now has a base validator of NAME. Patch by Peter Volchek.
  85.  *
  86.  * Revision 1.7  2002/12/02 13:25:51  gareth
  87.  * Fix for bug #12188. Create NMTOKEN, ID, IDREF, ENTITY, NAME, NCNAME with appropriate base types. Some reordering of creation was required where dependencies resulted.
  88.  *
  89.  * Revision 1.6  2002/11/21 23:43:19  peiyongz
  90.  * Schema Errata: E2-25 language
  91.  *
  92.  * Revision 1.5  2002/11/04 14:53:28  tng
  93.  * C++ Namespace Support.
  94.  *
  95.  * Revision 1.4  2002/05/08 12:25:30  tng
  96.  * Schema Fix: re-add the ID, IDREF ... datatype validators only if they were not there.
  97.  *
  98.  * Revision 1.3  2002/05/07 20:00:07  tng
  99.  * Schema Fix: No need to re-add the ID, IDREF ... datatype validators if the fUserDefinedRegistry already exists.
  100.  *
  101.  * Revision 1.2  2002/02/25 21:28:26  tng
  102.  * Schema Fix: Thread-safe the built-in datatype validator factory.
  103.  *
  104.  * Revision 1.1.1.1  2002/02/01 22:22:40  peiyongz
  105.  * sane_include
  106.  *
  107.  * Revision 1.26  2001/11/07 19:18:52  peiyongz
  108.  * DateTime Port
  109.  *
  110.  * Revision 1.25  2001/10/25 15:06:49  tng
  111.  * Thread safe the static instance.
  112.  *
  113.  * Revision 1.24  2001/10/23 23:14:22  peiyongz
  114.  * [Bug#880] patch to PlatformUtils:init()/term() and related. from Mark Weaver
  115.  *
  116.  * Revision 1.23  2001/09/25 16:00:03  peiyongz
  117.  * DTV Reorganization: Create native NameDTV and NCNameDTV
  118.  *
  119.  * Revision 1.22  2001/08/24 17:12:01  knoaman
  120.  * Add support for anySimpleType.
  121.  * Remove parameter 'baseValidator' from the virtual method 'newInstance'.
  122.  *
  123.  * Revision 1.21  2001/08/01 18:49:16  peiyongz
  124.  * AnyRUIDatatypeValidator
  125.  *
  126.  * Revision 1.20  2001/07/26 20:48:02  peiyongz
  127.  * FloatDatatypeValidator
  128.  *
  129.  * Revision 1.19  2001/07/24 21:23:39  tng
  130.  * Schema: Use DatatypeValidator for ID/IDREF/ENTITY/ENTITIES/NOTATION.
  131.  *
  132.  * Revision 1.18  2001/07/24 13:59:03  peiyongz
  133.  * DoubleDTV
  134.  *
  135.  * Revision 1.17  2001/07/19 17:46:42  tng
  136.  * Enable those derived dataype like nonPositiveinteger, negativeInteger ... etc.
  137.  *
  138.  * Revision 1.16  2001/07/13 14:10:33  peiyongz
  139.  * UnionDTV
  140.  *
  141.  * Revision 1.15  2001/07/11 21:37:18  peiyongz
  142.  * ListDatatypeDTV
  143.  *
  144.  * Revision 1.14  2001/07/06 20:21:58  peiyongz
  145.  * QNameDTV & ENTITYDTV enabled
  146.  *
  147.  * Revision 1.13  2001/07/05 20:15:25  peiyongz
  148.  * NOTATIONDatatypeValidator
  149.  *
  150.  * Revision 1.12  2001/07/04 20:16:31  peiyongz
  151.  * IDREFDatatypeValidator
  152.  *
  153.  * Revision 1.11  2001/07/04 14:38:24  peiyongz
  154.  * IDDatatypeValidator: created
  155.  * DatatypeValidatorFactory: IDDTV enabled
  156.  * XMLString:isValidName(): to validate Name (XML [4][5])
  157.  *
  158.  * Revision 1.10  2001/05/28 21:11:17  tng
  159.  * Schema: Various DatatypeValidator fix.  By Pei Yong Zhang
  160.  *
  161.  * Revision 1.9  2001/05/18 16:51:37  knoaman
  162.  * Added circular check for complexType + more error messages.
  163.  *
  164.  * Revision 1.8  2001/05/17 18:11:11  knoaman
  165.  * More constraint and attribute checking.
  166.  *
  167.  * Revision 1.7  2001/05/16 15:24:42  tng
  168.  * Schema: Add Base64 and HexBin.  By Pei Yong Zhang.
  169.  *
  170.  * Revision 1.6  2001/05/15 21:59:19  knoaman
  171.  * TraverseSchema: add attribute checking + some fixes + more error messages.
  172.  * More attribute cheking to come.
  173.  *
  174.  * Revision 1.5  2001/05/11 21:51:13  knoaman
  175.  * Schema updates and fixes.
  176.  *
  177.  * Revision 1.4  2001/05/11 13:27:28  tng
  178.  * Copyright update.
  179.  *
  180.  * Revision 1.3  2001/05/09 18:43:40  tng
  181.  * Add StringDatatypeValidator and BooleanDatatypeValidator.  By Pei Yong Zhang.
  182.  *
  183.  * Revision 1.2  2001/05/03 19:17:47  knoaman
  184.  * TraverseSchema Part II.
  185.  *
  186.  * Revision 1.1  2001/03/21 21:39:14  knoaman
  187.  * Schema symbols and Datatype validator part I
  188.  *
  189.  */
  190. // ---------------------------------------------------------------------------
  191. //  Includes
  192. // ---------------------------------------------------------------------------
  193. #include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
  194. #include <xercesc/validators/schema/SchemaSymbols.hpp>
  195. #include <xercesc/util/XMLUniDefs.hpp>
  196. #include <xercesc/util/Janitor.hpp>
  197. #include <xercesc/validators/datatype/StringDatatypeValidator.hpp>
  198. #include <xercesc/validators/datatype/BooleanDatatypeValidator.hpp>
  199. #include <xercesc/validators/datatype/DecimalDatatypeValidator.hpp>
  200. #include <xercesc/validators/datatype/HexBinaryDatatypeValidator.hpp>
  201. #include <xercesc/validators/datatype/Base64BinaryDatatypeValidator.hpp>
  202. #include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
  203. #include <xercesc/validators/datatype/IDREFDatatypeValidator.hpp>
  204. #include <xercesc/validators/datatype/NOTATIONDatatypeValidator.hpp>
  205. #include <xercesc/validators/datatype/ENTITYDatatypeValidator.hpp>
  206. #include <xercesc/validators/datatype/QNameDatatypeValidator.hpp>
  207. #include <xercesc/validators/datatype/NameDatatypeValidator.hpp>
  208. #include <xercesc/validators/datatype/NCNameDatatypeValidator.hpp>
  209. #include <xercesc/validators/datatype/ListDatatypeValidator.hpp>
  210. #include <xercesc/validators/datatype/UnionDatatypeValidator.hpp>
  211. #include <xercesc/validators/datatype/DoubleDatatypeValidator.hpp>
  212. #include <xercesc/validators/datatype/FloatDatatypeValidator.hpp>
  213. #include <xercesc/validators/datatype/AnyURIDatatypeValidator.hpp>
  214. #include <xercesc/validators/datatype/AnySimpleTypeDatatypeValidator.hpp>
  215. #include <xercesc/validators/datatype/DateTimeDatatypeValidator.hpp>
  216. #include <xercesc/validators/datatype/DateDatatypeValidator.hpp>
  217. #include <xercesc/validators/datatype/TimeDatatypeValidator.hpp>
  218. #include <xercesc/validators/datatype/DayDatatypeValidator.hpp>
  219. #include <xercesc/validators/datatype/MonthDatatypeValidator.hpp>
  220. #include <xercesc/validators/datatype/MonthDayDatatypeValidator.hpp>
  221. #include <xercesc/validators/datatype/YearDatatypeValidator.hpp>
  222. #include <xercesc/validators/datatype/YearMonthDatatypeValidator.hpp>
  223. #include <xercesc/validators/datatype/DurationDatatypeValidator.hpp>
  224. #include <xercesc/util/PlatformUtils.hpp>
  225. #include <xercesc/util/XMLRegisterCleanup.hpp>
  226. XERCES_CPP_NAMESPACE_BEGIN
  227. // ---------------------------------------------------------------------------
  228. //  DatatypeValidatorFactory: Local const data
  229. // ---------------------------------------------------------------------------
  230. const XMLCh fgTokPattern[] =
  231. {
  232.     chBackSlash, chLatin_c, chPlus, chNull
  233. };
  234. // http://www.w3.org/2001/05/xmlschema-errata#Errata2
  235. // E2-25
  236. //"([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*"
  237. const XMLCh fgLangPattern[] =
  238. {
  239.     chOpenParen,   chOpenSquare,  chLatin_a, chDash, chLatin_z, chLatin_A, chDash, chLatin_Z,
  240.     chCloseSquare, chOpenCurly, chDigit_1, chComma, chDigit_8, chCloseCurly, chCloseParen,
  241.     chOpenParen,   chDash, chOpenSquare, chLatin_a, chDash, chLatin_z, chLatin_A, chDash, chLatin_Z,
  242. chDigit_0,     chDash, chDigit_9, chCloseSquare, chOpenCurly, chDigit_1, chComma, chDigit_8,
  243.     chCloseCurly,  chCloseParen, chAsterisk, chNull
  244. };
  245. //E2-43
  246. //[+-]?[0-9]+
  247. const XMLCh fgIntegerPattern[] =
  248. {
  249.     chOpenSquare, chPlus, chBackSlash, chDash, chCloseSquare, chQuestion,
  250.     chOpenSquare, chDigit_0, chDash, chDigit_9, chCloseSquare, chPlus, chNull
  251. };
  252. //"\i\c*"
  253. const XMLCh fgNamePattern[] =
  254. {
  255.     chBackSlash, chLatin_i, chBackSlash, chLatin_c, chAsterisk, chNull
  256. };
  257. //"[\i-[:]][\c-[:]]*"
  258. const XMLCh fgNCNamePattern[] =
  259. {
  260.     chOpenSquare, chBackSlash, chLatin_i, chDash, chOpenSquare, chColon, chCloseSquare,
  261.     chCloseSquare, chOpenSquare, chBackSlash, chLatin_c, chDash, chOpenSquare,
  262.     chColon, chCloseSquare, chCloseSquare, chAsterisk, chNull
  263. };
  264. const XMLCh fgValueZero[] =
  265. {
  266.     chDigit_0, chNull
  267. };
  268. const XMLCh fgNegOne[] =
  269. {
  270.     chDash, chDigit_1, chNull
  271. };
  272. const XMLCh fgValueOne[] =
  273. {
  274.     chDigit_1, chNull
  275. };
  276. //"9223372036854775807"
  277. const XMLCh fgLongMaxInc[] =
  278. {
  279.     chDigit_9, chDigit_2, chDigit_2, chDigit_3, chDigit_3, chDigit_7, chDigit_2,
  280.     chDigit_0, chDigit_3, chDigit_6, chDigit_8, chDigit_5, chDigit_4, chDigit_7,
  281.     chDigit_7, chDigit_5, chDigit_8, chDigit_0, chDigit_7, chNull
  282. };
  283. //"-9223372036854775808"
  284. const XMLCh fgLongMinInc[] =
  285. {
  286.     chDash, chDigit_9, chDigit_2, chDigit_2, chDigit_3, chDigit_3, chDigit_7,
  287.     chDigit_2, chDigit_0, chDigit_3, chDigit_6, chDigit_8, chDigit_5, chDigit_4,
  288.     chDigit_7, chDigit_7, chDigit_5, chDigit_8, chDigit_0, chDigit_8,  chNull
  289. };
  290. const XMLCh fgIntMaxInc[] =
  291. {
  292.     chDigit_2, chDigit_1, chDigit_4, chDigit_7, chDigit_4, chDigit_8,
  293.     chDigit_3, chDigit_6, chDigit_4, chDigit_7, chNull
  294. };
  295. const XMLCh fgIntMinInc[] =
  296. {
  297.     chDash, chDigit_2, chDigit_1, chDigit_4, chDigit_7, chDigit_4,
  298.     chDigit_8, chDigit_3, chDigit_6, chDigit_4, chDigit_8, chNull
  299. };
  300. const XMLCh fgShortMaxInc[] =
  301. {
  302.     chDigit_3, chDigit_2, chDigit_7, chDigit_6, chDigit_7, chNull
  303. };
  304. const XMLCh fgShortMinInc[] =
  305. {
  306.     chDash, chDigit_3, chDigit_2, chDigit_7, chDigit_6, chDigit_8, chNull
  307. };
  308. const XMLCh fgByteMaxInc[] =
  309. {
  310.     chDigit_1, chDigit_2, chDigit_7, chNull
  311. };
  312. const XMLCh fgByteMinInc[] =
  313. {
  314.     chDash, chDigit_1, chDigit_2, chDigit_8, chNull
  315. };
  316. const XMLCh fgULongMaxInc[] =
  317. {
  318.     chDigit_1, chDigit_8, chDigit_4, chDigit_4, chDigit_6, chDigit_7, chDigit_4,
  319.     chDigit_4, chDigit_0, chDigit_7, chDigit_3, chDigit_7, chDigit_0, chDigit_9,
  320.     chDigit_5, chDigit_5, chDigit_1, chDigit_6, chDigit_1, chDigit_5, chNull
  321. };
  322. const XMLCh fgUIntMaxInc[] =
  323. {
  324.     chDigit_4, chDigit_2, chDigit_9, chDigit_4, chDigit_9, chDigit_6,
  325.     chDigit_7, chDigit_2, chDigit_9, chDigit_5, chNull
  326. };
  327. const XMLCh fgUShortMaxInc[] =
  328. {
  329.     chDigit_6, chDigit_5, chDigit_5, chDigit_3, chDigit_5, chNull
  330. };
  331. const XMLCh fgUByteMaxInc[] =
  332. {
  333.     chDigit_2, chDigit_5, chDigit_5, chNull
  334. };
  335. const XMLCh fgP0Y[] =
  336. {
  337.     chLatin_P, chDigit_0, chLatin_Y, chNull
  338. };
  339. const XMLCh fgP1Y[] =
  340. {
  341.     chLatin_P, chDigit_1, chLatin_Y, chNull
  342. };
  343. const XMLCh fgP100Y[] =
  344. {
  345.     chLatin_P, chDigit_1, chDigit_0, chDigit_0, chLatin_Y, chNull
  346. };
  347. const XMLCh fgPT24H[] =
  348. {
  349.     chLatin_P, chLatin_T, chDigit_2, chDigit_4, chLatin_H, chNull
  350. };
  351. const XMLCh fgP1M[] =
  352. {
  353.     chLatin_P, chDigit_1, chLatin_M, chNull
  354. };
  355. // ---------------------------------------------------------------------------
  356. //  DatatypeValidatorFactory: Static member data
  357. // ---------------------------------------------------------------------------
  358. RefHashTableOf<DatatypeValidator>* DatatypeValidatorFactory::fBuiltInRegistry = 0;
  359. // ---------------------------------------------------------------------------
  360. //  DatatypeValidatorFactory: Constructors and Destructor
  361. // ---------------------------------------------------------------------------
  362. DatatypeValidatorFactory::DatatypeValidatorFactory(MemoryManager* const manager)
  363.     : fUserDefinedRegistry(0)
  364.     , fMemoryManager(manager)
  365. {
  366. }
  367. DatatypeValidatorFactory::~DatatypeValidatorFactory()
  368. {
  369. cleanUp();
  370. }
  371. // ---------------------------------------------------------------------------
  372. //  DatatypeValidatorFactory: Reset methods
  373. // ---------------------------------------------------------------------------
  374. void DatatypeValidatorFactory::resetRegistry() {
  375.     if (fUserDefinedRegistry != 0) {
  376.         fUserDefinedRegistry->removeAll();
  377.     }
  378. }
  379. // -----------------------------------------------------------------------
  380. //  Notification that lazy data has been deleted
  381. // -----------------------------------------------------------------------
  382. void DatatypeValidatorFactory::reinitRegistry() {
  383. delete fBuiltInRegistry;
  384. fBuiltInRegistry = 0;
  385. }
  386. // ---------------------------------------------------------------------------
  387. //  DatatypeValidatorFactory: Registry initialization methods
  388. // ---------------------------------------------------------------------------
  389. void DatatypeValidatorFactory::expandRegistryToFullSchemaSet()
  390. {
  391.     static XMLRegisterCleanup builtInRegistryCleanup;
  392.     // Initialize common Schema/DTD Datatype validator set if not initialized
  393.     if (fBuiltInRegistry == 0) {
  394.         RefHashTableOf<DatatypeValidator>* t = new RefHashTableOf<DatatypeValidator>(29);
  395.         if (XMLPlatformUtils::compareAndSwap((void **)&fBuiltInRegistry, t, 0) != 0)
  396.         {
  397.             delete t;
  398.         }
  399.         else
  400.         {
  401.             builtInRegistryCleanup.registerCleanup(reinitRegistry);
  402.             DatatypeValidator *dv = new StringDatatypeValidator(); 
  403.             dv->setTypeName(SchemaSymbols::fgDT_STRING, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  404.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_STRING, dv);
  405.             
  406.             dv = new NOTATIONDatatypeValidator();
  407.             dv->setTypeName(XMLUni::fgNotationString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  408.             fBuiltInRegistry->put((void*) XMLUni::fgNotationString, dv);
  409.             dv = new AnySimpleTypeDatatypeValidator();
  410.             dv->setTypeName(SchemaSymbols::fgDT_ANYSIMPLETYPE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  411.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_ANYSIMPLETYPE, dv);
  412.             dv = new BooleanDatatypeValidator();
  413.             dv->setTypeName(SchemaSymbols::fgDT_BOOLEAN, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  414.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_BOOLEAN, dv);
  415.             dv = new DecimalDatatypeValidator();
  416.             dv->setTypeName(SchemaSymbols::fgDT_DECIMAL, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  417.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DECIMAL, dv);
  418.             dv = new HexBinaryDatatypeValidator();
  419.             dv->setTypeName(SchemaSymbols::fgDT_HEXBINARY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  420.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_HEXBINARY, dv);
  421.             dv = new Base64BinaryDatatypeValidator();
  422.             dv->setTypeName(SchemaSymbols::fgDT_BASE64BINARY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  423.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_BASE64BINARY, dv);
  424.             dv = new DoubleDatatypeValidator();
  425.             dv->setTypeName(SchemaSymbols::fgDT_DOUBLE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  426.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DOUBLE, dv);
  427.             dv = new FloatDatatypeValidator();
  428.             dv->setTypeName(SchemaSymbols::fgDT_FLOAT, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  429.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_FLOAT, dv);
  430.             dv = new AnyURIDatatypeValidator();
  431.             dv->setTypeName(SchemaSymbols::fgDT_ANYURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  432.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_ANYURI, dv);
  433.             dv = new QNameDatatypeValidator();
  434.             dv->setTypeName(SchemaSymbols::fgDT_QNAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  435.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_QNAME, dv);
  436.             dv = new DateTimeDatatypeValidator();
  437.             dv->setTypeName(SchemaSymbols::fgDT_DATETIME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  438.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DATETIME, dv);
  439.             dv = new DateDatatypeValidator();
  440.             dv->setTypeName(SchemaSymbols::fgDT_DATE, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  441.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DATE, dv);
  442.             dv = new TimeDatatypeValidator();
  443.             dv->setTypeName(SchemaSymbols::fgDT_TIME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  444.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_TIME, dv);
  445.             dv = new DayDatatypeValidator();
  446.             dv->setTypeName(SchemaSymbols::fgDT_DAY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  447.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DAY, dv);
  448.             dv = new MonthDatatypeValidator();
  449.             dv->setTypeName(SchemaSymbols::fgDT_MONTH, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  450.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_MONTH, dv);
  451.             dv = new MonthDayDatatypeValidator();
  452.             dv->setTypeName(SchemaSymbols::fgDT_MONTHDAY, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  453.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_MONTHDAY, dv);
  454.             dv = new YearDatatypeValidator();
  455.             dv->setTypeName(SchemaSymbols::fgDT_YEAR, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  456.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_YEAR, dv);
  457.             dv = new YearMonthDatatypeValidator();
  458.             dv->setTypeName(SchemaSymbols::fgDT_YEARMONTH, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  459.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_YEARMONTH, dv);
  460.             dv = new DurationDatatypeValidator();
  461.             dv->setTypeName(SchemaSymbols::fgDT_DURATION, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  462.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_DURATION, dv);
  463.             // REVISIT
  464.             // We are creating a lot of Hashtables for the facets of the different
  465.             // validators. It's better to have some kind of a memory pool and ask
  466.             // the pool to give us a new instance of the hashtable.
  467.             RefHashTableOf<KVStringPair>* facets = new RefHashTableOf<KVStringPair>(3);
  468.             // Create 'normalizedString' datatype validator
  469.             facets->put((void*) SchemaSymbols::fgELT_WHITESPACE,
  470.                         new KVStringPair(SchemaSymbols::fgELT_WHITESPACE, SchemaSymbols::fgWS_REPLACE));
  471.             createDatatypeValidator(SchemaSymbols::fgDT_NORMALIZEDSTRING,
  472.                                     getDatatypeValidator(SchemaSymbols::fgDT_STRING),
  473.                                     facets, 0, false, 0, false);
  474.             // Create 'token' datatype validator
  475.             facets = new RefHashTableOf<KVStringPair>(3);
  476.             facets->put((void*) SchemaSymbols::fgELT_WHITESPACE,
  477.                         new KVStringPair(SchemaSymbols::fgELT_WHITESPACE, SchemaSymbols::fgWS_COLLAPSE));
  478.             createDatatypeValidator(SchemaSymbols::fgDT_TOKEN,
  479.                           getDatatypeValidator(SchemaSymbols::fgDT_NORMALIZEDSTRING),
  480.                           facets, 0, false, 0, false);
  481.             dv = new NameDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_TOKEN), 0, 0, 0);
  482.             dv->setTypeName(SchemaSymbols::fgDT_NAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  483.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_NAME, dv);
  484.             dv = new NCNameDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NAME), 0, 0, 0);
  485.             dv->setTypeName(SchemaSymbols::fgDT_NCNAME, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  486.             fBuiltInRegistry->put((void*) SchemaSymbols::fgDT_NCNAME, dv);
  487.             // Create 'NMTOKEN' datatype validator
  488.             facets = new RefHashTableOf<KVStringPair>(3);
  489.             facets->put((void*) SchemaSymbols::fgELT_PATTERN ,
  490.                             new KVStringPair(SchemaSymbols::fgELT_PATTERN,fgTokPattern));
  491.             facets->put((void*) SchemaSymbols::fgELT_WHITESPACE,
  492.                             new KVStringPair(SchemaSymbols::fgELT_WHITESPACE, SchemaSymbols::fgWS_COLLAPSE));
  493.             createDatatypeValidator(XMLUni::fgNmTokenString,
  494.                             getDatatypeValidator(SchemaSymbols::fgDT_TOKEN),facets, 0, false, 0, false);
  495.             // Create 'NMTOKENS' datatype validator
  496.             createDatatypeValidator(XMLUni::fgNmTokensString,
  497.                           getDatatypeValidator(XMLUni::fgNmTokenString), 0, 0, true, 0, false);
  498.             // Create 'language' datatype validator
  499.             facets = new RefHashTableOf<KVStringPair>(3);
  500.             facets->put((void*) SchemaSymbols::fgELT_PATTERN,
  501.                         new KVStringPair(SchemaSymbols::fgELT_PATTERN, fgLangPattern));
  502.             createDatatypeValidator(SchemaSymbols::fgDT_LANGUAGE,
  503.                           getDatatypeValidator(SchemaSymbols::fgDT_TOKEN),
  504.                           facets, 0, false, 0, false);
  505.             // Create 'integer' datatype validator
  506.             facets = new RefHashTableOf<KVStringPair>(3);
  507.             facets->put((void*) SchemaSymbols::fgELT_FRACTIONDIGITS,
  508.                         new KVStringPair(SchemaSymbols::fgELT_FRACTIONDIGITS, fgValueZero));
  509.             facets->put((void*) SchemaSymbols::fgELT_PATTERN,
  510.                         new KVStringPair(SchemaSymbols::fgELT_PATTERN, fgIntegerPattern));
  511.             createDatatypeValidator(SchemaSymbols::fgDT_INTEGER,
  512.                           getDatatypeValidator(SchemaSymbols::fgDT_DECIMAL),
  513.                           facets, 0, false, 0, false);
  514.             // Create 'nonPositiveInteger' datatype validator
  515.             facets = new RefHashTableOf<KVStringPair>(2);
  516.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  517.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgValueZero));
  518.             createDatatypeValidator(SchemaSymbols::fgDT_NONPOSITIVEINTEGER,
  519.                           getDatatypeValidator(SchemaSymbols::fgDT_INTEGER),
  520.                           facets, 0, false, 0, false);
  521.             // Create 'negativeInteger' datatype validator
  522.             facets = new RefHashTableOf<KVStringPair>(2);
  523.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  524.              new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE,fgNegOne));
  525.             createDatatypeValidator(SchemaSymbols::fgDT_NEGATIVEINTEGER,
  526.                           getDatatypeValidator(SchemaSymbols::fgDT_NONPOSITIVEINTEGER),
  527.                           facets, 0, false, 0, false);
  528.             // Create 'long' datatype validator
  529.             facets = new RefHashTableOf<KVStringPair>(2);
  530.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  531.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE,fgLongMaxInc));
  532.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  533.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE,fgLongMinInc));
  534.             createDatatypeValidator(SchemaSymbols::fgDT_LONG,
  535.                           getDatatypeValidator(SchemaSymbols::fgDT_INTEGER),
  536.                           facets, 0, false, 0, false);
  537.             // Create 'int' datatype validator
  538.             facets = new RefHashTableOf<KVStringPair>(2);
  539.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  540.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgIntMaxInc));
  541.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  542.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE, fgIntMinInc));
  543.             createDatatypeValidator(SchemaSymbols::fgDT_INT,
  544.                           getDatatypeValidator(SchemaSymbols::fgDT_LONG),
  545.                           facets, 0, false, 0, false);
  546.             // Create 'short' datatype validator
  547.             facets = new RefHashTableOf<KVStringPair>(2);
  548.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  549.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgShortMaxInc));
  550.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  551.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE, fgShortMinInc));
  552.             createDatatypeValidator(SchemaSymbols::fgDT_SHORT,
  553.                           getDatatypeValidator(SchemaSymbols::fgDT_INT),
  554.                           facets, 0, false, 0 ,false);
  555.             // Create 'byte' datatype validator
  556.             facets = new RefHashTableOf<KVStringPair>(2);
  557.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  558.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgByteMaxInc));
  559.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  560.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE, fgByteMinInc));
  561.             createDatatypeValidator(SchemaSymbols::fgDT_BYTE,
  562.                           getDatatypeValidator(SchemaSymbols::fgDT_SHORT),
  563.                           facets, 0, false, 0, false);
  564.             // Create 'nonNegativeInteger' datatype validator
  565.             facets = new RefHashTableOf<KVStringPair>(2);
  566.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  567.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE, fgValueZero));
  568.             createDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER,
  569.                           getDatatypeValidator(SchemaSymbols::fgDT_INTEGER),
  570.                           facets, 0, false, 0, false);
  571.             // Create 'unsignedLong' datatype validator
  572.             facets = new RefHashTableOf<KVStringPair>(2);
  573.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  574.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgULongMaxInc));
  575.             createDatatypeValidator(SchemaSymbols::fgDT_ULONG,
  576.                           getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER),
  577.                           facets, 0, false, 0, false);
  578.             // Create 'unsignedInt' datatype validator
  579.             facets = new RefHashTableOf<KVStringPair>(2);
  580.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  581.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgUIntMaxInc));
  582.             createDatatypeValidator(SchemaSymbols::fgDT_UINT,
  583.                           getDatatypeValidator(SchemaSymbols::fgDT_ULONG),
  584.                           facets, 0, false, 0, false);
  585.             // Create 'unsignedShort' datatypeValidator
  586.             facets = new RefHashTableOf<KVStringPair>(2);
  587.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  588.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgUShortMaxInc));
  589.             createDatatypeValidator(SchemaSymbols::fgDT_USHORT,
  590.                           getDatatypeValidator(SchemaSymbols::fgDT_UINT),
  591.                           facets, 0, false, 0, false);
  592.             // Create 'unsignedByte' datatype validator
  593.             facets = new RefHashTableOf<KVStringPair>(2);
  594.             facets->put((void*) SchemaSymbols::fgELT_MAXINCLUSIVE,
  595.                         new KVStringPair(SchemaSymbols::fgELT_MAXINCLUSIVE, fgUByteMaxInc));
  596.             createDatatypeValidator(SchemaSymbols::fgDT_UBYTE,
  597.                           getDatatypeValidator(SchemaSymbols::fgDT_USHORT),
  598.                           facets, 0, false, 0, false);
  599.             // Create 'positiveInteger' datatype validator
  600.             facets = new RefHashTableOf<KVStringPair>(2);
  601.             facets->put((void*) SchemaSymbols::fgELT_MININCLUSIVE,
  602.                         new KVStringPair(SchemaSymbols::fgELT_MININCLUSIVE, fgValueOne));
  603.             createDatatypeValidator(SchemaSymbols::fgDT_POSITIVEINTEGER,
  604.                           getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER),
  605.                           facets, 0, false, 0, false);
  606.         }
  607.     }
  608.     // ID, IDREF IDREFS, ENTITY, ENTITIES  DTV have specific data member
  609.     //   and cannot be shared across threads
  610.     // So instead of storing them in the static fBuiltInRegistry,
  611.     //   store them in local data fUserDefinedRegistry
  612.     if (fUserDefinedRegistry == 0)
  613.         fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29, fMemoryManager);
  614.     if (!getDatatypeValidator(XMLUni::fgIDRefsString)) {
  615.         DatatypeValidator *dv = new (fMemoryManager) IDDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0, fMemoryManager);
  616.         dv->setTypeName(XMLUni::fgIDString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  617.         fUserDefinedRegistry->put((void*) XMLUni::fgIDString, dv);
  618.         dv = new (fMemoryManager) IDREFDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0, fMemoryManager);
  619.         dv->setTypeName(XMLUni::fgIDRefString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  620.         fUserDefinedRegistry->put((void*) XMLUni::fgIDRefString, dv);
  621.         dv = new (fMemoryManager) ENTITYDatatypeValidator(getDatatypeValidator(SchemaSymbols::fgDT_NCNAME), 0, 0, 0, fMemoryManager);
  622.         dv->setTypeName(XMLUni::fgEntityString, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);
  623.         fUserDefinedRegistry->put((void*) XMLUni::fgEntityString, dv);
  624.         // Create 'IDREFS' datatype validator
  625.      createDatatypeValidator
  626.         (
  627.             XMLUni::fgIDRefsString
  628.             , getDatatypeValidator(XMLUni::fgIDRefString)
  629.             , 0
  630.             , 0
  631.             , true
  632.             , 0
  633.         );
  634.         // Create 'ENTITIES' datatype validator
  635.         createDatatypeValidator
  636.         (
  637.             XMLUni::fgEntitiesString
  638.      , getDatatypeValidator(XMLUni::fgEntityString)
  639.             , 0
  640.             , 0
  641.             , true
  642.             , 0
  643.         );
  644.     }
  645. }
  646. // ---------------------------------------------------------------------------
  647. //  DatatypeValidatorFactory: factory methods
  648. // ---------------------------------------------------------------------------
  649. DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator
  650. (
  651.       const XMLCh* const                  typeName
  652. , DatatypeValidator* const            baseValidator
  653.     , RefHashTableOf<KVStringPair>* const facets
  654.     , RefArrayVectorOf<XMLCh>* const      enums
  655.     , const bool                          isDerivedByList
  656.     , const int                           finalSet
  657.     , const bool                          isUserDefined
  658. )
  659. {
  660. if (baseValidator == 0) {
  661.         if (facets) {
  662.             Janitor<KVStringPairHashTable> janFacets(facets);
  663.         }
  664.         if (enums) {
  665.             Janitor<XMLChRefVector> janEnums(enums);
  666.         }
  667.         return 0;
  668.     }
  669. DatatypeValidator* datatypeValidator = 0;
  670.     MemoryManager* const manager = (isUserDefined)
  671.         ? fMemoryManager : XMLPlatformUtils::fgMemoryManager;
  672.     if (isDerivedByList) {
  673.         datatypeValidator = new (manager) ListDatatypeValidator(baseValidator, facets, enums, finalSet, manager);
  674.     }
  675.     else {
  676.         if ((baseValidator->getType() != DatatypeValidator::String) && facets) {
  677.             KVStringPair* value = facets->get(SchemaSymbols::fgELT_WHITESPACE);
  678.             if (value != 0) {
  679.                 facets->removeKey(SchemaSymbols::fgELT_WHITESPACE);
  680.             }
  681.         }
  682.         datatypeValidator = baseValidator->newInstance
  683.         (
  684.             facets
  685.             , enums
  686.             , finalSet
  687.             , manager
  688.         );
  689.     }
  690.     if (datatypeValidator != 0) {
  691.         if (isUserDefined) {
  692.             if (!fUserDefinedRegistry) {
  693.                 fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29, fMemoryManager);
  694.             }
  695.             fUserDefinedRegistry->put((void *)typeName, datatypeValidator);
  696.         }
  697.         else {
  698.             fBuiltInRegistry->put((void *)typeName, datatypeValidator);
  699.         }
  700.         datatypeValidator->setTypeName(typeName);
  701.     }
  702.     return datatypeValidator;
  703. }
  704. DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator
  705. (
  706.       const XMLCh* const                    typeName
  707.     , RefVectorOf<DatatypeValidator>* const validators
  708.     , const int                             finalSet
  709.     , const bool                            userDefined
  710. )
  711. {
  712.     if (validators == 0)
  713.         return 0;
  714.     DatatypeValidator* datatypeValidator = 0;
  715.     MemoryManager* const manager = (userDefined)
  716.         ? fMemoryManager : XMLPlatformUtils::fgMemoryManager;
  717.     datatypeValidator = new (manager) UnionDatatypeValidator(validators, finalSet, manager);
  718.     if (datatypeValidator != 0) {
  719.         if (userDefined) {
  720.             if (!fUserDefinedRegistry) {
  721.                 fUserDefinedRegistry = new (fMemoryManager) RefHashTableOf<DatatypeValidator>(29, fMemoryManager);
  722.             }
  723.             fUserDefinedRegistry->put((void *)typeName, datatypeValidator);
  724.         }
  725.         else {
  726.             fBuiltInRegistry->put((void *)typeName, datatypeValidator);
  727.         }
  728.         datatypeValidator->setTypeName(typeName);
  729.     }
  730.     return datatypeValidator;
  731. }
  732. XERCES_CPP_NAMESPACE_END
  733. /**
  734.   * End of file DatatypeValidatorFactory.cpp
  735.   */