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

词法分析

开发平台:

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: SchemaElementDecl.cpp,v $
  58.  * Revision 1.10  2003/05/18 14:02:08  knoaman
  59.  * Memory manager implementation: pass per instance manager.
  60.  *
  61.  * Revision 1.9  2003/05/16 21:43:21  knoaman
  62.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  63.  *
  64.  * Revision 1.8  2003/05/15 18:57:27  knoaman
  65.  * Partial implementation of the configurable memory manager.
  66.  *
  67.  * Revision 1.7  2003/01/29 19:47:16  gareth
  68.  * added DOMTypeInfo and some PSVI methods
  69.  *
  70.  * Revision 1.6  2002/11/04 14:49:41  tng
  71.  * C++ Namespace Support.
  72.  *
  73.  * Revision 1.5  2002/07/12 15:17:48  knoaman
  74.  * For a given global element, store info about a substitution group element
  75.  * as a SchemaElementDecl and not as a string.
  76.  *
  77.  * Revision 1.4  2002/05/08 13:53:37  peiyongz
  78.  * Bug#8898: SchemaElementDecl doesn't compile with Intel C++ for IA32,
  79.  *                   patch from Curt Arnold
  80.  *
  81.  * Revision 1.3  2002/03/21 16:31:43  knoaman
  82.  * Remove data/methods from SchemaElementDecl that are not used.
  83.  *
  84.  * Revision 1.2  2002/02/06 22:30:50  knoaman
  85.  * Added a new attribute to store the wild card information for elements of type 'anyType'.
  86.  *
  87.  * Revision 1.1.1.1  2002/02/01 22:22:46  peiyongz
  88.  * sane_include
  89.  *
  90.  * Revision 1.18  2002/01/02 15:20:22  tng
  91.  * Schema Fix: should not store a temp value as the key in the element pool and the attribute pool.
  92.  *
  93.  * Revision 1.17  2001/11/02 14:13:45  knoaman
  94.  * Add support for identity constraints.
  95.  *
  96.  * Revision 1.16  2001/10/11 12:07:39  tng
  97.  * Schema: model type should be based on complextypeinfo if exists.
  98.  *
  99.  * Revision 1.15  2001/09/14 14:50:22  tng
  100.  * Schema: Fix some wildcard bugs, and some retrieving qualified/unqualified element decl problems.
  101.  *
  102.  * Revision 1.14  2001/09/11 13:02:40  tng
  103.  * [Bug 3523] SchemaElementDecl.cpp(242) : error C2202 : not all control paths return a value
  104.  *
  105.  * Revision 1.13  2001/08/29 20:52:35  tng
  106.  * Schema: xsi:type support
  107.  *
  108.  * Revision 1.12  2001/08/21 16:06:11  tng
  109.  * Schema: Unique Particle Attribution Constraint Checking.
  110.  *
  111.  * Revision 1.11  2001/07/24 18:33:46  knoaman
  112.  * Added support for <group> + extra constraint checking for complexType
  113.  *
  114.  * Revision 1.10  2001/07/09 15:22:43  knoaman
  115.  * complete <any> declaration.
  116.  *
  117.  * Revision 1.9  2001/06/13 20:51:18  peiyongz
  118.  * fIsMixed: to handle mixed Content Model
  119.  *
  120.  * Revision 1.8  2001/05/11 13:27:35  tng
  121.  * Copyright update.
  122.  *
  123.  * Revision 1.7  2001/05/03 20:34:42  tng
  124.  * Schema: SchemaValidator update
  125.  *
  126.  * Revision 1.6  2001/05/03 19:17:59  knoaman
  127.  * TraverseSchema Part II.
  128.  *
  129.  * Revision 1.5  2001/04/19 17:43:16  knoaman
  130.  * More schema implementation classes.
  131.  *
  132.  * Revision 1.4  2001/03/21 21:56:33  tng
  133.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  134.  *
  135.  * Revision 1.3  2001/03/21 19:30:15  tng
  136.  * Schema: Content Model Updates, by Pei Yong Zhang.
  137.  *
  138.  * Revision 1.2  2001/03/07 17:42:12  tng
  139.  * fix typo
  140.  *
  141.  * Revision 1.1  2001/02/27 18:48:22  tng
  142.  * Schema: Add SchemaAttDef, SchemaElementDecl, SchemaAttDefList.
  143.  *
  144.  */
  145. // ---------------------------------------------------------------------------
  146. //  Includes
  147. // ---------------------------------------------------------------------------
  148. #include <xercesc/util/XMLString.hpp>
  149. #include <xercesc/util/XMLUniDefs.hpp>
  150. #include <xercesc/util/XMLUni.hpp>
  151. #include <xercesc/validators/schema/SchemaAttDefList.hpp>
  152. #include <xercesc/validators/schema/SchemaElementDecl.hpp>
  153. #include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
  154. XERCES_CPP_NAMESPACE_BEGIN
  155. // ---------------------------------------------------------------------------
  156. //  SchemaElementDecl: Constructors and Destructor
  157. // ---------------------------------------------------------------------------
  158. SchemaElementDecl::SchemaElementDecl(MemoryManager* const manager) :
  159.     XMLElementDecl(manager)
  160.     , fModelType(Any)
  161.     , fDatatypeValidator(0)
  162.     , fEnclosingScope(Grammar::TOP_LEVEL_SCOPE)
  163.     , fBlockSet(0)
  164.     , fFinalSet(0)
  165.     , fMiscFlags(0)
  166.     , fDefaultValue(0)
  167.     , fComplexTypeInfo(0)
  168.     , fXsiComplexTypeInfo(0)
  169.     , fXsiSimpleTypeInfo(0)
  170.     , fAttDefs(0)
  171.     , fIdentityConstraints(0)
  172.     , fAttWildCard(0)
  173.     , fSubstitutionGroupElem(0)
  174.     , fValidity(PSVIDefs::UNKNOWN)
  175.     , fValidation(PSVIDefs::NONE)
  176.     , fSeenValidation(false)
  177.     , fSeenNoValidation(false)
  178.     , fHadContent(false)
  179. {
  180. }
  181. SchemaElementDecl::SchemaElementDecl(const XMLCh* const                  prefix
  182.                                    , const XMLCh* const                  localPart
  183.                                    , const int                           uriId
  184.                                    , const SchemaElementDecl::ModelTypes type
  185.                                    , const int                           enclosingScope
  186.                                    , MemoryManager* const                manager) :
  187.     XMLElementDecl(manager)
  188.     , fModelType(type)
  189.     , fDatatypeValidator(0)
  190.     , fEnclosingScope(enclosingScope)
  191.     , fBlockSet(0)
  192.     , fFinalSet(0)
  193.     , fMiscFlags(0)
  194.     , fDefaultValue(0)
  195.     , fComplexTypeInfo(0)
  196.     , fXsiComplexTypeInfo(0)
  197.     , fXsiSimpleTypeInfo(0)
  198.     , fAttDefs(0)
  199.     , fIdentityConstraints(0)
  200.     , fAttWildCard(0)
  201.     , fSubstitutionGroupElem(0)
  202.     , fValidity(PSVIDefs::UNKNOWN)
  203.     , fValidation(PSVIDefs::NONE)
  204.     , fSeenValidation(false)
  205.     , fSeenNoValidation(false)
  206.     , fHadContent(false)
  207. {
  208.     setElementName(prefix, localPart, uriId);
  209. }
  210. SchemaElementDecl::SchemaElementDecl(const QName* const                  elementName
  211.                                    , const SchemaElementDecl::ModelTypes type
  212.                                    , const int                           enclosingScope
  213.                                    , MemoryManager* const                manager) :
  214.     XMLElementDecl(manager)
  215.     , fModelType(type)
  216.     , fDatatypeValidator(0)
  217.     , fEnclosingScope(enclosingScope)
  218.     , fBlockSet(0)
  219.     , fFinalSet(0)
  220.     , fMiscFlags(0)
  221.     , fDefaultValue(0)
  222.     , fComplexTypeInfo(0)
  223.     , fXsiComplexTypeInfo(0)
  224.     , fXsiSimpleTypeInfo(0)
  225.     , fAttDefs(0)
  226.     , fIdentityConstraints(0)
  227.     , fAttWildCard(0)
  228.     , fSubstitutionGroupElem(0)
  229.     , fValidity(PSVIDefs::UNKNOWN)
  230.     , fValidation(PSVIDefs::NONE)
  231.     , fSeenValidation(false)
  232.     , fSeenNoValidation(false)
  233.     , fHadContent(false)
  234. {
  235.     setElementName(elementName);
  236. }
  237. SchemaElementDecl::~SchemaElementDecl()
  238. {
  239.     getMemoryManager()->deallocate(fDefaultValue);//delete [] fDefaultValue;
  240.     delete fAttDefs;
  241.     delete fIdentityConstraints;
  242.     delete fAttWildCard;
  243. }
  244. // ---------------------------------------------------------------------------
  245. //  SchemaElementDecl: XMLElementDecl virtual interface implementation
  246. // ---------------------------------------------------------------------------
  247. XMLAttDef* SchemaElementDecl::findAttr(const XMLCh* const    qName
  248.                                      , const unsigned int    uriId
  249.                                      , const XMLCh* const    baseName
  250.                                      , const XMLCh* const    prefix
  251.                                      , const LookupOpts      options
  252.                                      , bool&           wasAdded) const
  253. {
  254.     if (fXsiComplexTypeInfo) {
  255.         return fXsiComplexTypeInfo->findAttr(qName, uriId, baseName, prefix, options, wasAdded);
  256.     }
  257.     else if (fComplexTypeInfo) {
  258.         return fComplexTypeInfo->findAttr(qName, uriId, baseName, prefix, options, wasAdded);
  259.     }
  260.     else {
  261.         if (options == XMLElementDecl::AddIfNotFound) {
  262.             SchemaAttDef* retVal = 0;
  263.             // If no att list exist yet, then create one
  264.             if (!fAttDefs) {
  265.                 // Use a hash modulus of 29 and tell it owns its elements
  266.                 ((SchemaElementDecl*)this)->fAttDefs =
  267.                     new (getMemoryManager()) RefHash2KeysTableOf<SchemaAttDef>(29, true, getMemoryManager());
  268.             }
  269.             retVal = fAttDefs->get(baseName, uriId);
  270.             // Fault it in if not found and ask to add it
  271.             if (!retVal)
  272.             {
  273.                 // And add a default attribute for this name
  274.                 retVal = new (getMemoryManager()) SchemaAttDef
  275.                 (
  276.                     prefix
  277.                     , baseName
  278.                     , uriId
  279.                     , XMLAttDef::CData
  280.                     , XMLAttDef::Implied
  281.                     , getMemoryManager()
  282.                 );
  283.                 retVal->setElemId(getId());
  284.                 fAttDefs->put((void*)retVal->getAttName()->getLocalPart(), uriId, retVal);
  285.                 wasAdded = true;
  286.             }
  287.              else
  288.             {
  289.                 wasAdded = false;
  290.             }
  291.             return retVal;
  292.         }
  293.         else {
  294.             wasAdded = false;
  295.             return 0;
  296.         }
  297.     }
  298. }
  299. XMLAttDefList& SchemaElementDecl::getAttDefList() const
  300. {
  301.     if (fXsiComplexTypeInfo) {
  302.         return fXsiComplexTypeInfo->getAttDefList();
  303.     }
  304.     else if (!fComplexTypeInfo)
  305. {
  306.         ThrowXML(RuntimeException, XMLExcepts::DV_InvalidOperation);
  307.     }
  308. return fComplexTypeInfo->getAttDefList();
  309. }
  310. XMLElementDecl::CharDataOpts SchemaElementDecl::getCharDataOpts() const
  311. {
  312.     SchemaElementDecl::ModelTypes modelType = fModelType;
  313.     if (fXsiComplexTypeInfo) {
  314.         modelType = (SchemaElementDecl::ModelTypes) fXsiComplexTypeInfo->getContentType();
  315.     }
  316.     else if (fComplexTypeInfo) {
  317.         modelType = (SchemaElementDecl::ModelTypes) fComplexTypeInfo->getContentType();
  318.     }
  319.     XMLElementDecl::CharDataOpts retVal;
  320.     switch(modelType)
  321.     {
  322.         case Children :
  323.             retVal = XMLElementDecl::SpacesOk;
  324.             break;
  325.         case Empty :
  326.             retVal = XMLElementDecl::NoCharData;
  327.             break;
  328.         default :
  329.             retVal = XMLElementDecl::AllCharData;
  330.             break;
  331.     }
  332.     return retVal;
  333. }
  334. bool SchemaElementDecl::hasAttDefs() const
  335. {
  336.     if (fXsiComplexTypeInfo) {
  337.         return fXsiComplexTypeInfo->hasAttDefs();
  338.     }
  339.     else if (fComplexTypeInfo) {
  340.         return fComplexTypeInfo->hasAttDefs();
  341.     }
  342.     // If the collection hasn't been faulted in, then no att defs
  343.     return false;
  344. }
  345. bool SchemaElementDecl::resetDefs()
  346. {
  347.     if (fXsiComplexTypeInfo) {
  348.         return fXsiComplexTypeInfo->resetDefs();
  349.     }
  350.     else if (fComplexTypeInfo) {
  351.         return fComplexTypeInfo->resetDefs();
  352.     }
  353.     else if (fAttDefs) {
  354.         //all the attdefs here are faulted-in, so just reset the fAttDefs
  355.         //but still return false to indicate there is no real att defs
  356.         // defined in this element
  357.         fAttDefs->removeAll();
  358.     }
  359.     return false;
  360. }
  361. const XMLCh*
  362. SchemaElementDecl::getFormattedContentModel() const
  363. {
  364.     if (fXsiComplexTypeInfo) {
  365.         return fXsiComplexTypeInfo->getFormattedContentModel();
  366.     }
  367.     else if (fComplexTypeInfo) {
  368.         return fComplexTypeInfo->getFormattedContentModel();
  369.     }
  370.     return 0;
  371. }
  372. // ---------------------------------------------------------------------------
  373. //  SchemaElementDecl: Getter methods
  374. // ---------------------------------------------------------------------------
  375. const SchemaAttDef* SchemaElementDecl::getAttDef(const XMLCh* const baseName, const int uriId) const
  376. {
  377.     if (fXsiComplexTypeInfo) {
  378.         return fXsiComplexTypeInfo->getAttDef(baseName, uriId);
  379.     }
  380.     else if (fComplexTypeInfo) {
  381.         return fComplexTypeInfo->getAttDef(baseName, uriId);
  382.     }
  383.     // If no complex type, then return a null
  384.     return 0;
  385. }
  386. SchemaAttDef* SchemaElementDecl::getAttDef(const XMLCh* const baseName, const int uriId)
  387. {
  388.     if (fXsiComplexTypeInfo) {
  389.         return fXsiComplexTypeInfo->getAttDef(baseName, uriId);
  390.     }
  391.     else if (fComplexTypeInfo) {
  392.         return fComplexTypeInfo->getAttDef(baseName, uriId);
  393.     }
  394.     // If no complex type, then return a null
  395.     return 0;
  396. }
  397. XERCES_CPP_NAMESPACE_END