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

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: XMLElementDecl.hpp,v $
  58.  * Revision 1.18  2001/08/21 16:06:10  tng
  59.  * Schema: Unique Particle Attribution Constraint Checking.
  60.  *
  61.  * Revision 1.17  2001/07/24 18:30:47  knoaman
  62.  * Added support for <group> + extra constraint checking for complexType
  63.  *
  64.  * Revision 1.16  2001/06/21 14:25:28  knoaman
  65.  * Fix for bug 1946
  66.  *
  67.  * Revision 1.15  2001/05/11 13:25:32  tng
  68.  * Copyright update.
  69.  *
  70.  * Revision 1.14  2001/05/03 20:34:22  tng
  71.  * Schema: SchemaValidator update
  72.  *
  73.  * Revision 1.13  2001/04/19 18:16:52  tng
  74.  * Schema: SchemaValidator update, and use QName in Content Model
  75.  *
  76.  * Revision 1.12  2001/03/21 21:56:02  tng
  77.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  78.  *
  79.  * Revision 1.11  2001/03/21 19:29:29  tng
  80.  * Schema: Content Model Updates, by Pei Yong Zhang.
  81.  *
  82.  * Revision 1.10  2001/02/26 19:29:13  tng
  83.  * Schema: add virtual method getURI(), getContentSpec and setContenSpec in XMLElementDecl, and DTDElementDecl.
  84.  *
  85.  * Revision 1.9  2001/02/26 19:21:30  tng
  86.  * Schema: add parameter prefix in findElem and findAttr.
  87.  *
  88.  * Revision 1.8  2000/12/14 18:49:57  tng
  89.  * Fix API document generation warning: "Warning: end of member group without matching begin"
  90.  *
  91.  * Revision 1.7  2000/11/30 18:22:38  andyh
  92.  * reuseValidator - fix bugs (spurious errors) that occured on reuse due to
  93.  * pools already containing some items.  Fixed by Tinny Ng.
  94.  *
  95.  * Revision 1.6  2000/05/11 23:11:32  andyh
  96.  * Add missing validity checks for stand-alone documents, character range
  97.  * and Well-formed parsed entities.  Changes contributed by Sean MacRoibeaird
  98.  * <sean.Macroibeaird@ireland.sun.com>
  99.  *
  100.  * Revision 1.5  2000/02/24 20:00:23  abagchi
  101.  * Swat for removing Log from API docs
  102.  *
  103.  * Revision 1.4  2000/02/16 19:48:56  roddey
  104.  * More documentation updates
  105.  *
  106.  * Revision 1.3  2000/02/15 01:21:30  roddey
  107.  * Some initial documentation improvements. More to come...
  108.  *
  109.  * Revision 1.2  2000/02/06 07:47:48  rahulj
  110.  * Year 2K copyright swat.
  111.  *
  112.  * Revision 1.1.1.1  1999/11/09 01:08:32  twl
  113.  * Initial checkin
  114.  *
  115.  * Revision 1.2  1999/11/08 20:44:38  rahul
  116.  * Swat for adding in Product name and CVS comment log variable.
  117.  *
  118.  */
  119. #if !defined(XMLELEMENTDECL_HPP)
  120. #define XMLELEMENTDECL_HPP
  121. #include <util/XMLString.hpp>
  122. #include <framework/XMLAttr.hpp>
  123. #include <framework/XMLAttDefList.hpp>
  124. class ContentSpecNode;
  125. class XMLContentModel;
  126. /**
  127.  *  This class defines the core information of an element declaration. Each
  128.  *  validator (DTD, Schema, etc...) will have its own information that it
  129.  *  associations with the declaration of an element, but they must all share
  130.  *  at least this core information, i.e. they must all derive from this
  131.  *  class. The set of info enforced at this level is driven by the needs of
  132.  *  XML 1.0 spec validation and well formedness checks.
  133.  *
  134.  *  This class defines some special element id values for invalid elements
  135.  *  and PCDATA elements, as well as a string for the special PCDATA element
  136.  *  name. All validators must honor these special values in order to allow
  137.  *  content models to work generically (i.e. to let code know when its dealing
  138.  *  with invalid or PCDATA element ids without having to know what type of
  139.  *  validator its messing with.)
  140.  */
  141. class XMLPARSER_EXPORT XMLElementDecl
  142. {
  143.  public:
  144.     // -----------------------------------------------------------------------
  145.     //  Class specific types
  146.     //
  147.     //  CreateReasons
  148.     //      This type is used to store how an element declaration got into
  149.     //      the grammar's element pool. They are faulted in for various
  150.     //      reasons.
  151.     //
  152.     //  LookupOpts
  153.     //      These are the values used by the attribute lookup methods.
  154.     //
  155.     //  CharDataOpts
  156.     //      This is used to indicate how this type of element reacts to
  157.     //      character data as content.
  158.     // -----------------------------------------------------------------------
  159.     enum CreateReasons
  160.     {
  161.         NoReason
  162.         , Declared
  163.         , AttList
  164.         , InContentModel
  165.         , AsRootElem
  166.         , JustFaultIn
  167.     };
  168.     enum LookupOpts
  169.     {
  170.         AddIfNotFound
  171.         , FailIfNotFound
  172.     };
  173.     enum CharDataOpts
  174.     {
  175.         NoCharData
  176.         , SpacesOk
  177.         , AllCharData
  178.     };
  179.     // -----------------------------------------------------------------------
  180.     //  Public static data
  181.     //
  182.     //  fgInvalidElemId
  183.     //      A value to represent an invalid element node id.
  184.     //
  185.     //  fgPCDataElemId
  186.     //      This is the value to use to represent a PCDATA node when an
  187.     //      element id is required.
  188.     //
  189.     //  fgPCDataElemName
  190.     //      This is the value to use to represent a PCDATA node when an
  191.     //      element name is required.
  192.     // -----------------------------------------------------------------------
  193.     static const unsigned int   fgInvalidElemId;
  194.     static const unsigned int   fgPCDataElemId;
  195.     static const XMLCh          fgPCDataElemName[];
  196.     // -----------------------------------------------------------------------
  197.     //  Destructor
  198.     // -----------------------------------------------------------------------
  199.     /** @name Destructor */
  200.     //@{
  201.     virtual ~XMLElementDecl();
  202.     //@}
  203.     // -----------------------------------------------------------------------
  204.     //  The virtual element decl interface
  205.     // -----------------------------------------------------------------------
  206.     /** @name Virual ElementDecl interface */
  207.     //@{
  208.     /** Find an attribute by name or optionally fault it in.
  209.       *
  210.       * The derived class should look up the passed attribute in the list of
  211.       * of attributes for this element. If namespaces are enabled, then it
  212.       * should use the uriId/baseName pair, else it should use the qName. The
  213.       * options allow the caller to indicate whether the attribute should be
  214.       * defaulted in if not found. If it is defaulted in, then wasAdded should
  215.       * be set, else it should be cleared. If its not found and the caller does
  216.       * not want defaulting, then return a null pointer.
  217.       *
  218.       * @param  qName       This is the qName of the attribute, i.e. the actual
  219.       *                     lexical name found.
  220.       *
  221.       * @param  uriId       This is the id of the URI of the namespace to which
  222.       *                     this attribute mapped. Only valid if namespaces are
  223.       *                     enabled.
  224.       *
  225.       * @param  baseName    This is the base part of the name, i.e. after any
  226.       *                     prefix.
  227.       *
  228.       * @param  prefix      The prefix, if any, of this attribute's name. If
  229.       *                     this is empty, then uriID is meaningless as well.
  230.       *
  231.       * @param  options     Indicates the lookup options.
  232.       *
  233.       * @param  wasAdded    Should be set if the attribute is faulted in, else
  234.       *                     cleared.
  235.       */
  236.     virtual XMLAttDef* findAttr
  237.     (
  238.         const   XMLCh* const    qName
  239.         , const unsigned int    uriId
  240.         , const XMLCh* const    baseName
  241.         , const XMLCh* const    prefix
  242.         , const LookupOpts      options
  243.         ,       bool&           wasAdded
  244.     )   const = 0;
  245.     /** Get a list of attributes defined for this element.
  246.       *
  247.       * The derived class should return a reference to some member object which
  248.       * implements the XMLAttDefList interface. This object gives the scanner the
  249.       * ability to look through the attributes defined for this element.
  250.       *
  251.       * It is done this way for efficiency, though of course this is not thread
  252.       * safe. The scanner guarantees that it won't ever call this method in any
  253.       * nested way, but the outside world must be careful about when it calls
  254.       * this method, and optimally never would.
  255.       */
  256.     virtual XMLAttDefList& getAttDefList() const = 0;
  257.     /** The character data options for this element type
  258.       *
  259.       * The derived class should return an appropriate character data opts value
  260.       * which correctly represents its tolerance towards whitespace or character
  261.       * data inside of its instances. This allows the scanner to do all of the
  262.       * validation of character data.
  263.       */
  264.     virtual CharDataOpts getCharDataOpts() const = 0;
  265.     /** Indicate whether this element type defined any attributes
  266.       *
  267.       * The derived class should return a boolean that indicates whether this
  268.       * element has any attributes defined for it or not. This is an optimization
  269.       * that allows the scanner to skip some work if no attributes exist.
  270.       */
  271.     virtual bool hasAttDefs() const = 0;
  272.     /** Reset the flags on the attribute definitions.
  273.       *
  274.       * This method is called by the scanner at the beginning of each scan
  275.       * of a start tag, asking this element decl to reset the 'declared' flag
  276.       * of each of its attribute defs. This allows the scanner to mark each
  277.       * one as declared yet or not.
  278.       */
  279.     virtual bool resetDefs() = 0;
  280.     /** Get a pointer to the content spec node
  281.       *
  282.       * This method will return a const pointer to the content spec node object
  283.       * of this element.
  284.       *
  285.       * @return A const pointer to the element's content spec node
  286.       */
  287.     virtual const ContentSpecNode* getContentSpec() const = 0;
  288.     /** Get a pointer to the content spec node
  289.       *
  290.       * This method is identical to the previous one, except that it is non
  291.       * const.
  292.       */
  293.     virtual ContentSpecNode* getContentSpec() = 0;
  294.     /** Set the content spec node object for this element type
  295.       *
  296.       * This method will adopt the based content spec node object. This is called
  297.       * by the actual validator which is parsing its DTD or Schema or whatever
  298.       * and store it on the element decl object via this method.
  299.       *
  300.       * @param  toAdopt This method will adopt the passed content node spec
  301.       *         object. Any previous object is destroyed.
  302.       */
  303.     virtual void setContentSpec(ContentSpecNode* toAdopt) = 0;
  304.     
  305.     /** Get a pointer to the abstract content model
  306.       *
  307.       * This method will return a const pointer to the content model object
  308.       * of this element. This class is a simple abstraction that allows an
  309.       * element to define and use multiple, specialized content model types
  310.       * internally but still allow the outside world to do simple stuff with
  311.       * them.
  312.       *
  313.       * @return A pointer to the element's content model, via the basic
  314.       * abstract content model type.
  315.       */
  316.     virtual XMLContentModel* getContentModel() = 0;    
  317.     
  318.     /** Set the content model object for this element type
  319.       *
  320.       * This method will adopt the based content model object. This is called
  321.       * by the actual validator which is parsing its DTD or Schema or whatever
  322.       * a creating an element decl. It will build what it feels is the correct
  323.       * content model type object and store it on the element decl object via
  324.       * this method.
  325.       *
  326.       * @param  newModelToAdopt This method will adopt the passed content model
  327.       *         object. Any previous object is destroyed.
  328.       */
  329.     virtual void setContentModel(XMLContentModel* const newModelToAdopt) = 0;    
  330.     
  331.     /** Geta formatted string of the content model
  332.       *
  333.       * This method is a convenience method which will create a formatted
  334.       * representation of the content model of the element. It will not always
  335.       * exactly recreate the original model, since some normalization or
  336.       * or reformatting may occur. But, it will be a technically accurate
  337.       * representation of the original content model.
  338.       *
  339.       * @return A pointer to an internal buffer which contains the formatted
  340.       *         content model. The caller does not own this buffer and should
  341.       *         copy it if it needs to be kept around.
  342.       */
  343.     virtual const XMLCh* getFormattedContentModel ()   const = 0;    
  344.     //@}
  345.     // -----------------------------------------------------------------------
  346.     //  Getter methods
  347.     // -----------------------------------------------------------------------
  348.     /** @name Getter methods */
  349.     //@{
  350.     /** Get the base name of this element type.
  351.       *
  352.       * Return the base name part of the element's name. This is the
  353.       * same regardless of whether namespaces are enabled or not.
  354.       *
  355.       * @return A const pointer to the base name of the element decl.
  356.       */
  357.     const XMLCh* getBaseName() const;
  358.     XMLCh* getBaseName();
  359.     /** Get the URI id of this element type.
  360.       *
  361.       * Return the URI Id of this element.
  362.       *
  363.       * @return The URI Id of the element decl, or the emptyNamespaceId if not applicable.
  364.       */
  365.     const unsigned int getURI() const;
  366.     /** Get the QName of this element type.
  367.       *
  368.       * Return the QName part of the element's name.  This is the
  369.       * same regardless of whether namespaces are enabled or not.
  370.       *
  371.       * @return A const pointer to the QName of the element decl.
  372.       */
  373.     const QName* getElementName() const;
  374.     QName* getElementName();
  375.     /** Get the full name of this element type.
  376.       *
  377.       * Return the full name of the element. If namespaces
  378.       * are not enabled, then this is the qName. Else it is the {uri}baseName
  379.       * form. For those validators that always require namespace processing, it
  380.       * will always be in the latter form because namespace processing will always
  381.       * be on.
  382.       */
  383.     const XMLCh* getFullName() const;
  384.     /** Get the create reason for this element type
  385.       *
  386.       * This method returns an enumeration which indicates why this element
  387.       * declaration exists. Elements can be used before they are actually
  388.       * declared, so they will often be faulted into the pool and marked as
  389.       * to why they are there.
  390.       *
  391.       * @return An enumerated value that indicates the reason why this element
  392.       * was added to the element decl pool.
  393.       */
  394.     CreateReasons getCreateReason() const;
  395.     /** Get the element decl pool id for this element type
  396.       *
  397.       * This method will return the element decl pool id of this element
  398.       * declaration. This uniquely identifies this element type within the
  399.       * parse event that it is declared within. This value is assigned by the
  400.       * grammar whose decl pool this object belongs to.
  401.       *
  402.       * @return The element decl id of this element declaration.
  403.       */
  404.     unsigned int getId() const;
  405.     /** Indicate whether this element type has been declared yet
  406.       *
  407.       * This method returns a boolean that indicates whether this element
  408.       * has been declared yet. There are a number of reasons why an element
  409.       * declaration can be faulted in, but eventually it must be declared or
  410.       * its an error. See the CreateReasons enumeration.
  411.       *
  412.       * @return true if this element has been declared, else false.
  413.       */
  414.     bool isDeclared() const;
  415.     /** Indicate whether this element type has been declared externally
  416.       *
  417.       * This method returns a boolean that indicates whether this element
  418.       * has been declared externally.
  419.       *
  420.       * @return true if this element has been declared externally, else false.
  421.       */
  422.     bool isExternal() const;
  423.     //@}
  424.     // -----------------------------------------------------------------------
  425.     //  Setter methods
  426.     // -----------------------------------------------------------------------
  427.     /** @name Setter methods */
  428.     //@{
  429.     /** Set the element name object for this element type
  430.       *
  431.       * This method will adopt the based content spec node object. This is called
  432.       * by the actual validator which is parsing its DTD or Schema or whatever
  433.       * and store it on the element decl object via this method.
  434.       *
  435.       * @param  prefix       Prefix of the element
  436.       * @param  localPart    Base Name of the element
  437.       * @param  uriId        The uriId of the element
  438.       */
  439.       void setElementName(const XMLCh* const       prefix
  440.                         , const XMLCh* const       localPart
  441.                         , const int                uriId );
  442.     /** Set the element name object for this element type
  443.       *
  444.       * This method will adopt the based content spec node object. This is called
  445.       * by the actual validator which is parsing its DTD or Schema or whatever
  446.       * and store it on the element decl object via this method.
  447.       *
  448.       * @param  rawName      Full Name of the element
  449.       * @param  uriId        The uriId of the element
  450.       */
  451.       void setElementName(const XMLCh* const    rawName
  452.                         , const int             uriId );
  453.     /** Set the element name object for this element type
  454.       *
  455.       * This method will adopt the based content spec node object. This is called
  456.       * by the actual validator which is parsing its DTD or Schema or whatever
  457.       * and store it on the element decl object via this method.
  458.       *
  459.       * @param  elementName  QName of the element
  460.       */
  461.       void setElementName(const QName* const    elementName);
  462.     /** Update the create reason for this element type.
  463.       *
  464.       * This method will update the 'create reason' field for this element
  465.       * decl object. As the validator parses its DTD, Schema, etc... it will
  466.       * encounter various references to an element declaration, which will
  467.       * cause the element declaration to either be declared or to be faulted
  468.       * into the pool in preperation for some future declaration. As it does
  469.       * so,it will update this field to indicate the current satus of the
  470.       * decl object.
  471.       */
  472.     void setCreateReason(const CreateReasons newReason);
  473.     /** Set the element decl pool id for this element type
  474.       *
  475.       * This method will set the pool id of this element decl. This is called
  476.       * by the grammar which created this object, and will provide this
  477.       * decl object with a unique id within the parse event that created it.
  478.       */
  479.     void setId(const unsigned int newId);
  480.     /** Set the element decl to indicate external declaration
  481.       *
  482.       */
  483.     void setExternalElemDeclaration(const bool aValue);
  484.     //@}
  485.     // -----------------------------------------------------------------------
  486.     //  Miscellaneous methods
  487.     // -----------------------------------------------------------------------
  488.     /** @name Miscellenous methods */
  489.     //@{
  490.     //@}
  491. protected :
  492.     // -----------------------------------------------------------------------
  493.     //  Hidden constructors
  494.     // -----------------------------------------------------------------------
  495.     XMLElementDecl();
  496. private :
  497.     // -----------------------------------------------------------------------
  498.     //  Unimplemented constructors and operators
  499.     // -----------------------------------------------------------------------
  500.     XMLElementDecl(const XMLElementDecl&);
  501.     void operator=(const XMLElementDecl&);
  502.     // -----------------------------------------------------------------------
  503.     //  Data members
  504.     //
  505.     //  fElementName
  506.     //      This is the name of the element decl.
  507.     //
  508.     //  fCreateReason
  509.     //      We sometimes have to put an element decl object into the elem
  510.     //      decl pool before the element's declaration is seen, such as when
  511.     //      its used in another element's content model or an att list is
  512.     //      seen for it. This flag tells us whether its been declared, and
  513.     //      if not why it had to be created.
  514.     //
  515.     //  fId
  516.     //      The unique id of this element. This is created by the derived
  517.     //      class, or more accurately the grammar that owns the objects
  518.     //      of the derived types. But, since they all have to have them, we
  519.     //      let them all store the id here. It is defaulted to have the
  520.     //      value fgInvalidElem until explicitly set.
  521.     //
  522.     //  fExternalElement
  523.     //      This flag indicates whether or the element was declared externally.
  524.     // -----------------------------------------------------------------------
  525.     QName*              fElementName;
  526.     CreateReasons       fCreateReason;
  527.     unsigned int        fId;
  528.     bool                fExternalElement;
  529. };
  530. // ---------------------------------------------------------------------------
  531. //  XMLElementDecl: Getter methods
  532. // ---------------------------------------------------------------------------
  533. inline const XMLCh* XMLElementDecl::getBaseName() const
  534. {
  535.     return fElementName->getLocalPart();
  536. }
  537. inline XMLCh* XMLElementDecl::getBaseName()
  538. {
  539.     return fElementName->getLocalPart();
  540. }
  541. inline const unsigned int XMLElementDecl::getURI() const
  542. {
  543.     return fElementName->getURI();
  544. }
  545. inline const QName* XMLElementDecl::getElementName() const
  546. {
  547.     return fElementName;
  548. }
  549. inline QName* XMLElementDecl::getElementName()
  550. {
  551.     return fElementName;
  552. }
  553. inline const XMLCh* XMLElementDecl::getFullName() const
  554. {
  555.     return fElementName->getRawName();
  556. }
  557. inline XMLElementDecl::CreateReasons XMLElementDecl::getCreateReason() const
  558. {
  559.     return fCreateReason;
  560. }
  561. inline unsigned int XMLElementDecl::getId() const
  562. {
  563.     return fId;
  564. }
  565. inline bool XMLElementDecl::isDeclared() const
  566. {
  567.     return (fCreateReason == Declared);
  568. }
  569. inline bool XMLElementDecl::isExternal() const
  570. {
  571.     return fExternalElement;
  572. }
  573. // ---------------------------------------------------------------------------
  574. //  XMLElementDecl: Setter methods
  575. // ---------------------------------------------------------------------------
  576. inline void
  577. XMLElementDecl::setCreateReason(const XMLElementDecl::CreateReasons newReason)
  578. {
  579.     fCreateReason = newReason;
  580. }
  581. inline void XMLElementDecl::setId(const unsigned int newId)
  582. {
  583.     fId = newId;
  584. }
  585. inline void XMLElementDecl::setExternalElemDeclaration(const bool aValue)
  586. {
  587.     fExternalElement = aValue;
  588. }
  589. #endif