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

词法分析

开发平台:

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.hpp,v $
  58.  * Revision 1.11  2003/05/18 14:02:08  knoaman
  59.  * Memory manager implementation: pass per instance manager.
  60.  *
  61.  * Revision 1.10  2003/05/16 21:43:21  knoaman
  62.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  63.  *
  64.  * Revision 1.9  2003/05/15 18:57:27  knoaman
  65.  * Partial implementation of the configurable memory manager.
  66.  *
  67.  * Revision 1.8  2003/01/29 19:47:16  gareth
  68.  * added DOMTypeInfo and some PSVI methods
  69.  *
  70.  * Revision 1.7  2002/11/04 14:49:41  tng
  71.  * C++ Namespace Support.
  72.  *
  73.  * Revision 1.6  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.5  2002/04/01 15:47:06  knoaman
  78.  * Move Element Consistency checking (ref to global declarations) to SchemaValidator.
  79.  *
  80.  * Revision 1.4  2002/03/21 16:31:43  knoaman
  81.  * Remove data/methods from SchemaElementDecl that are not used.
  82.  *
  83.  * Revision 1.3  2002/03/04 15:09:50  knoaman
  84.  * Fix for bug 6834.
  85.  *
  86.  * Revision 1.2  2002/02/06 22:30:50  knoaman
  87.  * Added a new attribute to store the wild card information for elements of type 'anyType'.
  88.  *
  89.  * Revision 1.1.1.1  2002/02/01 22:22:46  peiyongz
  90.  * sane_include
  91.  *
  92.  * Revision 1.16  2001/11/23 18:25:45  tng
  93.  * Eliminate Warning from AIX xlC 3.6: 1540-399: (W) "IdentityConstraint" is undefined.  The delete operator will not call a destructor.
  94.  *
  95.  * Revision 1.15  2001/11/02 14:13:45  knoaman
  96.  * Add support for identity constraints.
  97.  *
  98.  * Revision 1.14  2001/10/11 12:07:39  tng
  99.  * Schema: model type should be based on complextypeinfo if exists.
  100.  *
  101.  * Revision 1.13  2001/09/05 20:49:11  knoaman
  102.  * Fix for complexTypes with mixed content model.
  103.  *
  104.  * Revision 1.12  2001/08/29 20:52:35  tng
  105.  * Schema: xsi:type support
  106.  *
  107.  * Revision 1.11  2001/08/21 16:06:11  tng
  108.  * Schema: Unique Particle Attribution Constraint Checking.
  109.  *
  110.  * Revision 1.10  2001/08/09 15:23:16  knoaman
  111.  * add support for <anyAttribute> declaration.
  112.  *
  113.  * Revision 1.9  2001/07/24 18:33:46  knoaman
  114.  * Added support for <group> + extra constraint checking for complexType
  115.  *
  116.  * Revision 1.8  2001/06/13 20:51:15  peiyongz
  117.  * fIsMixed: to handle mixed Content Model
  118.  *
  119.  * Revision 1.7  2001/05/11 13:27:36  tng
  120.  * Copyright update.
  121.  *
  122.  * Revision 1.6  2001/05/03 20:34:43  tng
  123.  * Schema: SchemaValidator update
  124.  *
  125.  * Revision 1.5  2001/05/03 19:18:01  knoaman
  126.  * TraverseSchema Part II.
  127.  *
  128.  * Revision 1.4  2001/04/19 17:43:17  knoaman
  129.  * More schema implementation classes.
  130.  *
  131.  * Revision 1.3  2001/03/21 21:56:33  tng
  132.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  133.  *
  134.  * Revision 1.2  2001/03/21 19:30:17  tng
  135.  * Schema: Content Model Updates, by Pei Yong Zhang.
  136.  *
  137.  * Revision 1.1  2001/02/27 18:48:23  tng
  138.  * Schema: Add SchemaAttDef, SchemaElementDecl, SchemaAttDefList.
  139.  *
  140.  */
  141. #if !defined(SCHEMAELEMENTDECL_HPP)
  142. #define SCHEMAELEMENTDECL_HPP
  143. #include <xercesc/util/QName.hpp>
  144. #include <xercesc/validators/common/Grammar.hpp>
  145. #include <xercesc/validators/schema/ComplexTypeInfo.hpp>
  146. #include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
  147. #include <xercesc/validators/datatype/DatatypeValidator.hpp>
  148. #include <xercesc/validators/datatype/UnionDatatypeValidator.hpp>
  149. #include <xercesc/validators/schema/PSVIDefs.hpp>
  150. XERCES_CPP_NAMESPACE_BEGIN
  151. class ContentSpecNode;
  152. class SchemaAttDefList;
  153. //
  154. //  This class is a derivative of the basic element decl. This one implements
  155. //  the virtuals so that they work for a Schema.
  156. //
  157. class VALIDATORS_EXPORT SchemaElementDecl : public XMLElementDecl
  158. {
  159. public :
  160.     // -----------------------------------------------------------------------
  161.     //  Class specific types
  162.     //
  163.     //  ModelTypes
  164.     //      Indicates the type of content model that an element has. This
  165.     //      indicates how the content model is represented and validated.
  166.     // -----------------------------------------------------------------------
  167.     enum ModelTypes
  168.     {
  169.         Empty
  170.         , Any
  171.         , Mixed_Simple
  172.         , Mixed_Complex
  173.         , Children
  174.         , Simple
  175.         , ModelTypes_Count
  176.     };
  177.     // -----------------------------------------------------------------------
  178.     //  Constructors and Destructor
  179.     // -----------------------------------------------------------------------
  180.     SchemaElementDecl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  181.     SchemaElementDecl
  182.     (
  183.           const XMLCh* const   prefix
  184.         , const XMLCh* const   localPart
  185.         , const int            uriId
  186.         , const ModelTypes     modelType = Any
  187.         , const int            enclosingScope = Grammar::TOP_LEVEL_SCOPE
  188.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  189.     );
  190.     SchemaElementDecl
  191.     (
  192.           const QName* const   elementName
  193.         , const ModelTypes     modelType = Any
  194.         , const int            enclosingScope = Grammar::TOP_LEVEL_SCOPE
  195.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  196.     );
  197.     ~SchemaElementDecl();
  198.     // -----------------------------------------------------------------------
  199.     //  The virtual element decl interface
  200.     // -----------------------------------------------------------------------
  201.     virtual XMLAttDef* findAttr
  202.     (
  203.         const   XMLCh* const    qName
  204.         , const unsigned int    uriId
  205.         , const XMLCh* const    baseName
  206.         , const XMLCh* const    prefix
  207.         , const LookupOpts      options
  208.         ,       bool&           wasAdded
  209.     )   const;
  210.     virtual XMLAttDefList& getAttDefList() const;
  211.     virtual CharDataOpts getCharDataOpts() const;
  212.     virtual bool hasAttDefs() const;
  213.     virtual bool resetDefs();
  214.     virtual const ContentSpecNode* getContentSpec() const;
  215.     virtual ContentSpecNode* getContentSpec();
  216.     virtual void setContentSpec(ContentSpecNode* toAdopt);
  217.     virtual XMLContentModel* getContentModel();
  218.     virtual void setContentModel(XMLContentModel* const newModelToAdopt);
  219.     virtual const XMLCh* getFormattedContentModel ()   const;
  220.     // -----------------------------------------------------------------------
  221.     //  Getter methods
  222.     // -----------------------------------------------------------------------
  223.     const SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId) const;
  224.     SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId);
  225.     const SchemaAttDef* getAttWildCard() const;
  226.     SchemaAttDef* getAttWildCard();
  227.     ModelTypes getModelType() const;
  228.     DatatypeValidator* getDatatypeValidator() const;
  229.     int getEnclosingScope() const;
  230.     int getFinalSet() const;
  231.     int getBlockSet() const;
  232.     int getMiscFlags() const;
  233.     XMLCh* getDefaultValue() const;
  234.     ComplexTypeInfo* getComplexTypeInfo() const;
  235.     virtual bool isGlobalDecl() const;
  236.     SchemaElementDecl* getSubstitutionGroupElem() const;
  237.     // ----------------------------------------------------------------------
  238.     // Partial implementation of PSVI
  239.     // The values these methods return are only accurate until the cleanUp method
  240.     // is called (in the end tag part of the scanner you are using)
  241.     // note that some of this information has dependancies. For example,
  242.     // if something is not valid then the information returned by the other 
  243.     // calls may be meaningless
  244.     // See http://www.w3.org/TR/xmlschema-1/ for detailed information
  245.     // ----------------------------------------------------------------------
  246.     /**
  247.      * The appropriate case among the following:
  248.      * 1 If it was strictly assessed, then the appropriate case among the following:
  249.      * 1.1 If all of the following are true
  250.      *    1.1.1
  251.      *    1.1.1.1 clause 1.1 of Schema-Validity Assessment (Element) (3.3.4) applied and the item was valid as defined by Element Locally Valid (Element) (3.3.4);
  252.      *    1.1.1.2 clause 1.2 of Schema-Validity Assessment (Element) (3.3.4) applied and the item was valid as defined by Element Locally Valid (Type) (3.3.4).
  253.      *    1.1.2 Neither its [children] nor its [attributes] contains an information item (element or attribute respectively) whose [validity] is invalid.
  254.      *    1.1.3 Neither its [children] nor its [attributes] contains an information item (element or attribute respectively) with a context-determined declaration of mustFind whose [validity] is unknown.
  255.     , then valid;
  256.     *    1.2 otherwise invalid.
  257.     *    2 otherwise notKnown.
  258.     */
  259.     PSVIDefs::Validity getValidity() const;
  260.     /**
  261.      * The appropriate case among the following:
  262.      * 1 If it was strictly assessed and neither its [children] nor its [attributes] contains an information item (element or attribute respectively) whose [validation attempted] is not full, then full;
  263.      * 2 If it was not strictly assessed and neither its [children] nor its [attributes] contains an information item (element or attribute respectively) whose [validation attempted] is not none, then none;
  264.      *3 otherwise partial.
  265.      */
  266.     PSVIDefs::Validation getValidationAttempted() const;
  267.     /**
  268.      * @return the complexity. simple or complex, depending on the type definition.
  269.      */
  270.     PSVIDefs::Complexity getTypeType() const;
  271.     /**
  272.      * The target namespace of the type definition.
  273.      */
  274.     const XMLCh* getTypeUri() const;
  275.     /**
  276.      * The {name} of the type definition, if it is not absent. 
  277.      */
  278.     const XMLCh* getTypeName() const;
  279.     /**
  280.      * true if the {name} of the type definition is absent, otherwise false.
  281.      */
  282.     bool getTypeAnonymous() const;
  283.     /**
  284.      * If this method returns true and validity is VALID then the next three 
  285.      * produce accurate results
  286.      * @return true if the element is validated using a union type
  287.      */
  288.     bool isTypeDefinitionUnion() const;
  289.     /**
  290.      * The {target namespace} of the actual member type definition.
  291.      */
  292.     const XMLCh* getMemberTypeUri() const;
  293.     /**
  294.      * @return true if the {name} of the actual member type definition is absent, otherwise false.
  295.      */
  296.     bool getMemberTypeAnonymous() const;
  297.     /**
  298.      * @return the {name} of the actual member type definition, if it is not absent. 
  299.      */
  300.     const XMLCh* getMemberTypeName() const;
  301.     virtual const XMLCh* getDOMTypeInfoUri() const;
  302.     virtual const XMLCh* getDOMTypeInfoName() const;
  303.     // -----------------------------------------------------------------------
  304.     //  Setter methods
  305.     // -----------------------------------------------------------------------
  306.     void setModelType(const SchemaElementDecl::ModelTypes toSet);
  307.     void setDatatypeValidator(DatatypeValidator* newDatatypeValidator);
  308.     void setEnclosingScope(const int enclosingScope);
  309.     void setFinalSet(const int finalSet);
  310.     void setBlockSet(const int blockSet);
  311.     void setMiscFlags(const int flags);
  312.     void setDefaultValue(const XMLCh* const value);
  313.     void setComplexTypeInfo(ComplexTypeInfo* const typeInfo);
  314.     void setXsiComplexTypeInfo(ComplexTypeInfo* const typeInfo);
  315.     void setXsiSimpleTypeInfo(const DatatypeValidator* const dtv);
  316.     void setAttWildCard(SchemaAttDef* const attWildCard);
  317.     void setSubstitutionGroupElem(SchemaElementDecl* const elemDecl);
  318.     void setValidity(PSVIDefs::Validity valid);
  319.     void setValidationAttempted(PSVIDefs::Validation validation);
  320.     
  321.     //called when element content of this element was validated
  322.     void updateValidityFromElement(const XMLElementDecl *decl, Grammar::GrammarType eleGrammar);
  323.     
  324.     //called when attribute content of this element was validated    
  325.     void updateValidityFromAttribute(const SchemaAttDef *def);
  326.     //cleans up inbetween uses of the SchemaElementDecl. Resets xsiType, Validity etc.
  327.     void reset();
  328.     // -----------------------------------------------------------------------
  329.     //  IC methods
  330.     // -----------------------------------------------------------------------
  331.     void addIdentityConstraint(IdentityConstraint* const ic);
  332.     unsigned int getIdentityConstraintCount() const;
  333.     IdentityConstraint* getIdentityConstraintAt(unsigned int index) const;
  334. private :
  335.     // -----------------------------------------------------------------------
  336.     //  Private data members
  337.     //
  338.     //  fModelType
  339.     //      The content model type of this element. This tells us what kind
  340.     //      of content model to create.
  341.     //
  342.     //  fDatatypeValidator
  343.     //      The DatatypeValidator used to validate this element type.
  344.     //
  345.     //  fEnclosingScope
  346.     //      The enclosing scope where this element is declared.
  347.     //
  348.     //  fFinalSet
  349.     //      The value set of the 'final' attribute.
  350.     //
  351.     //  fBlockSet
  352.     //      The value set of the 'block' attribute.
  353.     //
  354.     //  fMiscFlags
  355.     //      Stores 'abstract/nullable' values
  356.     //
  357.     //  fDefaultValue
  358.     //      The defalut/fixed value
  359.     //
  360.     //  fComplexTypeInfo
  361.     //      Stores complex type information
  362.     //      (no need to delete - handled by schema grammar)
  363.     //
  364.     //  fAttDefs
  365.     //      The list of attributes that are faulted in for this element
  366.     //      when ComplexTypeInfo does not exist.  We want to keep track
  367.     //      of these faulted in attributes to avoid duplicate redundant
  368.     //      error.
  369.     //
  370.     //  fXsiComplexTypeInfo
  371.     //      Temporary store the xsi:type ComplexType here for validation
  372.     //      If it presents, then it takes precedence than its own fComplexTypeInfo.
  373.     //
  374.     //  fXsiSimpleTypeInfo
  375.     //      Temporary store the xsi:type SimpleType here for validation
  376.     //      If it present then the information from it will be returned rather than fDatatypeValidator
  377.     //
  378.     //  fIdentityConstraints
  379.     //      Store information about an element identity constraints.
  380.     //
  381.     //  fAttWildCard
  382.     //      Store wildcard attribute in the case of an element with a type of
  383.     //      'anyType'.
  384.     //
  385.     //  fSubstitutionGroupElem
  386.     //      The substitution group element declaration.
  387.     //
  388.     //  fValidity
  389.     //      After this attr has been validated this is its validity
  390.     //
  391.     //  fValidation
  392.     //      The type of validation that happened to this attr
  393.     //
  394.     //  fSeenValidation
  395.     //      set to true when a piece of content of this element is validated 
  396.     //
  397.     //  fSeenNoValidation
  398.     //      set to true when a piece of content of this element is laxly or skip validated
  399.     //
  400.     //  fHadContent
  401.     //      true when this element actually had content.
  402.     // -----------------------------------------------------------------------
  403.     // -----------------------------------------------------------------------
  404.     ModelTypes                         fModelType;
  405.     DatatypeValidator*                 fDatatypeValidator;
  406.     int                                fEnclosingScope;
  407.     int                                fFinalSet;
  408.     int                                fBlockSet;
  409.     int                                fMiscFlags;
  410.     XMLCh*                             fDefaultValue;
  411.     ComplexTypeInfo*                   fComplexTypeInfo;
  412.     RefHash2KeysTableOf<SchemaAttDef>* fAttDefs;
  413.     ComplexTypeInfo*                   fXsiComplexTypeInfo;
  414.     const DatatypeValidator*           fXsiSimpleTypeInfo;
  415.     RefVectorOf<IdentityConstraint>*   fIdentityConstraints;
  416.     SchemaAttDef*                      fAttWildCard;
  417.     SchemaElementDecl*                 fSubstitutionGroupElem;
  418.     PSVIDefs::Validity                 fValidity;
  419.     PSVIDefs::Validation               fValidation;
  420.     bool                               fSeenValidation;
  421.     bool                               fSeenNoValidation;
  422.     bool                               fHadContent;
  423. };
  424. // ---------------------------------------------------------------------------
  425. //  SchemaElementDecl: XMLElementDecl virtual interface implementation
  426. // ---------------------------------------------------------------------------
  427. inline ContentSpecNode* SchemaElementDecl::getContentSpec()
  428. {
  429.     if (fXsiComplexTypeInfo != 0) {
  430.         return fXsiComplexTypeInfo->getContentSpec();
  431.     }
  432.     else if (fComplexTypeInfo != 0) {
  433.         return fComplexTypeInfo->getContentSpec();
  434.     }
  435.     return 0;
  436. }
  437. inline const ContentSpecNode* SchemaElementDecl::getContentSpec() const
  438. {
  439.     if (fXsiComplexTypeInfo != 0) {
  440.         return fXsiComplexTypeInfo->getContentSpec();
  441.     }
  442.     else if (fComplexTypeInfo != 0) {
  443.         return fComplexTypeInfo->getContentSpec();
  444.     }
  445.     return 0;
  446. }
  447. inline void
  448. SchemaElementDecl::setContentSpec(ContentSpecNode* toAdopt)
  449. {
  450.     //Handled by complexType
  451. }
  452. inline XMLContentModel* SchemaElementDecl::getContentModel()
  453. {
  454.     if (fXsiComplexTypeInfo != 0) {
  455.         return fXsiComplexTypeInfo->getContentModel();
  456.     }
  457.     else if (fComplexTypeInfo != 0) {
  458.         return fComplexTypeInfo->getContentModel();
  459.     }
  460.     return 0;
  461. }
  462. inline void
  463. SchemaElementDecl::setContentModel(XMLContentModel* const newModelToAdopt)
  464. {
  465.     //Handled by complexType
  466. }
  467. // ---------------------------------------------------------------------------
  468. //  SchemaElementDecl: Getter methods
  469. // ---------------------------------------------------------------------------
  470. inline SchemaElementDecl::ModelTypes SchemaElementDecl::getModelType() const
  471. {
  472.     if (fXsiComplexTypeInfo) {
  473.         return (SchemaElementDecl::ModelTypes) fXsiComplexTypeInfo->getContentType();
  474.     }
  475.     else if (fComplexTypeInfo) {
  476.         return (SchemaElementDecl::ModelTypes) fComplexTypeInfo->getContentType();
  477.     }
  478.     return fModelType;
  479. }
  480. inline DatatypeValidator* SchemaElementDecl::getDatatypeValidator() const
  481. {
  482.     if (fXsiComplexTypeInfo) {
  483.         return fXsiComplexTypeInfo->getDatatypeValidator();
  484.     }
  485.     return fDatatypeValidator;
  486. }
  487. inline int SchemaElementDecl::getEnclosingScope() const
  488. {
  489.     return fEnclosingScope;
  490. }
  491. inline int SchemaElementDecl::getFinalSet() const
  492. {
  493.     return fFinalSet;
  494. }
  495. inline int SchemaElementDecl::getBlockSet() const
  496. {
  497.     return fBlockSet;
  498. }
  499. inline int SchemaElementDecl::getMiscFlags() const
  500. {
  501.     return fMiscFlags;
  502. }
  503. inline XMLCh* SchemaElementDecl::getDefaultValue() const
  504. {
  505.     return fDefaultValue;
  506. }
  507. inline ComplexTypeInfo* SchemaElementDecl::getComplexTypeInfo() const
  508. {
  509.     if (fXsiComplexTypeInfo) {
  510.         return fXsiComplexTypeInfo;
  511.     }
  512.     return fComplexTypeInfo;
  513. }
  514. inline const SchemaAttDef* SchemaElementDecl::getAttWildCard() const {
  515.     if (fXsiComplexTypeInfo) {
  516.         return fXsiComplexTypeInfo->getAttWildCard();
  517.     }
  518.     else if (fComplexTypeInfo) {
  519.         return fComplexTypeInfo->getAttWildCard();
  520.     }
  521.     return fAttWildCard;
  522. }
  523. inline SchemaAttDef* SchemaElementDecl::getAttWildCard() {
  524.     if (fXsiComplexTypeInfo) {
  525.         return fXsiComplexTypeInfo->getAttWildCard();
  526.     }
  527.     else if (fComplexTypeInfo) {
  528.         return fComplexTypeInfo->getAttWildCard();
  529.     }
  530.     return fAttWildCard;
  531. }
  532. inline bool SchemaElementDecl::isGlobalDecl() const {
  533.     return (fEnclosingScope == Grammar::TOP_LEVEL_SCOPE);
  534. }
  535. inline SchemaElementDecl*
  536. SchemaElementDecl::getSubstitutionGroupElem() const {
  537.     return fSubstitutionGroupElem;
  538. }
  539. inline const XMLCh* SchemaElementDecl::getTypeName() const {
  540.     if (fXsiComplexTypeInfo)
  541.         return fXsiComplexTypeInfo->getTypeLocalName();
  542.     else if (fComplexTypeInfo) 
  543.         return fComplexTypeInfo->getTypeLocalName();
  544.     else if(fXsiSimpleTypeInfo)
  545.         return fXsiSimpleTypeInfo->getTypeLocalName();
  546.     else if(fDatatypeValidator)
  547.         return fDatatypeValidator->getTypeLocalName();
  548.     //its anyType if we have not done validation on it
  549.     if(getValidationAttempted() == PSVIDefs::NONE)
  550.         return SchemaSymbols::fgATTVAL_ANYTYPE;
  551.     return 0;
  552. }
  553. inline PSVIDefs::Complexity SchemaElementDecl::getTypeType() const {
  554.     if(getModelType() == Simple) {
  555.         return PSVIDefs::SIMPLE;
  556.     }
  557.     else {
  558.         return PSVIDefs::COMPLEX;
  559.     }
  560. }
  561. inline const XMLCh* SchemaElementDecl::getTypeUri() const {
  562.     if (fXsiComplexTypeInfo)
  563.         return fXsiComplexTypeInfo->getTypeUri();
  564.     else if (fComplexTypeInfo)
  565.         return fComplexTypeInfo->getTypeUri();
  566.     else if(fXsiSimpleTypeInfo)
  567.         return fXsiSimpleTypeInfo->getTypeUri();
  568.     else if(fDatatypeValidator)
  569.         return fDatatypeValidator->getTypeUri();
  570.     //its anyType if we have not done validation on it
  571.     if(getValidationAttempted() == PSVIDefs::NONE)
  572.         return SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
  573.     return 0;
  574. }
  575. inline const XMLCh* SchemaElementDecl::getMemberTypeName() const {
  576.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  577.         return ((UnionDatatypeValidator*)fXsiSimpleTypeInfo)->getMemberTypeName();
  578.     else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  579.         return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeName();
  580.     return 0;
  581. }
  582. inline const XMLCh* SchemaElementDecl::getMemberTypeUri() const {
  583.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  584.         return ((UnionDatatypeValidator*)fXsiSimpleTypeInfo)->getMemberTypeUri();
  585.     if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  586.         return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeUri();
  587.     return 0;
  588. }
  589. inline bool SchemaElementDecl::getMemberTypeAnonymous() const {
  590.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  591.         return ((UnionDatatypeValidator*)fXsiSimpleTypeInfo)->getMemberTypeAnonymous();
  592.     else if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  593.         return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeAnonymous();
  594.     return false;
  595. }
  596. inline bool SchemaElementDecl::isTypeDefinitionUnion() const {
  597.    if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union ||
  598.       fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  599.        return true;
  600.     return false;
  601. }
  602. inline PSVIDefs::Validity SchemaElementDecl::getValidity() const {
  603.     return fValidity;
  604. }
  605. inline PSVIDefs::Validation SchemaElementDecl::getValidationAttempted() const {
  606.     if(!fHadContent)
  607.         return fValidation;
  608.     if(!fSeenNoValidation && fSeenValidation)
  609.         return PSVIDefs::FULL;
  610.     else if(fSeenNoValidation && !fSeenValidation)
  611.         return PSVIDefs::NONE;
  612.     else
  613.         return PSVIDefs::PARTIAL;
  614. }
  615. inline bool SchemaElementDecl::getTypeAnonymous() const {
  616.     
  617.     //REVISIT - since xsi type have to be accessed through names 
  618.     //presumeably they cannot be anonymous
  619.     
  620.     if (fXsiComplexTypeInfo) {
  621.         return fXsiComplexTypeInfo->getAnonymous();
  622.     }
  623.     else if (fComplexTypeInfo) {
  624.         return fComplexTypeInfo->getAnonymous();
  625.     }
  626.     else if(fXsiSimpleTypeInfo) {
  627.         return fXsiSimpleTypeInfo->getAnonymous();
  628.     }
  629.     else if(fDatatypeValidator){
  630.         return fDatatypeValidator->getAnonymous();
  631.     }
  632.     return true;
  633. }
  634. inline const XMLCh* SchemaElementDecl::getDOMTypeInfoName() const {
  635.     if(fValidity != PSVIDefs::VALID) {
  636.         if(getTypeType() == PSVIDefs::SIMPLE)
  637.             return SchemaSymbols::fgDT_ANYSIMPLETYPE;
  638.         else
  639.             return SchemaSymbols::fgATTVAL_ANYTYPE;
  640.     }
  641.     if(getTypeAnonymous() || getMemberTypeAnonymous())
  642.         return 0;
  643.     if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  644.         return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeName();
  645.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  646.         return ((UnionDatatypeValidator*)fXsiSimpleTypeInfo)->getMemberTypeName();
  647.     return getTypeName();
  648. }
  649. inline const XMLCh* SchemaElementDecl::getDOMTypeInfoUri() const {
  650.     if(fValidity != PSVIDefs::VALID)
  651.         return SchemaSymbols::fgURI_SCHEMAFORSCHEMA;
  652.     if(getTypeAnonymous() || getMemberTypeAnonymous())
  653.         return 0;
  654.     if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  655.         return ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeUri();
  656.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  657.         return ((UnionDatatypeValidator*)fXsiSimpleTypeInfo)->getMemberTypeUri();
  658.     return getTypeUri();
  659. }
  660. // ---------------------------------------------------------------------------
  661. //  SchemaElementDecl: Setter methods
  662. // ---------------------------------------------------------------------------
  663. inline void
  664. SchemaElementDecl::setModelType(const SchemaElementDecl::ModelTypes toSet)
  665. {
  666.     fModelType = toSet;
  667. }
  668. inline void SchemaElementDecl::setDatatypeValidator(DatatypeValidator* newDatatypeValidator)
  669. {
  670.     fDatatypeValidator = newDatatypeValidator;
  671. }
  672. inline void SchemaElementDecl::setEnclosingScope(const int newEnclosingScope)
  673. {
  674.     fEnclosingScope = newEnclosingScope;
  675. }
  676. inline void SchemaElementDecl::setFinalSet(const int finalSet)
  677. {
  678.     fFinalSet = finalSet;
  679. }
  680. inline void SchemaElementDecl::setBlockSet(const int blockSet)
  681. {
  682.     fBlockSet = blockSet;
  683. }
  684. inline void SchemaElementDecl::setMiscFlags(const int flags)
  685. {
  686.     fMiscFlags = flags;
  687. }
  688. inline void SchemaElementDecl::setDefaultValue(const XMLCh* const value)
  689. {
  690.     if (fDefaultValue) {
  691.         getMemoryManager()->deallocate(fDefaultValue);//delete[] fDefaultValue;
  692.     }
  693.     fDefaultValue = XMLString::replicate(value, getMemoryManager());
  694. }
  695. inline void
  696. SchemaElementDecl::setComplexTypeInfo(ComplexTypeInfo* const typeInfo)
  697. {
  698.     fComplexTypeInfo = typeInfo;
  699. }
  700. inline void
  701. SchemaElementDecl::setXsiComplexTypeInfo(ComplexTypeInfo* const typeInfo)
  702. {
  703.     fXsiComplexTypeInfo = typeInfo;
  704. }
  705. inline void
  706. SchemaElementDecl::setXsiSimpleTypeInfo(const DatatypeValidator* const dtv)
  707. {
  708.     fXsiSimpleTypeInfo = dtv;
  709. }
  710. inline void
  711. SchemaElementDecl::setAttWildCard(SchemaAttDef* const attWildCard) {
  712.     if (fAttWildCard)
  713.         delete fAttWildCard;
  714.     fAttWildCard = attWildCard;
  715. }
  716. inline void
  717. SchemaElementDecl::setSubstitutionGroupElem(SchemaElementDecl* const elemDecl) {
  718.     fSubstitutionGroupElem = elemDecl;
  719. }
  720. inline void SchemaElementDecl::setValidity(PSVIDefs::Validity valid) {
  721.     fValidity = valid;
  722. }
  723. inline void SchemaElementDecl::setValidationAttempted(PSVIDefs::Validation validation) {
  724.     fValidation = validation;
  725. }
  726. inline void SchemaElementDecl::updateValidityFromAttribute(const SchemaAttDef *def) {
  727.     PSVIDefs::Validation curValAttemted = def->getValidationAttempted();
  728.     PSVIDefs::Validity curVal = def->getValidity();
  729.         
  730.     if(curValAttemted == PSVIDefs::NONE || curValAttemted == PSVIDefs::PARTIAL) {
  731.         fSeenNoValidation = true;
  732.         fValidity = PSVIDefs::UNKNOWN;
  733.     }
  734.     else {
  735.         fSeenValidation = true;
  736.     }
  737.         
  738.     if(curVal == PSVIDefs::INVALID)
  739.         fValidity = PSVIDefs::INVALID;
  740.     fHadContent = true;
  741. }
  742. inline void SchemaElementDecl::updateValidityFromElement(const XMLElementDecl *decl, Grammar::GrammarType eleGrammar) {
  743.     if (eleGrammar == Grammar::SchemaGrammarType) {                    
  744.         PSVIDefs::Validation curValAttemted = ((SchemaElementDecl *)decl)->getValidationAttempted();
  745.         PSVIDefs::Validity curVal = ((SchemaElementDecl *)decl)->getValidity();
  746.         
  747.         if(curValAttemted == PSVIDefs::NONE || curValAttemted == PSVIDefs::PARTIAL) {
  748.             fSeenNoValidation = true;
  749.             fValidity = PSVIDefs::UNKNOWN;
  750.         }
  751.         else {
  752.             fSeenValidation = true;
  753.         }
  754.         
  755.         if(curVal == PSVIDefs::INVALID)
  756.             fValidity = PSVIDefs::INVALID;
  757.     }
  758.     fHadContent = true;
  759. }
  760. inline void SchemaElementDecl::reset() {
  761.     if(fXsiSimpleTypeInfo && fXsiSimpleTypeInfo->getType() == DatatypeValidator::Union)
  762.         ((UnionDatatypeValidator *)fXsiSimpleTypeInfo)->reset();
  763.     if(fDatatypeValidator && fDatatypeValidator->getType() == DatatypeValidator::Union)
  764.         ((UnionDatatypeValidator *)fDatatypeValidator)->reset();
  765.     setXsiSimpleTypeInfo(0);
  766.     setXsiComplexTypeInfo(0);
  767.     fValidity = PSVIDefs::UNKNOWN;
  768.     fValidation = PSVIDefs::NONE;    
  769.     fSeenValidation = false;
  770.     fSeenNoValidation = false;
  771.     fHadContent = false;
  772. }
  773. // ---------------------------------------------------------------------------
  774. //  SchemaElementDecl: IC methods
  775. // ---------------------------------------------------------------------------
  776. inline void
  777. SchemaElementDecl::addIdentityConstraint(IdentityConstraint* const ic) {
  778.     if (!fIdentityConstraints) {
  779.         fIdentityConstraints = new (getMemoryManager()) RefVectorOf<IdentityConstraint>(16, true, getMemoryManager());
  780.     }
  781.     fIdentityConstraints->addElement(ic);
  782. }
  783. inline unsigned int SchemaElementDecl::getIdentityConstraintCount() const {
  784.     if (fIdentityConstraints) {
  785.         return fIdentityConstraints->size();
  786.     }
  787.     return 0;
  788. }
  789. inline IdentityConstraint*
  790. SchemaElementDecl::getIdentityConstraintAt(unsigned int index) const {
  791.     if (fIdentityConstraints) {
  792.         return fIdentityConstraints->elementAt(index);
  793.     }
  794.     return 0;
  795. }
  796. XERCES_CPP_NAMESPACE_END
  797. #endif