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

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: SchemaElementDecl.hpp,v $
  58.  * Revision 1.16  2001/11/23 18:25:45  tng
  59.  * Eliminate Warning from AIX xlC 3.6: 1540-399: (W) "IdentityConstraint" is undefined.  The delete operator will not call a destructor.
  60.  *
  61.  * Revision 1.15  2001/11/02 14:13:45  knoaman
  62.  * Add support for identity constraints.
  63.  *
  64.  * Revision 1.14  2001/10/11 12:07:39  tng
  65.  * Schema: model type should be based on complextypeinfo if exists.
  66.  *
  67.  * Revision 1.13  2001/09/05 20:49:11  knoaman
  68.  * Fix for complexTypes with mixed content model.
  69.  *
  70.  * Revision 1.12  2001/08/29 20:52:35  tng
  71.  * Schema: xsi:type support
  72.  *
  73.  * Revision 1.11  2001/08/21 16:06:11  tng
  74.  * Schema: Unique Particle Attribution Constraint Checking.
  75.  *
  76.  * Revision 1.10  2001/08/09 15:23:16  knoaman
  77.  * add support for <anyAttribute> declaration.
  78.  *
  79.  * Revision 1.9  2001/07/24 18:33:46  knoaman
  80.  * Added support for <group> + extra constraint checking for complexType
  81.  *
  82.  * Revision 1.8  2001/06/13 20:51:15  peiyongz
  83.  * fIsMixed: to handle mixed Content Model
  84.  *
  85.  * Revision 1.7  2001/05/11 13:27:36  tng
  86.  * Copyright update.
  87.  *
  88.  * Revision 1.6  2001/05/03 20:34:43  tng
  89.  * Schema: SchemaValidator update
  90.  *
  91.  * Revision 1.5  2001/05/03 19:18:01  knoaman
  92.  * TraverseSchema Part II.
  93.  *
  94.  * Revision 1.4  2001/04/19 17:43:17  knoaman
  95.  * More schema implementation classes.
  96.  *
  97.  * Revision 1.3  2001/03/21 21:56:33  tng
  98.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  99.  *
  100.  * Revision 1.2  2001/03/21 19:30:17  tng
  101.  * Schema: Content Model Updates, by Pei Yong Zhang.
  102.  *
  103.  * Revision 1.1  2001/02/27 18:48:23  tng
  104.  * Schema: Add SchemaAttDef, SchemaElementDecl, SchemaAttDefList.
  105.  *
  106.  */
  107. #if !defined(SCHEMAELEMENTDECL_HPP)
  108. #define SCHEMAELEMENTDECL_HPP
  109. #include <util/QName.hpp>
  110. #include <validators/common/Grammar.hpp>
  111. #include <validators/schema/ComplexTypeInfo.hpp>
  112. #include <validators/schema/identity/IdentityConstraint.hpp>
  113. class ContentSpecNode;
  114. class SchemaAttDefList;
  115. class DatatypeValidator;
  116. //
  117. //  This class is a derivative of the basic element decl. This one implements
  118. //  the virtuals so that they work for a Schema.
  119. //
  120. class VALIDATORS_EXPORT SchemaElementDecl : public XMLElementDecl
  121. {
  122. public :
  123.     // -----------------------------------------------------------------------
  124.     //  Class specific types
  125.     //
  126.     //  ModelTypes
  127.     //      Indicates the type of content model that an element has. This
  128.     //      indicates how the content model is represented and validated.
  129.     // -----------------------------------------------------------------------
  130.     enum ModelTypes
  131.     {
  132.         Empty
  133.         , Any
  134.         , Mixed_Simple
  135.         , Mixed_Complex
  136.         , Children
  137.         , Simple
  138.         , ModelTypes_Count
  139.     };
  140.     // -----------------------------------------------------------------------
  141.     //  Constructors and Destructor
  142.     // -----------------------------------------------------------------------
  143.     SchemaElementDecl();
  144.     SchemaElementDecl
  145.     (
  146.         const XMLCh* const       prefix
  147.       , const XMLCh* const       localPart
  148.       , const int                uriId
  149.       , const ModelTypes         modelType = Any
  150.       , const int                enclosingScope = Grammar::TOP_LEVEL_SCOPE
  151.     );
  152.     SchemaElementDecl
  153.     (
  154.         const QName* const       elementName
  155.       , const ModelTypes         modelType = Any
  156.       , const int                enclosingScope = Grammar::TOP_LEVEL_SCOPE
  157.     );
  158.     ~SchemaElementDecl();
  159.     // -----------------------------------------------------------------------
  160.     //  The virtual element decl interface
  161.     // -----------------------------------------------------------------------
  162.     virtual XMLAttDef* findAttr
  163.     (
  164.         const   XMLCh* const    qName
  165.         , const unsigned int    uriId
  166.         , const XMLCh* const    baseName
  167.         , const XMLCh* const    prefix
  168.         , const LookupOpts      options
  169.         ,       bool&           wasAdded
  170.     )   const;
  171.     virtual XMLAttDefList& getAttDefList() const;
  172.     virtual CharDataOpts getCharDataOpts() const;
  173.     virtual bool hasAttDefs() const;
  174.     virtual bool resetDefs();
  175.     virtual const ContentSpecNode* getContentSpec() const;
  176.     virtual ContentSpecNode* getContentSpec();
  177.     virtual void setContentSpec(ContentSpecNode* toAdopt);
  178.     virtual XMLContentModel* getContentModel();
  179.     virtual void setContentModel(XMLContentModel* const newModelToAdopt);
  180.     virtual const XMLCh* getFormattedContentModel ()   const;
  181.     // -----------------------------------------------------------------------
  182.     //  Getter methods
  183.     // -----------------------------------------------------------------------
  184.     const SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId) const;
  185.     SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId);
  186.     const SchemaAttDef* getAttWildCard() const;
  187.     SchemaAttDef* getAttWildCard();
  188.     ModelTypes getModelType() const;
  189.     DatatypeValidator* getDatatypeValidator() const;
  190.     int getEnclosingScope() const;
  191.     int getDefinedScope() const;
  192.     int getFinalSet() const;
  193.     int getBlockSet() const;
  194.     int getMiscFlags() const;
  195.     XMLCh* getDefaultValue() const;
  196.     XMLCh* getSubstitutionGroupName() const;
  197.     XMLCh* getTypeFromAnotherSchemaURI() const;
  198.     ComplexTypeInfo* getComplexTypeInfo() const;
  199.     // -----------------------------------------------------------------------
  200.     //  Setter methods
  201.     // -----------------------------------------------------------------------
  202.     void setModelType(const SchemaElementDecl::ModelTypes toSet);
  203.     void setDatatypeValidator(DatatypeValidator* newDatatypeValidator);
  204.     void setEnclosingScope(const int enclosingScope);
  205.     void setDefinedScope(const int definedScope);
  206.     void setFinalSet(const int finalSet);
  207.     void setBlockSet(const int blockSet);
  208.     void setMiscFlags(const int flags);
  209.     void setDefaultValue(const XMLCh* const value);
  210.     void setSubstitutionGroupName(const XMLCh* const name);
  211.     void setTypeFromAnotherSchemaURI(const XMLCh* const uriStr);
  212.     void setComplexTypeInfo(ComplexTypeInfo* const typeInfo);
  213.     void setXsiComplexTypeInfo(ComplexTypeInfo* const typeInfo);
  214.     // -----------------------------------------------------------------------
  215.     //  IC methods
  216.     // -----------------------------------------------------------------------
  217.     void addIdentityConstraint(IdentityConstraint* const ic);
  218.     unsigned int getIdentityConstraintCount() const;
  219.     IdentityConstraint* getIdentityConstraintAt(unsigned int index) const;
  220. private :
  221.     // -----------------------------------------------------------------------
  222.     //  Private data members
  223.     //
  224.     //  fModelType
  225.     //      The content model type of this element. This tells us what kind
  226.     //      of content model to create.
  227.     //
  228.     //  fDatatypeValidator
  229.     //      The DatatypeValidator used to validate this element type.
  230.     //
  231.     //  fEnclosingScope
  232.     //      The enclosing scope where this element is declared.
  233.     //
  234.     //  fDefinedScope
  235.     //      The Complex Element that this element belongs to.
  236.     //
  237.     //  fFinalSet
  238.     //      The value set of the 'final' attribute.
  239.     //
  240.     //  fBlockSet
  241.     //      The value set of the 'block' attribute.
  242.     //
  243.     //  fMiscFlags
  244.     //      Stores 'abstract/nullable' values
  245.     //
  246.     //  fDefaultValue
  247.     //      The defalut/fixed value
  248.     //
  249.     //  fSubstitutionGroupName
  250.     //      The substitution group full name ("uristring','local")
  251.     //
  252.     //  fTypeFromAnotherSchemaURI
  253.     //      The URI of type if it belongs to a different schema
  254.     //
  255.     //  fComplexTypeInfo
  256.     //      Stores complex type information
  257.     //      (no need to delete - handled by schema grammar)
  258.     //
  259.     //  fAttDefs
  260.     //      The list of attributes that are faulted in for this element
  261.     //      when ComplexTypeInfo does not exist.  We want to keep track
  262.     //      of these faulted in attributes to avoid duplicate redundant
  263.     //      error.
  264.     //
  265.     //  fXsiComplexTypeInfo
  266.     //      Temporary store the xsi:type ComplexType here for validation
  267.     //      If it presents, then it takes precedence than its own fComplexTypeInfo.
  268.     //
  269.     //  fIdentityConstraints
  270.     //      Store information about an element identity constraints.
  271.     // -----------------------------------------------------------------------
  272.     ModelTypes                         fModelType;
  273.     DatatypeValidator*                 fDatatypeValidator;
  274.     int                                fEnclosingScope;
  275.     int                                fDefinedScope;
  276.     int                                fFinalSet;
  277.     int                                fBlockSet;
  278.     int                                fMiscFlags;
  279.     XMLCh*                             fDefaultValue;
  280.     XMLCh*                             fSubstitutionGroupName;
  281.     XMLCh*                             fTypeFromAnotherSchemaURI;
  282.     ComplexTypeInfo*                   fComplexTypeInfo;
  283.     RefHash2KeysTableOf<SchemaAttDef>* fAttDefs;
  284.     ComplexTypeInfo*                   fXsiComplexTypeInfo;
  285.     RefVectorOf<IdentityConstraint>*   fIdentityConstraints;
  286. };
  287. // ---------------------------------------------------------------------------
  288. //  SchemaElementDecl: XMLElementDecl virtual interface implementation
  289. // ---------------------------------------------------------------------------
  290. inline ContentSpecNode* SchemaElementDecl::getContentSpec()
  291. {
  292.     if (fXsiComplexTypeInfo != 0) {
  293.         return fXsiComplexTypeInfo->getContentSpec();
  294.     }
  295.     else if (fComplexTypeInfo != 0) {
  296.         return fComplexTypeInfo->getContentSpec();
  297.     }
  298.     return 0;
  299. }
  300. inline const ContentSpecNode* SchemaElementDecl::getContentSpec() const
  301. {
  302.     if (fXsiComplexTypeInfo != 0) {
  303.         return fXsiComplexTypeInfo->getContentSpec();
  304.     }
  305.     else if (fComplexTypeInfo != 0) {
  306.         return fComplexTypeInfo->getContentSpec();
  307.     }
  308.     return 0;
  309. }
  310. inline void
  311. SchemaElementDecl::setContentSpec(ContentSpecNode* toAdopt)
  312. {
  313.     //Handled by complexType
  314. }
  315. inline XMLContentModel* SchemaElementDecl::getContentModel()
  316. {
  317.     if (fXsiComplexTypeInfo != 0) {
  318.         return fXsiComplexTypeInfo->getContentModel();
  319.     }
  320.     else if (fComplexTypeInfo != 0) {
  321.         return fComplexTypeInfo->getContentModel();
  322.     }
  323.     return 0;
  324. }
  325. inline void
  326. SchemaElementDecl::setContentModel(XMLContentModel* const newModelToAdopt)
  327. {
  328.     //Handled by complexType
  329. }
  330. // ---------------------------------------------------------------------------
  331. //  SchemaElementDecl: Getter methods
  332. // ---------------------------------------------------------------------------
  333. inline SchemaElementDecl::ModelTypes SchemaElementDecl::getModelType() const
  334. {
  335.     if (fXsiComplexTypeInfo) {
  336.         return (SchemaElementDecl::ModelTypes) fXsiComplexTypeInfo->getContentType();
  337.     }
  338.     else if (fComplexTypeInfo) {
  339.         return (SchemaElementDecl::ModelTypes) fComplexTypeInfo->getContentType();
  340.     }
  341.     return fModelType;
  342. }
  343. inline DatatypeValidator* SchemaElementDecl::getDatatypeValidator() const
  344. {
  345.     return fDatatypeValidator;
  346. }
  347. inline int SchemaElementDecl::getEnclosingScope() const
  348. {
  349.     return fEnclosingScope;
  350. }
  351. inline int SchemaElementDecl::getDefinedScope() const
  352. {
  353.     return fDefinedScope;
  354. }
  355. inline int SchemaElementDecl::getFinalSet() const
  356. {
  357.     return fFinalSet;
  358. }
  359. inline int SchemaElementDecl::getBlockSet() const
  360. {
  361.     return fBlockSet;
  362. }
  363. inline int SchemaElementDecl::getMiscFlags() const
  364. {
  365.     return fMiscFlags;
  366. }
  367. inline XMLCh* SchemaElementDecl::getDefaultValue() const
  368. {
  369.     return fDefaultValue;
  370. }
  371. inline XMLCh* SchemaElementDecl::getSubstitutionGroupName() const
  372. {
  373.     return fSubstitutionGroupName;
  374. }
  375. inline XMLCh* SchemaElementDecl::getTypeFromAnotherSchemaURI() const {
  376.     return fTypeFromAnotherSchemaURI;
  377. }
  378. inline ComplexTypeInfo* SchemaElementDecl::getComplexTypeInfo() const
  379. {
  380.     if (fXsiComplexTypeInfo) {
  381.         return fXsiComplexTypeInfo;
  382.     }
  383.     return fComplexTypeInfo;
  384. }
  385. inline const SchemaAttDef* SchemaElementDecl::getAttWildCard() const {
  386.     if (fXsiComplexTypeInfo) {
  387.         return fXsiComplexTypeInfo->getAttWildCard();
  388.     }
  389.     else if (fComplexTypeInfo) {
  390.         return fComplexTypeInfo->getAttWildCard();
  391.     }
  392.     return 0;
  393. }
  394. inline SchemaAttDef* SchemaElementDecl::getAttWildCard() {
  395.     if (fXsiComplexTypeInfo) {
  396.         return fXsiComplexTypeInfo->getAttWildCard();
  397.     }
  398.     else if (fComplexTypeInfo) {
  399.         return fComplexTypeInfo->getAttWildCard();
  400.     }
  401.     return 0;
  402. }
  403. // ---------------------------------------------------------------------------
  404. //  SchemaElementDecl: Setter methods
  405. // ---------------------------------------------------------------------------
  406. inline void
  407. SchemaElementDecl::setModelType(const SchemaElementDecl::ModelTypes toSet)
  408. {
  409.     fModelType = toSet;
  410. }
  411. inline void SchemaElementDecl::setDatatypeValidator(DatatypeValidator* newDatatypeValidator)
  412. {
  413.     fDatatypeValidator = newDatatypeValidator;
  414. }
  415. inline void SchemaElementDecl::setEnclosingScope(const int newEnclosingScope)
  416. {
  417.     fEnclosingScope = newEnclosingScope;
  418. }
  419. inline void SchemaElementDecl::setDefinedScope(const int newDefinedScope)
  420. {
  421.     fDefinedScope = newDefinedScope;
  422. }
  423. inline void SchemaElementDecl::setFinalSet(const int finalSet)
  424. {
  425.     fFinalSet = finalSet;
  426. }
  427. inline void SchemaElementDecl::setBlockSet(const int blockSet)
  428. {
  429.     fBlockSet = blockSet;
  430. }
  431. inline void SchemaElementDecl::setMiscFlags(const int flags)
  432. {
  433.     fMiscFlags = flags;
  434. }
  435. inline void SchemaElementDecl::setDefaultValue(const XMLCh* const value)
  436. {
  437.     if (fDefaultValue) {
  438.         delete[] fDefaultValue;
  439.     }
  440.     fDefaultValue = XMLString::replicate(value);
  441. }
  442. inline void SchemaElementDecl::setSubstitutionGroupName(const XMLCh* const name)
  443. {
  444.     if (fSubstitutionGroupName) {
  445.         delete [] fSubstitutionGroupName;
  446.     }
  447.     fSubstitutionGroupName = XMLString::replicate(name);
  448. }
  449. inline void
  450. SchemaElementDecl::setTypeFromAnotherSchemaURI(const XMLCh* const uriStr) {
  451.     if (fTypeFromAnotherSchemaURI) {
  452.         delete [] fTypeFromAnotherSchemaURI;
  453.     }
  454.     fTypeFromAnotherSchemaURI = XMLString::replicate(uriStr);
  455. }
  456. inline void
  457. SchemaElementDecl::setComplexTypeInfo(ComplexTypeInfo* const typeInfo)
  458. {
  459.     fComplexTypeInfo = typeInfo;
  460. }
  461. inline void
  462. SchemaElementDecl::setXsiComplexTypeInfo(ComplexTypeInfo* const typeInfo)
  463. {
  464.     fXsiComplexTypeInfo = typeInfo;
  465. }
  466. // ---------------------------------------------------------------------------
  467. //  SchemaElementDecl: IC methods
  468. // ---------------------------------------------------------------------------
  469. inline void
  470. SchemaElementDecl::addIdentityConstraint(IdentityConstraint* const ic) {
  471.     if (!fIdentityConstraints) {
  472.         fIdentityConstraints = new RefVectorOf<IdentityConstraint>(16);
  473.     }
  474.     fIdentityConstraints->addElement(ic);
  475. }
  476. inline unsigned int SchemaElementDecl::getIdentityConstraintCount() const {
  477.     if (fIdentityConstraints) {
  478.         return fIdentityConstraints->size();
  479.     }
  480.     return 0;
  481. }
  482. inline IdentityConstraint*
  483. SchemaElementDecl::getIdentityConstraintAt(unsigned int index) const {
  484.     if (fIdentityConstraints) {
  485.         return fIdentityConstraints->elementAt(index);
  486.     }
  487.     return 0;
  488. }
  489. #endif