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

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: SchemaGrammar.hpp,v $
  58.  * Revision 1.14  2001/11/19 18:26:31  knoaman
  59.  * no message
  60.  *
  61.  * Revision 1.13  2001/10/09 12:18:26  tng
  62.  * Leak fix: should use delete [] to delete fTargetNamespace.
  63.  *
  64.  * Revision 1.12  2001/10/04 15:11:51  knoaman
  65.  * Add support for circular import.
  66.  *
  67.  * Revision 1.10  2001/09/14 14:50:22  tng
  68.  * Schema: Fix some wildcard bugs, and some retrieving qualified/unqualified element decl problems.
  69.  *
  70.  * Revision 1.9  2001/08/21 16:06:11  tng
  71.  * Schema: Unique Particle Attribution Constraint Checking.
  72.  *
  73.  * Revision 1.8  2001/07/31 15:27:10  knoaman
  74.  * Added support for <attributeGroup>.
  75.  *
  76.  * Revision 1.7  2001/07/24 18:33:46  knoaman
  77.  * Added support for <group> + extra constraint checking for complexType
  78.  *
  79.  * Revision 1.6  2001/06/25 12:51:57  knoaman
  80.  * Add constraint checking on elements in complex types to prevent same
  81.  * element names from having different definitions - use substitueGroups.
  82.  *
  83.  * Revision 1.5  2001/05/28 20:56:19  tng
  84.  * Schema: Move getTargetNamespace as virtual function in base class Grammar
  85.  *
  86.  * Revision 1.4  2001/05/11 13:27:36  tng
  87.  * Copyright update.
  88.  *
  89.  * Revision 1.3  2001/05/03 20:34:43  tng
  90.  * Schema: SchemaValidator update
  91.  *
  92.  * Revision 1.2  2001/04/19 17:43:19  knoaman
  93.  * More schema implementation classes.
  94.  *
  95.  * Revision 1.1  2001/03/21 21:56:33  tng
  96.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  97.  *
  98.  */
  99. #if !defined(SCHEMAGRAMMAR_HPP)
  100. #define SCHEMAGRAMMAR_HPP
  101. #include <framework/XMLNotationDecl.hpp>
  102. #include <util/RefHash3KeysIdPool.hpp>
  103. #include <util/NameIdPool.hpp>
  104. #include <util/StringPool.hpp>
  105. #include <validators/common/Grammar.hpp>
  106. #include <validators/schema/SchemaElementDecl.hpp>
  107. #include <util/ValueVectorOf.hpp>
  108. #include <validators/datatype/IDDatatypeValidator.hpp>
  109. //
  110. // This class stores the Schema information
  111. //  NOTE: Schemas are not namespace aware, so we just use regular NameIdPool
  112. //  data structures to store element and attribute decls. They are all set
  113. //  to be in the global namespace and the full QName is used as the base name
  114. //  of the decl. This means that all the URI parameters below are expected
  115. //  to be null pointers (and anything else will cause an exception.)
  116. //
  117. // ---------------------------------------------------------------------------
  118. //  Forward Declarations
  119. // ---------------------------------------------------------------------------
  120. class DatatypeValidatorFactory;
  121. class ComplexTypeInfo;
  122. class NamespaceScope;
  123. class XercesGroupInfo;
  124. class XercesAttGroupInfo;
  125. // ---------------------------------------------------------------------------
  126. //  typedef declaration
  127. // ---------------------------------------------------------------------------
  128. typedef ValueVectorOf<SchemaElementDecl*> ElemVector;
  129. class VALIDATORS_EXPORT SchemaGrammar : public Grammar
  130. {
  131. public:
  132.     // -----------------------------------------------------------------------
  133.     //  Constructors and Destructor
  134.     // -----------------------------------------------------------------------
  135.     SchemaGrammar();
  136.     virtual ~SchemaGrammar();
  137.     // -----------------------------------------------------------------------
  138.     //  Implementation of Virtual Interface
  139.     // -----------------------------------------------------------------------
  140.     virtual Grammar::GrammarType getGrammarType();
  141.     virtual const XMLCh* getTargetNamespace() const;
  142.     virtual XMLElementDecl* findOrAddElemDecl
  143.     (
  144.         const   unsigned int    uriId
  145.         , const XMLCh* const    baseName
  146.         , const XMLCh* const    prefixName
  147.         , const XMLCh* const    qName
  148.         , unsigned int          scope
  149.         ,       bool&           wasAdded
  150.     ) ;
  151.     virtual unsigned int getElemId
  152.     (
  153.         const   unsigned int    uriId
  154.         , const XMLCh* const    baseName
  155.         , const XMLCh* const    qName
  156.         , unsigned int          scope
  157.     )   const ;
  158.     virtual const XMLElementDecl* getElemDecl
  159.     (
  160.         const   unsigned int    uriId
  161.         , const XMLCh* const    baseName
  162.         , const XMLCh* const    qName
  163.         , unsigned int          scope
  164.     )   const ;
  165.     virtual XMLElementDecl* getElemDecl
  166.     (
  167.         const   unsigned int    uriId
  168.         , const XMLCh* const    baseName
  169.         , const XMLCh* const    qName
  170.         , unsigned int          scope
  171.     );
  172.     virtual const XMLElementDecl* getElemDecl
  173.     (
  174.         const   unsigned int    elemId
  175.     )   const;
  176.     virtual XMLElementDecl* getElemDecl
  177.     (
  178.         const   unsigned int    elemId
  179.     );
  180.     virtual const XMLNotationDecl* getNotationDecl
  181.     (
  182.         const   XMLCh* const    notName
  183.     )   const;
  184.     virtual XMLNotationDecl* getNotationDecl
  185.     (
  186.         const   XMLCh* const    notName
  187.     );
  188.     virtual XMLElementDecl* putElemDecl
  189.     (
  190.         const   unsigned int    uriId
  191.         , const XMLCh* const    baseName
  192.         , const XMLCh* const    prefixName
  193.         , const XMLCh* const    qName
  194.         , unsigned int          scope
  195.     );
  196.     virtual unsigned int putElemDecl
  197.     (
  198.         XMLElementDecl* const elemDecl
  199.     )   const;
  200.     virtual unsigned int putNotationDecl
  201.     (
  202.         XMLNotationDecl* const notationDecl
  203.     )   const;
  204.     virtual void reset();
  205.     // -----------------------------------------------------------------------
  206.     //  Getter methods
  207.     // -----------------------------------------------------------------------
  208.     RefHash3KeysIdPoolEnumerator<SchemaElementDecl> getElemEnumerator() const;
  209.     RefHashTableOf<XMLAttDef>* getAttributeDeclRegistry() const;
  210.     RefHashTableOf<ComplexTypeInfo>* getComplexTypeRegistry() const;
  211.     RefHashTableOf<XercesGroupInfo>* getGroupInfoRegistry() const;
  212.     RefHashTableOf<XercesAttGroupInfo>* getAttGroupInfoRegistry() const;
  213.     DatatypeValidatorFactory* getDatatypeRegistry() const;
  214.     NamespaceScope* getNamespaceScope() const;
  215.     RefHash2KeysTableOf<ElemVector>* getValidSubstitutionGroups() const;
  216.     RefHashTableOf<XMLRefInfo>* getIDRefList() const;
  217.     bool getUPAChecked() const;
  218.     // -----------------------------------------------------------------------
  219.     //  Setter methods
  220.     // -----------------------------------------------------------------------
  221.     void setTargetNamespace(const XMLCh* const targetNamespace);
  222.     void setAttributeDeclRegistry(RefHashTableOf<XMLAttDef>* const attReg);
  223.     void setComplexTypeRegistry(RefHashTableOf<ComplexTypeInfo>* const other);
  224.     void setGroupInfoRegistry(RefHashTableOf<XercesGroupInfo>* const other);
  225.     void setAttGroupInfoRegistry(RefHashTableOf<XercesAttGroupInfo>* const other);
  226.     void setDatatypeRegistry(DatatypeValidatorFactory* const dvRegistry);
  227.     void setNamespaceScope(NamespaceScope* const nsScope);
  228.     void setValidSubstitutionGroups(RefHash2KeysTableOf<ElemVector>* const);
  229.     void setUPAChecked(bool newState);
  230.     // -----------------------------------------------------------------------
  231.     //  Helper methods
  232.     // -----------------------------------------------------------------------
  233.     unsigned int putGroupElemDecl
  234.     (
  235.         XMLElementDecl* const elemDecl
  236.     )   const;
  237. private:
  238.     // -----------------------------------------------------------------------
  239.     //  Private data members
  240.     //
  241.     //  fElemDeclPool
  242.     //      This is the element decl pool. It contains all of the elements
  243.     //      declared in the Schema (and their associated attributes.) When in
  244.     //      non-validating mode, its just populated as new elements are seen
  245.     //      and they are given default characteristics.
  246.     //
  247.     //  fGroupElemDeclPool
  248.     //      This is the element decl pool for elements in a group that are
  249.     //      referenced in different scope. It contains all of the elements
  250.     //      declared in the Schema (and their associated attributes.)
  251.     //
  252.     //  fNotationDeclPool
  253.     //      This is a pool of NotationDecl objects, which contains all of the
  254.     //      notations declared in the Schema.
  255.     //
  256.     //  fTargetNamespace
  257.     //      Target name space for this grammar.
  258.     //
  259.     //  fAttributeDeclRegistry
  260.     //      Global attribute declarations
  261.     //
  262.     //  fComplexTypeRegistry
  263.     //      Stores complexType declaration info
  264.     //
  265.     //  fGroupInfoRegistry
  266.     //      Stores global <group> declaration info
  267.     //
  268.     //  fAttGroupInfoRegistry
  269.     //      Stores global <attributeGroup> declaration info
  270.     //
  271.     //  fDatatypeRegistry
  272.     //      Datatype validator factory
  273.     //
  274.     //  fNamespaceScope
  275.     //      Prefix to Namespace map
  276.     //
  277.     //  fValidSubstitutionGroups
  278.     //      Valid list of elements that can substitute a given element
  279.     //
  280.     //  fIDRefList
  281.     //      List of ids of schema declarations extracted during schema grammar
  282.     //      traversal
  283.     //
  284.     //  fUPAChecked
  285.     //      Indicates if this Grammar has already been validated for
  286.     //      schema unique particle attribute constraint checking.
  287.     // -----------------------------------------------------------------------
  288.     XMLCh*                                 fTargetNamespace;
  289.     RefHash3KeysIdPool<SchemaElementDecl>* fElemDeclPool;
  290.     RefHash3KeysIdPool<SchemaElementDecl>* fGroupElemDeclPool;
  291.     NameIdPool<XMLNotationDecl>*           fNotationDeclPool;
  292.     RefHashTableOf<XMLAttDef>*             fAttributeDeclRegistry;
  293.     RefHashTableOf<ComplexTypeInfo>*       fComplexTypeRegistry;
  294.     RefHashTableOf<XercesGroupInfo>*       fGroupInfoRegistry;
  295.     RefHashTableOf<XercesAttGroupInfo>*    fAttGroupInfoRegistry;
  296.     DatatypeValidatorFactory*              fDatatypeRegistry;
  297.     NamespaceScope*                        fNamespaceScope;
  298.     RefHash2KeysTableOf<ElemVector>*       fValidSubstitutionGroups;
  299.     RefHashTableOf<XMLRefInfo>*            fIDRefList;
  300.     bool                                   fUPAChecked;
  301. };
  302. // ---------------------------------------------------------------------------
  303. //  SchemaGrammar: Getter methods
  304. // ---------------------------------------------------------------------------
  305. inline RefHash3KeysIdPoolEnumerator<SchemaElementDecl>
  306. SchemaGrammar::getElemEnumerator() const
  307. {
  308.     return RefHash3KeysIdPoolEnumerator<SchemaElementDecl>(fElemDeclPool);
  309. }
  310. inline RefHashTableOf<XMLAttDef>* SchemaGrammar::getAttributeDeclRegistry() const {
  311.     return fAttributeDeclRegistry;
  312. }
  313. inline RefHashTableOf<ComplexTypeInfo>*
  314. SchemaGrammar::getComplexTypeRegistry() const {
  315.     return fComplexTypeRegistry;
  316. }
  317. inline RefHashTableOf<XercesGroupInfo>*
  318. SchemaGrammar::getGroupInfoRegistry() const {
  319.     return fGroupInfoRegistry;
  320. }
  321. inline RefHashTableOf<XercesAttGroupInfo>*
  322. SchemaGrammar::getAttGroupInfoRegistry() const {
  323.     return fAttGroupInfoRegistry;
  324. }
  325. inline DatatypeValidatorFactory* SchemaGrammar::getDatatypeRegistry() const {
  326.     return fDatatypeRegistry;
  327. }
  328. inline NamespaceScope* SchemaGrammar::getNamespaceScope() const {
  329.     return fNamespaceScope;
  330. }
  331. inline RefHash2KeysTableOf<ElemVector>*
  332. SchemaGrammar::getValidSubstitutionGroups() const {
  333.     return fValidSubstitutionGroups;
  334. }
  335. inline bool SchemaGrammar::getUPAChecked() const {
  336.     return fUPAChecked;
  337. }
  338. inline RefHashTableOf<XMLRefInfo>* SchemaGrammar::getIDRefList() const {
  339.     return fIDRefList;
  340. }
  341. // -----------------------------------------------------------------------
  342. //  Setter methods
  343. // -----------------------------------------------------------------------
  344. inline void SchemaGrammar::setTargetNamespace(const XMLCh* const targetNamespace) {
  345.     delete [] fTargetNamespace;
  346.     fTargetNamespace = XMLString::replicate(targetNamespace);
  347. }
  348. inline void
  349. SchemaGrammar::setAttributeDeclRegistry(RefHashTableOf<XMLAttDef>* const attReg) {
  350.     fAttributeDeclRegistry = attReg;
  351. }
  352. inline void
  353. SchemaGrammar::setComplexTypeRegistry(RefHashTableOf<ComplexTypeInfo>* const other) {
  354.     fComplexTypeRegistry = other;
  355. }
  356. inline void
  357. SchemaGrammar::setGroupInfoRegistry(RefHashTableOf<XercesGroupInfo>* const other) {
  358.     fGroupInfoRegistry = other;
  359. }
  360. inline void
  361. SchemaGrammar::setAttGroupInfoRegistry(RefHashTableOf<XercesAttGroupInfo>* const other) {
  362.     fAttGroupInfoRegistry = other;
  363. }
  364. inline void
  365. SchemaGrammar::setDatatypeRegistry(DatatypeValidatorFactory* const dvRegistry) {
  366.     fDatatypeRegistry = dvRegistry;
  367. }
  368. inline void SchemaGrammar::setNamespaceScope(NamespaceScope* const nsScope) {
  369.     fNamespaceScope = nsScope;
  370. }
  371. inline void
  372. SchemaGrammar::setValidSubstitutionGroups(RefHash2KeysTableOf<ElemVector>* const other) {
  373.     fValidSubstitutionGroups = other;
  374. }
  375. inline void SchemaGrammar::setUPAChecked(bool newState) {
  376.     fUPAChecked = newState;
  377. }
  378. // ---------------------------------------------------------------------------
  379. //  SchemaGrammar: Virtual methods
  380. // ---------------------------------------------------------------------------
  381. inline Grammar::GrammarType SchemaGrammar::getGrammarType() {
  382.     return Grammar::SchemaGrammarType;
  383. }
  384. inline const XMLCh* SchemaGrammar::getTargetNamespace() const {
  385.     return fTargetNamespace;
  386. }
  387. // Element Decl
  388. inline unsigned int SchemaGrammar::getElemId (const   unsigned int  uriId
  389.                                               , const XMLCh* const    baseName
  390.                                               , const XMLCh* const    qName
  391.                                               , unsigned int          scope ) const
  392. {
  393.     //
  394.     //  In this case, we don't return zero to mean 'not found', so we have to
  395.     //  map it to the official not found value if we don't find it.
  396.     //
  397.     const SchemaElementDecl* decl = fElemDeclPool->getByKey(baseName, uriId, scope);
  398.     if (!decl) {
  399.         decl = fGroupElemDeclPool->getByKey(baseName, uriId, scope);
  400.         if (!decl)
  401.             return XMLElementDecl::fgInvalidElemId;
  402.     }
  403.     return decl->getId();
  404. }
  405. inline const XMLElementDecl* SchemaGrammar::getElemDecl( const   unsigned int  uriId
  406.                                               , const XMLCh* const    baseName
  407.                                               , const XMLCh* const    qName
  408.                                               , unsigned int          scope )   const
  409. {
  410.     const SchemaElementDecl* decl = fElemDeclPool->getByKey(baseName, uriId, scope);
  411.     if (!decl)
  412.         decl = fGroupElemDeclPool->getByKey(baseName, uriId, scope);
  413.     return decl;
  414. }
  415. inline XMLElementDecl* SchemaGrammar::getElemDecl (const   unsigned int  uriId
  416.                                               , const XMLCh* const    baseName
  417.                                               , const XMLCh* const    qName
  418.                                               , unsigned int          scope )
  419. {
  420.     SchemaElementDecl* decl = fElemDeclPool->getByKey(baseName, uriId, scope);
  421.     if (!decl)
  422.         decl = fGroupElemDeclPool->getByKey(baseName, uriId, scope);
  423.     return decl;
  424. }
  425. inline const XMLElementDecl* SchemaGrammar::getElemDecl(const unsigned int elemId) const
  426. {
  427.     // Look up this element decl by id
  428.     const SchemaElementDecl* decl = fElemDeclPool->getById(elemId);
  429.     if (!decl)
  430.         decl = fGroupElemDeclPool->getById(elemId);
  431.     return decl;
  432. }
  433. inline XMLElementDecl* SchemaGrammar::getElemDecl(const unsigned int elemId)
  434. {
  435.     // Look up this element decl by id
  436.     SchemaElementDecl* decl = fElemDeclPool->getById(elemId);
  437.     if (!decl)
  438.         decl = fGroupElemDeclPool->getById(elemId);
  439.     return decl;
  440. }
  441. inline unsigned int SchemaGrammar::putElemDecl (XMLElementDecl* const elemDecl)   const
  442. {
  443.     return fElemDeclPool->put(elemDecl->getBaseName(), elemDecl->getURI(), ((SchemaElementDecl* )elemDecl)->getEnclosingScope(), (SchemaElementDecl*) elemDecl);
  444. }
  445. inline unsigned int SchemaGrammar::putGroupElemDecl (XMLElementDecl* const elemDecl)   const
  446. {
  447.     return fGroupElemDeclPool->put(elemDecl->getBaseName(), elemDecl->getURI(), ((SchemaElementDecl* )elemDecl)->getEnclosingScope(), (SchemaElementDecl*) elemDecl);
  448. }
  449. // Notation Decl
  450. inline const XMLNotationDecl* SchemaGrammar::getNotationDecl(const XMLCh* const notName) const
  451. {
  452.     return fNotationDeclPool->getByKey(notName);
  453. }
  454. inline XMLNotationDecl* SchemaGrammar::getNotationDecl(const XMLCh* const notName)
  455. {
  456.     return fNotationDeclPool->getByKey(notName);
  457. }
  458. inline unsigned int SchemaGrammar::putNotationDecl(XMLNotationDecl* const notationDecl)   const
  459. {
  460.     return fNotationDeclPool->put(notationDecl);
  461. }
  462. #endif