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

xml/soap/webservice

开发平台:

C/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: ContentSpecNode.hpp,v $
  58.  * Revision 1.19  2001/12/06 17:50:42  tng
  59.  * Performance Enhancement. The ContentSpecNode constructor always copied the QName
  60.  * that was passed to it.  Added a second constructor that allows the QName to be just assigned, not copied.
  61.  * That was because there are some cases in which a temporary QName was constructed, passed to ContentSpecNode, and then deleted.
  62.  * There were examples of that in TraverseSchema and DTDScanner.
  63.  * By Henry Zongaro.
  64.  *
  65.  * Revision 1.18  2001/11/07 21:50:28  tng
  66.  * Fix comment log that lead to error.
  67.  *
  68.  * Revision 1.17  2001/11/07 21:12:15  tng
  69.  * Performance: Create QName in ContentSpecNode only if it is a leaf/Any/PCDataNode.
  70.  *
  71.  * Revision 1.16  2001/08/28 20:21:08  peiyongz
  72.  * * AIX 4.2, xlC 3 rev.1 compilation error: get*() declared with external linkage
  73.  * and called or defined before being declared as inline
  74.  *
  75.  * Revision 1.15  2001/08/24 12:48:48  tng
  76.  * Schema: AllContentModel
  77.  *
  78.  * Revision 1.14  2001/08/23 11:54:26  tng
  79.  * Add newline at the end and various typo fixes.
  80.  *
  81.  * Revision 1.13  2001/08/22 16:04:07  tng
  82.  * ContentSpecNode copy constructor should copy Min and Max as well.
  83.  *
  84.  * Revision 1.12  2001/08/21 18:47:42  peiyongz
  85.  * AIX 4.2, xlC 3 rev.1 compilation error: dtor() declared with external linkage
  86.  *                                 and called or defined before being declared as inline
  87.  *
  88.  * Revision 1.11  2001/08/21 16:06:11  tng
  89.  * Schema: Unique Particle Attribution Constraint Checking.
  90.  *
  91.  * Revision 1.10  2001/08/20 13:18:58  tng
  92.  * bug in ContentSpecNode copy constructor.
  93.  *
  94.  * Revision 1.9  2001/07/24 18:33:13  knoaman
  95.  * Added support for <group> + extra constraint checking for complexType
  96.  *
  97.  * Revision 1.8  2001/07/09 15:22:36  knoaman
  98.  * complete <any> declaration.
  99.  *
  100.  * Revision 1.7  2001/05/11 13:27:18  tng
  101.  * Copyright update.
  102.  *
  103.  * Revision 1.6  2001/05/10 16:33:08  knoaman
  104.  * Traverse Schema Part III + error messages.
  105.  *
  106.  * Revision 1.5  2001/05/03 20:34:39  tng
  107.  * Schema: SchemaValidator update
  108.  *
  109.  * Revision 1.4  2001/04/19 18:17:29  tng
  110.  * Schema: SchemaValidator update, and use QName in Content Model
  111.  *
  112.  * Revision 1.3  2001/03/21 21:56:26  tng
  113.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  114.  *
  115.  * Revision 1.2  2001/02/27 14:48:49  tng
  116.  * Schema: Add CMAny and ContentLeafNameTypeVector, by Pei Yong Zhang
  117.  *
  118.  * Revision 1.1  2001/02/16 14:17:29  tng
  119.  * Schema: Move the common Content Model files that are shared by DTD
  120.  * and schema from 'DTD' folder to 'common' folder.  By Pei Yong Zhang.
  121.  *
  122.  * Revision 1.4  2000/03/02 19:55:38  roddey
  123.  * This checkin includes many changes done while waiting for the
  124.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  125.  * available elsewhere.
  126.  *
  127.  * Revision 1.3  2000/02/24 20:16:48  abagchi
  128.  * Swat for removing Log from API docs
  129.  *
  130.  * Revision 1.2  2000/02/09 21:42:37  abagchi
  131.  * Copyright swat
  132.  *
  133.  * Revision 1.1.1.1  1999/11/09 01:03:14  twl
  134.  * Initial checkin
  135.  *
  136.  * Revision 1.2  1999/11/08 20:45:38  rahul
  137.  * Swat for adding in Product name and CVS comment log variable.
  138.  *
  139.  */
  140. #if !defined(CONTENTSPECNODE_HPP)
  141. #define CONTENTSPECNODE_HPP
  142. #include <framework/XMLElementDecl.hpp>
  143. #include <util/XercesDefs.hpp>
  144. class XMLBuffer;
  145. class Grammar;
  146. class ContentSpecNode
  147. {
  148. public :
  149.     // -----------------------------------------------------------------------
  150.     //  Class specific types
  151.     // -----------------------------------------------------------------------
  152.     enum NodeTypes
  153.     {
  154.         Leaf = 0
  155.         , ZeroOrOne
  156.         , ZeroOrMore
  157.         , OneOrMore
  158.         , Choice
  159.         , Sequence
  160.         , Any
  161.         , Any_Other
  162.         , Any_NS = 8
  163.         , All = 9
  164.         , Any_Lax = 22
  165.         , Any_Other_Lax = 23
  166.         , Any_NS_Lax = 24
  167.         , Any_Skip = 38
  168.         , Any_Other_Skip = 39
  169.         , Any_NS_Skip = 40
  170.         , UnknownType = -1
  171.     };
  172.     // -----------------------------------------------------------------------
  173.     //  Constructors and Destructor
  174.     // -----------------------------------------------------------------------
  175.     ContentSpecNode();
  176.     ContentSpecNode(QName* const toAdopt);
  177.     ContentSpecNode(QName* const toAdopt, const bool copyQName);
  178.     ContentSpecNode
  179.     (
  180.         const   NodeTypes               type
  181.         ,       ContentSpecNode* const  firstToAdopt
  182.         ,       ContentSpecNode* const  secondToAdopt
  183.         , const bool                    adoptFirst = true
  184.         , const bool                    adoptSecond = true
  185.     );
  186.     ContentSpecNode(const ContentSpecNode&);
  187. ~ContentSpecNode();
  188.     // -----------------------------------------------------------------------
  189.     //  Getter methods
  190.     // -----------------------------------------------------------------------
  191.     QName* getElement();
  192.     const QName* getElement() const;
  193.     ContentSpecNode* getFirst();
  194.     const ContentSpecNode* getFirst() const;
  195.     ContentSpecNode* getSecond();
  196.     const ContentSpecNode* getSecond() const;
  197.     NodeTypes getType() const;
  198.     ContentSpecNode* orphanFirst();
  199.     ContentSpecNode* orphanSecond();
  200.     unsigned int getMinOccurs() const;
  201.     unsigned int getMaxOccurs() const;
  202.     bool isFirstAdopted() const;
  203.     bool isSecondAdopted() const;
  204.     // -----------------------------------------------------------------------
  205.     //  Setter methods
  206.     // -----------------------------------------------------------------------
  207.     void setElement(QName* const toAdopt);
  208.     void setFirst(ContentSpecNode* const toAdopt);
  209.     void setSecond(ContentSpecNode* const toAdopt);
  210.     void setType(const NodeTypes type);
  211.     void setMinOccurs(unsigned int min);
  212.     void setMaxOccurs(unsigned int max);
  213.     void setAdoptFirst(bool adoptFirst);
  214.     void setAdoptSecond(bool adoptSecond);
  215.     // -----------------------------------------------------------------------
  216.     //  Miscellaneous
  217.     // -----------------------------------------------------------------------
  218.     void formatSpec (XMLBuffer&      bufToFill)   const;
  219. private :
  220.     // -----------------------------------------------------------------------
  221.     //  Unimplemented constructors and operators
  222.     // -----------------------------------------------------------------------
  223.     // -----------------------------------------------------------------------
  224.     //  Private Data Members
  225.     //
  226.     //  fElement
  227.     //      If the type is Leaf/Any*, then this is the qName of the element. If the URI
  228.     //      is fgPCDataElemId, then its a PCData node.  Else, it is zero.
  229.     //
  230.     //  fFirst
  231.     //  fSecond
  232.     //      The optional first and second nodes. The fType field indicates
  233.     //      which of these are valid. The validaty constraints are:
  234.     //
  235.     //          Leaf = Neither valid
  236.     //          ZeroOrOne, ZeroOrMore = First
  237.     //          Choice, Sequence, All = First and Second
  238.     //          Any* = Neither valid
  239.     //
  240.     //  fType
  241.     //      The type of node. This controls how many of the child node fields
  242.     //      are used.
  243.     //
  244.     //  fAdoptFirst
  245.     //      Indicate if this ContentSpecNode adopts the fFirst, and is responsible
  246.     //      for deleting it.
  247.     //
  248.     //  fAdoptSecond
  249.     //      Indicate if this ContentSpecNode adopts the fSecond, and is responsible
  250.     //      for deleting it.
  251.     //
  252.     //  fMinOccurs
  253.     //      Indicate the minimum times that this node can occur
  254.     //
  255.     //  fMaxOccurs
  256.     //      Indicate the maximum times that this node can occur
  257.     //      -1 (Unbounded), default (1)
  258.     // -----------------------------------------------------------------------
  259.     QName*              fElement;
  260.     ContentSpecNode*    fFirst;
  261.     ContentSpecNode*    fSecond;
  262.     NodeTypes           fType;
  263.     bool                fAdoptFirst;
  264.     bool                fAdoptSecond;
  265.     unsigned int        fMinOccurs;
  266.     unsigned int        fMaxOccurs;
  267. };
  268. // ---------------------------------------------------------------------------
  269. //  ContentSpecNode: Constructors and Destructor
  270. // ---------------------------------------------------------------------------
  271. inline ContentSpecNode::ContentSpecNode() :
  272.     fElement(0)
  273.     , fFirst(0)
  274.     , fSecond(0)
  275.     , fType(ContentSpecNode::Leaf)
  276.     , fAdoptFirst(true)
  277.     , fAdoptSecond(true)
  278.     , fMinOccurs(1)
  279.     , fMaxOccurs(1)
  280. {
  281. }
  282. inline
  283. ContentSpecNode::ContentSpecNode(QName* const element) :
  284.     fElement(0)
  285.     , fFirst(0)
  286.     , fSecond(0)
  287.     , fType(ContentSpecNode::Leaf)
  288.     , fAdoptFirst(true)
  289.     , fAdoptSecond(true)
  290.     , fMinOccurs(1)
  291.     , fMaxOccurs(1)
  292. {
  293.     if (element)
  294.         fElement = new QName(element);
  295. }
  296. inline
  297. ContentSpecNode::ContentSpecNode(QName* const element
  298.                                , const bool copyQName) :
  299.     fElement(0)
  300.     , fFirst(0)
  301.     , fSecond(0)
  302.     , fType(ContentSpecNode::Leaf)
  303.     , fAdoptFirst(true)
  304.     , fAdoptSecond(true)
  305.     , fMinOccurs(1)
  306.     , fMaxOccurs(1)
  307. {
  308.     if (copyQName)
  309.     {
  310.         if (element)
  311.             fElement = new QName(element);
  312.     }
  313.     else
  314.     {
  315.         fElement = element;
  316.     }
  317. }
  318. inline
  319. ContentSpecNode::ContentSpecNode(const  NodeTypes               type
  320.                                 ,       ContentSpecNode* const  firstAdopt
  321.                                 ,       ContentSpecNode* const  secondAdopt
  322.                                 , const bool                    adoptFirst
  323.                                 , const bool                    adoptSecond) :
  324.     fElement(0)
  325.     , fFirst(firstAdopt)
  326.     , fSecond(secondAdopt)
  327.     , fType(type)
  328.     , fAdoptFirst(adoptFirst)
  329.     , fAdoptSecond(adoptSecond)
  330.     , fMinOccurs(1)
  331.     , fMaxOccurs(1)
  332. {
  333. }
  334. inline ContentSpecNode::~ContentSpecNode()
  335. {
  336.     // Delete our children, which cause recursive cleanup
  337.     if (fAdoptFirst) {
  338. delete fFirst;
  339.     }
  340.     if (fAdoptSecond) {
  341. delete fSecond;
  342.     }
  343.     delete fElement;
  344. }
  345. // ---------------------------------------------------------------------------
  346. //  ContentSpecNode: Getter methods
  347. // ---------------------------------------------------------------------------
  348. inline QName* ContentSpecNode::getElement()
  349. {
  350.     return fElement;
  351. }
  352. inline const QName* ContentSpecNode::getElement() const
  353. {
  354.     return fElement;
  355. }
  356. inline ContentSpecNode* ContentSpecNode::getFirst()
  357. {
  358.     return fFirst;
  359. }
  360. inline const ContentSpecNode* ContentSpecNode::getFirst() const
  361. {
  362.     return fFirst;
  363. }
  364. inline ContentSpecNode* ContentSpecNode::getSecond()
  365. {
  366.     return fSecond;
  367. }
  368. inline const ContentSpecNode* ContentSpecNode::getSecond() const
  369. {
  370.     return fSecond;
  371. }
  372. inline ContentSpecNode::NodeTypes ContentSpecNode::getType() const
  373. {
  374.     return fType;
  375. }
  376. inline ContentSpecNode* ContentSpecNode::orphanFirst()
  377. {
  378.     ContentSpecNode* retNode = fFirst;
  379.     fFirst = 0;
  380.     return retNode;
  381. }
  382. inline ContentSpecNode* ContentSpecNode::orphanSecond()
  383. {
  384.     ContentSpecNode* retNode = fSecond;
  385.     fSecond = 0;
  386.     return retNode;
  387. }
  388. inline unsigned int ContentSpecNode::getMinOccurs() const
  389. {
  390.     return fMinOccurs;
  391. }
  392. inline unsigned int ContentSpecNode::getMaxOccurs() const
  393. {
  394.     return fMaxOccurs;
  395. }
  396. inline bool ContentSpecNode::isFirstAdopted() const
  397. {
  398.     return fAdoptFirst;
  399. }
  400. inline bool ContentSpecNode::isSecondAdopted() const
  401. {
  402.     return fAdoptSecond;
  403. }
  404. // ---------------------------------------------------------------------------
  405. //  ContentSpecType: Setter methods
  406. // ---------------------------------------------------------------------------
  407. inline void ContentSpecNode::setElement(QName* const element)
  408. {
  409.     delete fElement;
  410.     fElement = 0;
  411.     if (element)
  412.         fElement = new QName(element);
  413. }
  414. inline void ContentSpecNode::setFirst(ContentSpecNode* const toAdopt)
  415. {
  416.     if (fAdoptFirst)
  417.         delete fFirst;
  418.     fFirst = toAdopt;
  419. }
  420. inline void ContentSpecNode::setSecond(ContentSpecNode* const toAdopt)
  421. {
  422.     if (fAdoptSecond)
  423.         delete fSecond;
  424.     fSecond = toAdopt;
  425. }
  426. inline void ContentSpecNode::setType(const NodeTypes type)
  427. {
  428.     fType = type;
  429. }
  430. inline void ContentSpecNode::setMinOccurs(unsigned int min)
  431. {
  432.     fMinOccurs = min;
  433. }
  434. inline void ContentSpecNode::setMaxOccurs(unsigned int max)
  435. {
  436.     fMaxOccurs = max;
  437. }
  438. inline void ContentSpecNode::setAdoptFirst(bool newState)
  439. {
  440.     fAdoptFirst = newState;
  441. }
  442. inline void ContentSpecNode::setAdoptSecond(bool newState)
  443. {
  444.     fAdoptSecond = newState;
  445. }
  446. #endif