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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-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) 1999, 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: DTDGrammar.hpp,v $
  58.  * Revision 1.7  2003/05/16 21:43:19  knoaman
  59.  * Memory manager implementation: Modify constructors to pass in the memory manager.
  60.  *
  61.  * Revision 1.6  2003/05/15 18:54:50  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.5  2002/11/04 14:50:40  tng
  65.  * C++ Namespace Support.
  66.  *
  67.  * Revision 1.4  2002/08/22 15:05:39  tng
  68.  * Remove unused parameter variables in inline functions.
  69.  *
  70.  * Revision 1.3  2002/07/11 18:19:28  knoaman
  71.  * Grammar caching/preparsing - initial implementation.
  72.  *
  73.  * Revision 1.2  2002/07/05 17:08:10  tng
  74.  * [Bug 10119] Grammar::getGrammarType need a const modifier
  75.  *
  76.  * Revision 1.1.1.1  2002/02/01 22:22:43  peiyongz
  77.  * sane_include
  78.  *
  79.  * Revision 1.5  2001/09/14 14:50:22  tng
  80.  * Schema: Fix some wildcard bugs, and some retrieving qualified/unqualified element decl problems.
  81.  *
  82.  * Revision 1.4  2001/05/28 20:56:17  tng
  83.  * Schema: Move getTargetNamespace as virtual function in base class Grammar
  84.  *
  85.  * Revision 1.3  2001/05/11 13:27:09  tng
  86.  * Copyright update.
  87.  *
  88.  * Revision 1.2  2001/04/19 18:17:21  tng
  89.  * Schema: SchemaValidator update, and use QName in Content Model
  90.  *
  91.  * Revision 1.1  2001/03/21 21:56:20  tng
  92.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  93.  *
  94.  */
  95. #if !defined(DTDGRAMMAR_HPP)
  96. #define DTDGRAMMAR_HPP
  97. #include <xercesc/util/RefHashTableOf.hpp>
  98. #include <xercesc/util/NameIdPool.hpp>
  99. #include <xercesc/util/StringPool.hpp>
  100. #include <xercesc/validators/common/Grammar.hpp>
  101. #include <xercesc/validators/DTD/DTDElementDecl.hpp>
  102. #include <xercesc/validators/DTD/DTDEntityDecl.hpp>
  103. XERCES_CPP_NAMESPACE_BEGIN
  104. //
  105. // This class stores the DTD information
  106. //  NOTE: DTDs are not namespace aware, so we just use regular NameIdPool
  107. //  data structures to store element and attribute decls. They are all set
  108. //  to be in the global namespace and the full QName is used as the base name
  109. //  of the decl. This means that all the URI parameters below are expected
  110. //  to be null pointers (and anything else will cause an exception.)
  111. //
  112. class VALIDATORS_EXPORT DTDGrammar : public Grammar
  113. {
  114. public:
  115.     // -----------------------------------------------------------------------
  116.     //  Constructors and Destructor
  117.     // -----------------------------------------------------------------------
  118.     DTDGrammar(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  119.     virtual ~DTDGrammar();
  120.     // -----------------------------------------------------------------------
  121.     //  Implementation of Virtual Interface
  122.     // -----------------------------------------------------------------------
  123.     virtual Grammar::GrammarType getGrammarType() const;
  124.     virtual const XMLCh* getTargetNamespace() const;
  125.     virtual XMLElementDecl* findOrAddElemDecl
  126.     (
  127.         const   unsigned int    uriId
  128.         , const XMLCh* const    baseName
  129.         , const XMLCh* const    prefixName
  130.         , const XMLCh* const    qName
  131.         , unsigned int          scope
  132.         ,       bool&           wasAdded
  133.     ) ;
  134.     virtual unsigned int getElemId
  135.     (
  136.         const   unsigned int    uriId
  137.         , const XMLCh* const    baseName
  138.         , const XMLCh* const    qName
  139.         , unsigned int          scope
  140.     )   const ;
  141.     virtual const XMLElementDecl* getElemDecl
  142.     (
  143.         const   unsigned int    uriId
  144.         , const XMLCh* const    baseName
  145.         , const XMLCh* const    qName
  146.         , unsigned int          scope
  147.     )   const ;
  148.     virtual XMLElementDecl* getElemDecl
  149.     (
  150.         const   unsigned int    uriId
  151.         , const XMLCh* const    baseName
  152.         , const XMLCh* const    qName
  153.         , unsigned int          scope
  154.     );
  155.     virtual const XMLElementDecl* getElemDecl
  156.     (
  157.         const   unsigned int    elemId
  158.     )   const;
  159.     virtual XMLElementDecl* getElemDecl
  160.     (
  161.         const   unsigned int    elemId
  162.     );
  163.     virtual const XMLNotationDecl* getNotationDecl
  164.     (
  165.         const   XMLCh* const    notName
  166.     )   const;
  167.     virtual XMLNotationDecl* getNotationDecl
  168.     (
  169.         const   XMLCh* const    notName
  170.     );
  171.     virtual bool getValidated() const;
  172.     virtual XMLElementDecl* putElemDecl
  173.     (
  174.         const   unsigned int    uriId
  175.         , const XMLCh* const    baseName
  176.         , const XMLCh* const    prefixName
  177.         , const XMLCh* const    qName
  178.         , unsigned int          scope
  179.         , const bool            notDeclared = false
  180.     );
  181.     virtual unsigned int putElemDecl
  182.     (
  183.         XMLElementDecl* const elemDecl
  184.         , const bool          notDeclared = false
  185.     )   const;
  186.     virtual unsigned int putNotationDecl
  187.     (
  188.         XMLNotationDecl* const notationDecl
  189.     )   const;
  190.     virtual void setValidated(const bool newState);
  191.     virtual void reset();
  192.     // -----------------------------------------------------------------------
  193.     //  Getter methods
  194.     // -----------------------------------------------------------------------
  195.     unsigned int getRootElemId();
  196.     const DTDEntityDecl* getEntityDecl(const XMLCh* const entName) const;
  197.     DTDEntityDecl* getEntityDecl(const XMLCh* const entName);
  198.     NameIdPool<DTDEntityDecl>* getEntityDeclPool();
  199.     const NameIdPool<DTDEntityDecl>* getEntityDeclPool() const;
  200.     NameIdPoolEnumerator<DTDElementDecl> getElemEnumerator() const;
  201.     NameIdPoolEnumerator<DTDEntityDecl> getEntityEnumerator() const;
  202.     NameIdPoolEnumerator<XMLNotationDecl> getNotationEnumerator() const;
  203.     // -----------------------------------------------------------------------
  204.     //  Setter methods
  205.     // -----------------------------------------------------------------------
  206.     void setRootElemId(unsigned int rootElemId);
  207.     // -----------------------------------------------------------------------
  208.     //  Content management methods
  209.     // -----------------------------------------------------------------------
  210.     unsigned int putEntityDecl(DTDEntityDecl* const entityDecl) const;
  211. private:
  212.     // -----------------------------------------------------------------------
  213.     //  Private helper methods
  214.     // -----------------------------------------------------------------------
  215.     void resetEntityDeclPool();
  216.     // -----------------------------------------------------------------------
  217.     //  Private data members
  218.     //
  219.     //  fElemDeclPool
  220.     //      This is the element decl pool. It contains all of the elements
  221.     //      declared in the DTD (and their associated attributes.)
  222.     //
  223.     //  fElemNonDeclPool
  224.     //      This is the element decl pool that is is populated as new elements
  225.     //      are seen in the XML document (not declared in the DTD), and they
  226.     //      are given default characteristics.
  227.     //
  228.     //  fEntityDeclPool
  229.     //      This is a pool of EntityDecl objects, which contains all of the
  230.     //      general entities that are declared in the DTD subsets, plus the
  231.     //      default entities (such as &gt; &lt; ...) defined by the XML Standard.
  232.     //
  233.     //  fNotationDeclPool
  234.     //      This is a pool of NotationDecl objects, which contains all of the
  235.     //      notations declared in the DTD subsets.
  236.     //
  237.     //  fRootElemId
  238.     //      The id of the root element that we found in the DOCTYPE statement.
  239.     //      Its initialized to ContentModel::fgInvalidElemId, so that its
  240.     //      invalid unless we have a DOCTYPE.
  241.     //
  242.     //  fValidated
  243.     //      Indicates if the content of the Grammar has been pre-validated
  244.     //      or not. When using a cached grammar, no need for pre content
  245.     //      validation.
  246.     // -----------------------------------------------------------------------
  247.     MemoryManager*               fMemoryManager;
  248.     NameIdPool<DTDElementDecl>*  fElemDeclPool;
  249.     NameIdPool<DTDElementDecl>*  fElemNonDeclPool;
  250.     NameIdPool<DTDEntityDecl>*   fEntityDeclPool;
  251.     NameIdPool<XMLNotationDecl>* fNotationDeclPool;
  252.     unsigned int                 fRootElemId;
  253.     bool                         fValidated;
  254. };
  255. // ---------------------------------------------------------------------------
  256. //  DTDGrammar: Getter methods
  257. // ---------------------------------------------------------------------------
  258. inline unsigned int DTDGrammar::getRootElemId()
  259. {
  260.     return fRootElemId;
  261. }
  262. // ---------------------------------------------------------------------------
  263. //  DTDGrammar: Getter methods
  264. // ---------------------------------------------------------------------------
  265. inline NameIdPoolEnumerator<DTDElementDecl>
  266. DTDGrammar::getElemEnumerator() const
  267. {
  268.     return NameIdPoolEnumerator<DTDElementDecl>(fElemDeclPool);
  269. }
  270. inline NameIdPoolEnumerator<DTDEntityDecl>
  271. DTDGrammar::getEntityEnumerator() const
  272. {
  273.     return NameIdPoolEnumerator<DTDEntityDecl>(fEntityDeclPool);
  274. }
  275. inline NameIdPoolEnumerator<XMLNotationDecl>
  276. DTDGrammar::getNotationEnumerator() const
  277. {
  278.     return NameIdPoolEnumerator<XMLNotationDecl>(fNotationDeclPool);
  279. }
  280. inline const DTDEntityDecl*
  281. DTDGrammar::getEntityDecl(const XMLCh* const entName) const
  282. {
  283.     return fEntityDeclPool->getByKey(entName);
  284. }
  285. inline DTDEntityDecl* DTDGrammar::getEntityDecl(const XMLCh* const entName)
  286. {
  287.     return fEntityDeclPool->getByKey(entName);
  288. }
  289. inline NameIdPool<DTDEntityDecl>* DTDGrammar::getEntityDeclPool()
  290. {
  291.     return fEntityDeclPool;
  292. }
  293. inline const NameIdPool<DTDEntityDecl>* DTDGrammar::getEntityDeclPool() const
  294. {
  295.     return fEntityDeclPool;
  296. }
  297. // -----------------------------------------------------------------------
  298. //  Setter methods
  299. // -----------------------------------------------------------------------
  300. inline void DTDGrammar::setRootElemId(unsigned int rootElemId) {
  301.     fRootElemId = rootElemId;
  302. }
  303. inline unsigned int DTDGrammar::putEntityDecl(DTDEntityDecl* const entityDecl)   const
  304. {
  305.     return fEntityDeclPool->put(entityDecl);
  306. }
  307. // ---------------------------------------------------------------------------
  308. //  DTDGrammar: Virtual methods
  309. // ---------------------------------------------------------------------------
  310. inline Grammar::GrammarType DTDGrammar::getGrammarType() const {
  311.     return Grammar::DTDGrammarType;
  312. }
  313. inline const XMLCh* DTDGrammar::getTargetNamespace() const {
  314.     return XMLUni::fgZeroLenString;
  315. }
  316. // Element Decl
  317. inline unsigned int DTDGrammar::getElemId (const   unsigned int
  318.                                               , const XMLCh* const
  319.                                               , const XMLCh* const    qName
  320.                                               , unsigned int) const
  321. {
  322.     //
  323.     //  In this case, we don't return zero to mean 'not found', so we have to
  324.     //  map it to the official not found value if we don't find it.
  325.     //
  326.     const DTDElementDecl* decl = fElemDeclPool->getByKey(qName);
  327.     if (!decl)
  328.         return XMLElementDecl::fgInvalidElemId;
  329.     return decl->getId();
  330. }
  331. inline const XMLElementDecl* DTDGrammar::getElemDecl( const   unsigned int
  332.                                               , const XMLCh* const
  333.                                               , const XMLCh* const    qName
  334.                                               , unsigned int)   const
  335. {
  336.     const XMLElementDecl* elemDecl = fElemDeclPool->getByKey(qName);
  337.     if (!elemDecl)
  338.         elemDecl = fElemNonDeclPool->getByKey(qName);
  339.     return elemDecl;
  340. }
  341. inline XMLElementDecl* DTDGrammar::getElemDecl (const   unsigned int
  342.                                               , const XMLCh* const
  343.                                               , const XMLCh* const    qName
  344.                                               , unsigned int)
  345. {
  346.     XMLElementDecl* elemDecl = fElemDeclPool->getByKey(qName);
  347.     if (!elemDecl)
  348.         elemDecl = fElemNonDeclPool->getByKey(qName);
  349.     return elemDecl;
  350. }
  351. inline const XMLElementDecl* DTDGrammar::getElemDecl(const unsigned int elemId) const
  352. {
  353.     // Look up this element decl by id
  354.     return fElemDeclPool->getById(elemId);
  355. }
  356. inline XMLElementDecl* DTDGrammar::getElemDecl(const unsigned int elemId)
  357. {
  358.     // Look up this element decl by id
  359.     return fElemDeclPool->getById(elemId);
  360. }
  361. inline unsigned int
  362. DTDGrammar::putElemDecl(XMLElementDecl* const elemDecl,
  363.                         const bool notDeclared) const
  364. {
  365.     if (notDeclared)
  366.         return fElemNonDeclPool->put((DTDElementDecl*) elemDecl);
  367.     return fElemDeclPool->put((DTDElementDecl*) elemDecl);
  368. }
  369. // Notation Decl
  370. inline const XMLNotationDecl* DTDGrammar::getNotationDecl(const XMLCh* const notName) const
  371. {
  372.     return fNotationDeclPool->getByKey(notName);
  373. }
  374. inline XMLNotationDecl* DTDGrammar::getNotationDecl(const XMLCh* const notName)
  375. {
  376.     return fNotationDeclPool->getByKey(notName);
  377. }
  378. inline unsigned int DTDGrammar::putNotationDecl(XMLNotationDecl* const notationDecl)   const
  379. {
  380.     return fNotationDeclPool->put(notationDecl);
  381. }
  382. inline bool DTDGrammar::getValidated() const
  383. {
  384.     return fValidated;
  385. }
  386. inline void DTDGrammar::setValidated(const bool newState)
  387. {
  388.     fValidated = newState;
  389. }
  390. XERCES_CPP_NAMESPACE_END
  391. #endif