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

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.  * $Id: SchemaInfo.hpp,v 1.5 2001/10/04 15:08:56 knoaman Exp $
  58.  */
  59. #if !defined(SCHEMAINFO_HPP)
  60. #define SCHEMAINFO_HPP
  61. /** When in a <redefine>, type definitions being used (and indeed
  62.   * refs to <group>'s and <attributeGroup>'s) may refer to info
  63.   * items either in the schema being redefined, in the <redefine>,
  64.   * or else in the schema doing the redefining.  Because of this
  65.   * latter we have to be prepared sometimes to look for our type
  66.   * definitions outside the schema stored in fSchemaRootElement.
  67.   * This simple class does this; it's just a linked list that
  68.   * lets us look at the <schema>'s on the queue; note also that this
  69.   * should provide us with a mechanism to handle nested <redefine>'s.
  70.   * It's also a handy way of saving schema info when importing/including.
  71.   */
  72. // ---------------------------------------------------------------------------
  73. //  Includes
  74. // ---------------------------------------------------------------------------
  75. #include <dom/DOM_Element.hpp>
  76. #include <util/RefVectorOf.hpp>
  77. #include <util/RefHash2KeysTableOf.hpp>
  78. #include <util/StringPool.hpp>
  79. class SchemaInfo
  80. {
  81. public:
  82.     enum ListType {
  83.         // Redefine is treated as an include
  84.         IMPORT = 1,
  85.         INCLUDE = 2
  86.     };
  87.     // -----------------------------------------------------------------------
  88.     //  Constructor/Destructor
  89.     // -----------------------------------------------------------------------
  90.     SchemaInfo(const unsigned short fElemAttrDefaultQualified,
  91.                const int blockDefault,
  92.                const int finalDefault,
  93.                const int targetNSURI,
  94.                const int currentScope,
  95.                const int scopeCount,
  96.                const unsigned int namespaceScopeLevel,
  97.                XMLCh* const schemaURL,
  98.                const XMLCh* const targetNSURIString,
  99.                XMLStringPool* const stringPool,
  100.                const DOM_Element& root);
  101.     ~SchemaInfo();
  102. // -----------------------------------------------------------------------
  103.     //  Getter methods
  104.     // -----------------------------------------------------------------------
  105.     XMLCh*                   getCurrentSchemaURL() const;
  106.     const XMLCh* const       getTargetNSURIString() const;
  107.     DOM_Element              getRoot() const;
  108.     int                      getBlockDefault() const;
  109.     int                      getFinalDefault() const;
  110.     int                      getTargetNSURI() const;
  111.     int                      getCurrentScope() const;
  112.     int                      getScopeCount() const;
  113.     unsigned int             getNamespaceScopeLevel() const;
  114.     unsigned short           getElemAttrDefaultQualified() const;
  115.     RefVectorEnumerator<SchemaInfo> getImportingListEnumerator() const;
  116. // -----------------------------------------------------------------------
  117.     //  Setter methods
  118.     // -----------------------------------------------------------------------
  119.     void setCurrentScope(const int aValue);
  120.     void setScopeCount(const int aValue);
  121.     
  122. // -----------------------------------------------------------------------
  123.     //  Access methods
  124.     // -----------------------------------------------------------------------
  125.     void addSchemaInfo(SchemaInfo* const toAdd, const ListType aListType);
  126.     void addRedefineInfo(const XMLCh* const categName, const XMLCh* const typeName,
  127.                          SchemaInfo* const toAdd);
  128.     bool containsInfo(const SchemaInfo* const toCheck, const ListType aListType) const;
  129.     SchemaInfo* getImportInfo(const unsigned int namespaceURI) const;
  130.     SchemaInfo* getRedefInfo(const XMLCh* const categName,
  131.                              const XMLCh* const typeName);
  132.     DOM_Element getTopLevelComponent(const XMLCh* const compCategory,
  133.                                      const XMLCh* const name);
  134.     DOM_Element getTopLevelComponent(const XMLCh* const compCategory,
  135.                                      const XMLCh* const name,
  136.                                      SchemaInfo** enclosingSchema);
  137.     void updateImportingInfo(SchemaInfo* const importingInfo);
  138.     bool circularImportExist(const unsigned int nameSpaceURI);
  139. private:
  140.     // -----------------------------------------------------------------------
  141.     //  Private data members
  142.     // -----------------------------------------------------------------------
  143.     unsigned short     fElemAttrDefaultQualified;
  144.     int                fBlockDefault;
  145.     int                fFinalDefault;
  146.     int                fTargetNSURI;
  147.     int                fCurrentScope;
  148.     int                fScopeCount;
  149.     unsigned int       fNamespaceScopeLevel;
  150.     XMLCh*             fCurrentSchemaURL;
  151.     const XMLCh*       fTargetNSURIString;
  152.     XMLStringPool*     fStringPool;
  153.     DOM_Element        fSchemaRootElement;
  154.     RefVectorOf<SchemaInfo>* fIncludeList;
  155.     RefVectorOf<SchemaInfo>* fImportList;
  156.     RefVectorOf<SchemaInfo>* fImportingList;
  157.     RefHash2KeysTableOf<SchemaInfo>* fRedefineList;
  158. };
  159. // ---------------------------------------------------------------------------
  160. //  SchemaInfo: Getter methods
  161. // ---------------------------------------------------------------------------
  162. inline unsigned short SchemaInfo::getElemAttrDefaultQualified() const {
  163.     return fElemAttrDefaultQualified;
  164. }
  165. inline int SchemaInfo::getBlockDefault() const {
  166.     return fBlockDefault;
  167. }
  168. inline int SchemaInfo::getFinalDefault() const {
  169.     return fFinalDefault;
  170. }
  171. inline unsigned int SchemaInfo::getNamespaceScopeLevel() const {
  172.     return fNamespaceScopeLevel;
  173. }
  174. inline XMLCh* SchemaInfo::getCurrentSchemaURL() const {
  175.     return fCurrentSchemaURL;
  176. }
  177. inline const XMLCh* const SchemaInfo::getTargetNSURIString() const {
  178.     return fTargetNSURIString;
  179. }
  180. inline DOM_Element SchemaInfo::getRoot() const {
  181.     return fSchemaRootElement;
  182. }
  183. inline int SchemaInfo::getTargetNSURI() const {
  184.     return fTargetNSURI;
  185. }
  186. inline int SchemaInfo::getCurrentScope() const {
  187.     return fCurrentScope;
  188. }
  189. inline int SchemaInfo::getScopeCount() const {
  190.     return fScopeCount;
  191. }
  192. inline RefVectorEnumerator<SchemaInfo>
  193. SchemaInfo::getImportingListEnumerator() const {
  194.     return RefVectorEnumerator<SchemaInfo>(fImportingList);
  195. }
  196. // ---------------------------------------------------------------------------
  197. //  Setter methods
  198. // ---------------------------------------------------------------------------
  199. inline void SchemaInfo::setCurrentScope(const int aValue) {
  200.     fCurrentScope = aValue;
  201. }
  202. inline void SchemaInfo::setScopeCount(const int aValue) {
  203.     fScopeCount = aValue;
  204. }
  205. // ---------------------------------------------------------------------------
  206. //  SchemaInfo: Access methods
  207. // ---------------------------------------------------------------------------
  208. inline void SchemaInfo::addSchemaInfo(SchemaInfo* const toAdd,
  209.                                       const ListType aListType) {
  210.     if (aListType == IMPORT) {
  211.         if (!fImportList)
  212.             fImportList = new RefVectorOf<SchemaInfo>(8, false);
  213.         if (!fImportList->containsElement(toAdd)) {
  214.     fImportList->addElement(toAdd);
  215.             toAdd->updateImportingInfo(this);
  216.         }
  217.     }
  218.     else {
  219.         if (!fIncludeList)
  220.             fIncludeList = new RefVectorOf<SchemaInfo>(8, false);
  221.         if (!fIncludeList->containsElement(toAdd))
  222.     fIncludeList->addElement(toAdd);
  223.     }
  224. }
  225. inline void SchemaInfo::addRedefineInfo(const XMLCh* const categName,
  226.                                         const XMLCh* const typeName,
  227.                                         SchemaInfo* const toAdd) {
  228.     if (!fRedefineList) {
  229.         fRedefineList = new RefHash2KeysTableOf<SchemaInfo>(8, false);
  230.     }
  231.     fRedefineList->put((void*) categName, fStringPool->addOrFind(typeName), toAdd);
  232. }
  233. inline SchemaInfo* SchemaInfo::getImportInfo(const unsigned int namespaceURI) const {
  234.     unsigned int importSize = (fImportList) ? fImportList->size() : 0;
  235.     SchemaInfo* currInfo = 0;
  236.     for (unsigned int i=0; i < importSize; i++) {
  237.         currInfo = fImportList->elementAt(i);
  238.         if (currInfo->getTargetNSURI() == (int) namespaceURI)
  239.             break;
  240.     }
  241.     return currInfo;
  242. }
  243. inline SchemaInfo* SchemaInfo::getRedefInfo(const XMLCh* const categName,
  244.                                             const XMLCh* const typeName) {
  245.     if (fRedefineList) {
  246.         return fRedefineList->get(categName, fStringPool->addOrFind(typeName));
  247.     }
  248.     return 0;
  249. }
  250. inline bool SchemaInfo::containsInfo(const SchemaInfo* const toCheck,
  251.                                      const ListType aListType) const {
  252.     if ((aListType == INCLUDE) && fIncludeList) {
  253.         return fIncludeList->containsElement(toCheck);        
  254.     }
  255.     else if ((aListType == IMPORT) && fImportList) {
  256.         return fImportList->containsElement(toCheck);
  257.     }
  258.     return false;
  259. }
  260. inline bool SchemaInfo::circularImportExist(const unsigned int namespaceURI) {
  261.     unsigned int importSize = fImportingList->size();
  262.     for (unsigned int i=0; i < importSize; i++) {
  263.         if (fImportingList->elementAt(i)->getTargetNSURI() == (int) namespaceURI) {
  264.             return true;
  265.         }
  266.     }
  267.     return false;
  268. }
  269. #endif
  270. /**
  271.   * End of file SchemaInfo.hpp
  272.   */