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

xml/soap/webservice

开发平台:

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