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

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: XMLAttr.hpp,v $
  58.  * Revision 1.9  2001/11/02 14:21:18  knoaman
  59.  * Add support for identity constraints.
  60.  *
  61.  * Revision 1.8  2001/05/11 13:25:31  tng
  62.  * Copyright update.
  63.  *
  64.  * Revision 1.7  2001/02/27 18:33:55  tng
  65.  * Schema: Use QName in XMLAttr.
  66.  *
  67.  * Revision 1.6  2000/04/10 22:42:53  roddey
  68.  * Extended the buffer reuse to the QName field, to further increase
  69.  * performance of attribute heavy applications.
  70.  *
  71.  * Revision 1.5  2000/03/02 19:54:24  roddey
  72.  * This checkin includes many changes done while waiting for the
  73.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  74.  * available elsewhere.
  75.  *
  76.  * Revision 1.4  2000/02/24 20:00:22  abagchi
  77.  * Swat for removing Log from API docs
  78.  *
  79.  * Revision 1.3  2000/02/15 01:21:30  roddey
  80.  * Some initial documentation improvements. More to come...
  81.  *
  82.  * Revision 1.2  2000/02/06 07:47:47  rahulj
  83.  * Year 2K copyright swat.
  84.  *
  85.  * Revision 1.1.1.1  1999/11/09 01:08:28  twl
  86.  * Initial checkin
  87.  *
  88.  * Revision 1.2  1999/11/08 20:44:35  rahul
  89.  * Swat for adding in Product name and CVS comment log variable.
  90.  *
  91.  */
  92. #if !defined(XMLATTR_HPP)
  93. #define XMLATTR_HPP
  94. #include <util/XMLString.hpp>
  95. #include <util/QName.hpp>
  96. #include <framework/XMLAttDef.hpp>
  97. /**
  98.  *  This class defines the information about an attribute that will come out
  99.  *  of the scanner during parsing. This information does not depend upon the
  100.  *  type of validator because it is not tied to any scheme/DTD type info. Its
  101.  *  just the raw XML 1.0 information that will be reported about an attribute
  102.  *  in the startElement() callback method of the XMLDocumentHandler class.
  103.  *  Hence it is not intended to be extended or derived from. Its designed to
  104.  *  be used as is.
  105.  *
  106.  *  The 'specified' field of this class indicates whether the attribute was
  107.  *  actually present or whether it was faulted in because it had a fixed or
  108.  *  default value.
  109.  *
  110.  *  The code receiving this information can ask its validator for more info
  111.  *  about the attribute, i.e. get its declaration from the DTD/Schema info.
  112.  *
  113.  *  Because of the heavy use (and reuse) of instances of this class, and the
  114.  *  number of string members it has, this class takes pains to not reallocate
  115.  *  string members unless it has to. It keeps up with how long each buffer
  116.  *  is and only reallocates if the new value won't fit.
  117.  */
  118. class XMLPARSER_EXPORT XMLAttr
  119. {
  120. public:
  121.     // -----------------------------------------------------------------------
  122.     //  Constructors and Destructor
  123.     // -----------------------------------------------------------------------
  124.     /** @name Constructors */
  125.     //@{
  126.     /**
  127.       * The default constructor just setsup an empty attribute to be filled
  128.       * in the later. Though the initial state is a reasonable one, it is
  129.       * not documented because it should not be depended on.
  130.       */
  131.     XMLAttr();
  132.     /**
  133.       * This is the primary constructor which takes all of the information
  134.       * required to construct a complete attribute object.
  135.       *
  136.       * @param  uriId       The id into the validator's URI pool of the URI
  137.       *                     that the prefix mapped to. Only used if namespaces
  138.       *                     are enabled/supported.
  139.       *
  140.       * @param  attrName    The base name of the attribute, i.e. the part
  141.       *                     after any prefix.
  142.       *
  143.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  144.       *                     this is empty, then uriID is meaningless as well.
  145.       *
  146.       * @param  attrValue   The value string of the attribute, which should
  147.       *                     be fully normalized by XML rules!
  148.       *
  149.       * @param  type        The type of the attribute. This will indicate
  150.       *                     the type of normalization done and constrains
  151.       *                     the value content. Make sure that the value
  152.       *                     set meets the constraints!
  153.       *
  154.       * @param  specified   Indicates whether the attribute was explicitly
  155.       *                     specified or not. If not, then it was faulted
  156.       *                     in from a FIXED or DEFAULT value.
  157.       */
  158.     XMLAttr
  159.     (
  160.         const   unsigned int        uriId
  161.         , const XMLCh* const        attrName
  162.         , const XMLCh* const        attrPrefix
  163.         , const XMLCh* const        attrValue
  164.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  165.         , const bool                specified = true
  166.     );
  167.     //@}
  168.     /** @name Destructor */
  169.     //@{
  170.     ~XMLAttr();
  171.     //@}
  172.     // -----------------------------------------------------------------------
  173.     //  Getter methods
  174.     // -----------------------------------------------------------------------
  175.     /** @name Getter methods */
  176.     //@{
  177.     /**
  178.       * This methode returns the attribute name in a QName format.
  179.       */
  180.     QName* getAttName() const;
  181.     /**
  182.       * This method gets a const pointer tot he name of the attribute. The
  183.       * form of this name is defined by the validator in use.
  184.       */
  185.     const XMLCh* getName() const;
  186.     /**
  187.       * This method will get a const pointer to the prefix string of this
  188.       * attribute. Since prefixes are optional, it may be zero.
  189.       */
  190.     const XMLCh* getPrefix() const;
  191.     /**
  192.       * This method will get the QName of this attribute, which will be the
  193.       * prefix if any, then a colon, then the base name. If there was no
  194.       * prefix, its the same as the getName() method.
  195.       */
  196.     const XMLCh* getQName() const;
  197.     /**
  198.       * This method will get the specified flag, which indicates whether
  199.       * the attribute was explicitly specified or just faulted in.
  200.       */
  201.     bool getSpecified() const;
  202.     /**
  203.       * This method will get the type of the attribute. The available types
  204.       * are defined by the XML specification.
  205.       */
  206.     XMLAttDef::AttTypes getType() const;
  207.     /**
  208.       * This method will get the value of the attribute. The value can be
  209.       * be an empty string, but never null if the object is correctly
  210.       * set up.
  211.       */
  212.     const XMLCh* getValue() const;
  213.     /**
  214.       * This method will get the id of the URI that this attribute's prefix
  215.       * mapped to. If namespaces are not on, then its value is meaningless.
  216.       */
  217.     unsigned int getURIId() const;
  218.     //@}
  219.     // -----------------------------------------------------------------------
  220.     //  Setter methods
  221.     // -----------------------------------------------------------------------
  222.     /** @name Setter methods */
  223.     //@{
  224.     /**
  225.       * This method is called to set up a default constructed object after
  226.       * the fact, or to reuse a previously used object.
  227.       *
  228.       * @param  uriId       The id into the validator's URI pool of the URI
  229.       *                     that the prefix mapped to. Only used if namespaces
  230.       *                     are enabled/supported.
  231.       *
  232.       * @param  attrName    The base name of the attribute, i.e. the part
  233.       *                     after any prefix.
  234.       *
  235.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  236.       *                     this is empty, then uriID is meaningless as well.
  237.       *
  238.       * @param  attrValue   The value string of the attribute, which should
  239.       *                     be fully normalized by XML rules according to the
  240.       *                     attribute type.
  241.       *
  242.       * @param  type        The type of the attribute. This will indicate
  243.       *                     the type of normalization done and constrains
  244.       *                     the value content. Make sure that the value
  245.       *                     set meets the constraints!
  246.       *
  247.       * @param  specified   Indicates whether the attribute was explicitly
  248.       *                     specified or not. If not, then it was faulted
  249.       *                     in from a FIXED or DEFAULT value.
  250.       */
  251.     void set
  252.     (
  253.         const   unsigned int        uriId
  254.         , const XMLCh* const        attrName
  255.         , const XMLCh* const        attrPrefix
  256.         , const XMLCh* const        attrValue
  257.         , const XMLAttDef::AttTypes type = XMLAttDef::CData
  258.     );
  259.     /**
  260.       * This method will update just the name related fields of the
  261.       * attribute object. The other fields are left as is.
  262.       *
  263.       * @param  uriId       The id into the validator's URI pool of the URI
  264.       *                     that the prefix mapped to. Only used if namespaces
  265.       *                     are enabled/supported.
  266.       *
  267.       * @param  attrName    The base name of the attribute, i.e. the part
  268.       *                     after any prefix.
  269.       *
  270.       * @param  attrPrefix  The prefix, if any, of this attribute's name. If
  271.       *                     this is empty, then uriID is meaningless as well.
  272.       */
  273.     void setName
  274.     (
  275.         const   unsigned int        uriId
  276.         , const XMLCh* const        attrName
  277.         , const XMLCh* const        attrPrefix
  278.     );
  279.     /**
  280.       * This method will update the specified state of the object.
  281.       *
  282.       * @param  specified   Indicates whether the attribute was explicitly
  283.       *                     specified or not. If not, then it was faulted
  284.       *                     in from a FIXED or DEFAULT value.
  285.       */
  286.     void setSpecified(const bool newValue);
  287.     /**
  288.       * This method will update the attribute type of the object.
  289.       *
  290.       * @param  newType     The type of the attribute. This will indicate
  291.       *                     the type of normalization done and constrains
  292.       *                     the value content. Make sure that the value
  293.       *                     set meets the constraints!
  294.       */
  295.     void setType(const XMLAttDef::AttTypes newType);
  296.     /**
  297.       * This method will update the value field of the attribute.
  298.       *
  299.       * @param  attrValue   The value string of the attribute, which should
  300.       *                     be fully normalized by XML rules according to the
  301.       *                     attribute type.
  302.       */
  303.     void setValue(const XMLCh* const newValue);
  304.     /**
  305.       * This method will set the URI id field of this attribute. This is
  306.       * generally only ever called internally by the parser itself during
  307.       * the parsing process.
  308.       */
  309.     void setURIId(const unsigned int uriId);
  310.     //@}
  311. private :
  312.     // -----------------------------------------------------------------------
  313.     //  Unimplemented constructors and operators
  314.     // -----------------------------------------------------------------------
  315.     XMLAttr(const XMLAttr&);
  316.     XMLAttr& operator=(const XMLAttr&);
  317.     // -----------------------------------------------------------------------
  318.     //  Private, helper methods
  319.     // -----------------------------------------------------------------------
  320.     void cleanUp();
  321.     // -----------------------------------------------------------------------
  322.     //  Private instance variables
  323.     //
  324.     //  fAttName
  325.     //      The Attribute Name;
  326.     //
  327.     //  fSpecified
  328.     //      True if this attribute appeared in the element; else, false if
  329.     //      it was defaulted from an AttDef.
  330.     //
  331.     //  fType
  332.     //      The attribute type enum value for this attribute. Indicates what
  333.     //      type of attribute it was.
  334.     //
  335.     //  fValue
  336.     //  fValueBufSz
  337.     //      The attribute value that was given in the attribute instance, and
  338.     //      its current buffer size (minus one, where the null is.)
  339.     //
  340.     // -----------------------------------------------------------------------
  341.     bool                fSpecified;
  342.     XMLAttDef::AttTypes fType;
  343.     XMLCh*              fValue;
  344.     unsigned int        fValueBufSz;
  345.     QName*              fAttName;
  346. };
  347. // ---------------------------------------------------------------------------
  348. //  XMLAttr: Constructors and Destructor
  349. // ---------------------------------------------------------------------------
  350. inline XMLAttr::~XMLAttr()
  351. {
  352.     cleanUp();
  353. }
  354. // ---------------------------------------------------------------------------
  355. //  XMLAttr: Getter methods
  356. // ---------------------------------------------------------------------------
  357. inline QName* XMLAttr::getAttName() const
  358. {
  359.     return fAttName;
  360. }
  361. inline const XMLCh* XMLAttr::getName() const
  362. {
  363.     return fAttName->getLocalPart();
  364. }
  365. inline const XMLCh* XMLAttr::getPrefix() const
  366. {
  367.     return fAttName->getPrefix();
  368. }
  369. inline bool XMLAttr::getSpecified() const
  370. {
  371.     return fSpecified;
  372. }
  373. inline XMLAttDef::AttTypes XMLAttr::getType() const
  374. {
  375.     return fType;
  376. }
  377. inline const XMLCh* XMLAttr::getValue() const
  378. {
  379.     return fValue;
  380. }
  381. inline unsigned int XMLAttr::getURIId() const
  382. {
  383.     return fAttName->getURI();
  384. }
  385. // ---------------------------------------------------------------------------
  386. //  XMLAttr: Setter methods
  387. // ---------------------------------------------------------------------------
  388. inline void XMLAttr::set(const  unsigned int        uriId
  389.                         , const XMLCh* const        attrName
  390.                         , const XMLCh* const        attrPrefix
  391.                         , const XMLCh* const        attrValue
  392.                         , const XMLAttDef::AttTypes type)
  393. {
  394.     // Set the name info and the value via their respective calls
  395.     fAttName->setName(attrPrefix, attrName, uriId);
  396.     setValue(attrValue);
  397.     // And store the type
  398.     fType = type;
  399. }
  400. inline void XMLAttr::setType(const XMLAttDef::AttTypes newValue)
  401. {
  402.     fType = newValue;
  403. }
  404. inline void XMLAttr::setSpecified(const bool newValue)
  405. {
  406.     fSpecified = newValue;
  407. }
  408. #endif