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

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: SEnumVal.cpp,v 1.5 2001/11/22 14:47:48 tng Exp $
  58.  * $Log: SEnumVal.cpp,v $
  59.  * Revision 1.5  2001/11/22 14:47:48  tng
  60.  * Use the phrase "Grammar" instead of "Validator" in EnumVal and SEnumVal Description.
  61.  *
  62.  * Revision 1.4  2001/11/21 22:09:49  peiyongz
  63.  * Copy Right date
  64.  *
  65.  * Revision 1.3  2001/11/21 19:05:23  peiyongz
  66.  * SEnumVal: GrammarType checked
  67.  *
  68.  *
  69.  */
  70. // ---------------------------------------------------------------------------
  71. //  Includes
  72. // ---------------------------------------------------------------------------
  73. #include <util/NameIdPool.hpp>
  74. #include <util/PlatformUtils.hpp>
  75. #include <framework/XMLValidator.hpp>
  76. #include <parsers/SAXParser.hpp>
  77. #include <validators/schema/SchemaValidator.hpp>
  78. #include <validators/common/ContentSpecNode.hpp>
  79. #include <validators/schema/SchemaSymbols.hpp>
  80. #include <iostream.h>
  81. #include <stdlib.h>
  82. #include <string.h>
  83. // ---------------------------------------------------------------------------
  84. //  Forward references
  85. // ---------------------------------------------------------------------------
  86. static void usage();
  87. void process(char* const);
  88. void processAttributes( XMLAttDefList& attList, bool margin = false );
  89. void processDatatypeValidator( const DatatypeValidator*, bool margin = false
  90. );
  91. void processContentSpecNode( const ContentSpecNode* specNode, bool margin =
  92. false );
  93. // ---------------------------------------------------------------------------
  94. //  This is a simple class that lets us do easy (though not terribly efficient)
  95. //  trancoding of XMLCh data to local code page for display.
  96. // ---------------------------------------------------------------------------
  97. class StrX
  98. {
  99. public :
  100.     // -----------------------------------------------------------------------
  101.     //  Constructors and Destructor
  102.     // -----------------------------------------------------------------------
  103.     StrX(const XMLCh* const toTranscode)
  104.     {
  105.         // Call the private transcoding method
  106.         fLocalForm = XMLString::transcode(toTranscode);
  107.     }
  108.     ~StrX()
  109.     {
  110.         delete [] fLocalForm;
  111.     }
  112.     // -----------------------------------------------------------------------
  113.     //  Getter methods
  114.     // -----------------------------------------------------------------------
  115.     const char* localForm() const
  116.     {
  117.         return fLocalForm;
  118.     }
  119. private :
  120.     // -----------------------------------------------------------------------
  121.     //  Private data members
  122.     //
  123.     //  fLocalForm
  124.     //      This is the local code page form of the string.
  125.     // -----------------------------------------------------------------------
  126.     char*   fLocalForm;
  127. };
  128. inline ostream& operator<<(ostream& target, const StrX& toDump)
  129. {
  130.     target << toDump.localForm();
  131.     return target;
  132. }
  133. // ---------------------------------------------------------------------------
  134. //  Local helper methods
  135. // ---------------------------------------------------------------------------
  136. static void usage()
  137. {
  138.     cout << "nUsage:n"
  139.             "    SEnumVal <XML file>nn"
  140.             "This program parses a file, then shows how to enumerate then"
  141.             "contents of the Schema Grammar. Essentially, shows how one cann"
  142.             "access the Schema information stored in internal data structures.n"
  143.          << endl;
  144. }
  145. // ---------------------------------------------------------------------------
  146. //  Program entry point
  147. // ---------------------------------------------------------------------------
  148. int main(int argC, char* argV[])
  149. {
  150.     // Initialize the XML4C system
  151.     try
  152.     {
  153.          XMLPlatformUtils::Initialize();
  154.     }
  155.     catch (const XMLException& toCatch)
  156.     {
  157.          cerr   << "Error during initialization! Message:n"
  158.                 << StrX(toCatch.getMessage()) << endl;
  159.          XMLPlatformUtils::Terminate();
  160.          return 1;
  161.     }
  162.     // Check command line and extract arguments.
  163.     // We only have one required parameter, which is the file to process
  164.     if ((argC != 2) ||
  165.         (*(argV[1]) == '-'))
  166.     {
  167.         usage();
  168.         XMLPlatformUtils::Terminate();
  169.         return 2;
  170.     }
  171.     try
  172.     {
  173. process(argV[1]);
  174.     }
  175.     catch (const XMLException& e)
  176.     {
  177.         cerr << "nError during parsing: '" << argV[1] << "'n"
  178.              << "Exception message is:  n"
  179.              << StrX(e.getMessage()) << "n" << endl;
  180.         XMLPlatformUtils::Terminate();
  181.         return 3;
  182.     }
  183.     XMLPlatformUtils::Terminate();
  184. return 0;
  185. }
  186. void process(char* const xmlFile)
  187. {
  188.     //
  189.     //  Create a Schema validator to be used for our validation work. Then create
  190.     //  a SAX parser object and pass it our validator. Then, according to what
  191.     //  we were told on the command line, set it to validate or not. He owns
  192.     //  the validator, so we have to allocate it.
  193.     //
  194.     SAXParser parser;
  195.     parser.setValidationScheme(SAXParser::Val_Always);
  196.     parser.setDoNamespaces(true);
  197.     parser.setDoSchema(true);
  198. parser.parse(xmlFile);
  199.     if (parser.getErrorCount())
  200. {
  201.         cout << "nErrors occured, no output availablen" << endl;
  202. return;
  203. }
  204. if (!parser.getValidator().handlesSchema())
  205. {
  206. cout << "n Non schema document, no output availablen" << endl;
  207. return;
  208. }
  209.     if ( parser.getValidator().getGrammar()->getGrammarType() != Grammar::SchemaGrammarType)
  210.     {
  211. cout << "n Non schema grammar, no output availablen" << endl;
  212. return;
  213.     }
  214. //
  215. //  Now we will get an enumerator for the element pool from the validator
  216. //  and enumerate the elements, printing them as we go. For each element
  217. //  we get an enumerator for its attributes and print them also.
  218. //
  219.     SchemaGrammar* grammar = (SchemaGrammar*) parser.getValidator().getGrammar();
  220. RefHash3KeysIdPoolEnumerator<SchemaElementDecl> elemEnum = grammar->getElemEnumerator();
  221. if (!elemEnum.hasMoreElements())
  222. {
  223. cout << "nThe validator has no elements to displayn" << endl;
  224. return;
  225. }
  226. while(elemEnum.hasMoreElements())
  227. {
  228. const SchemaElementDecl& curElem = elemEnum.nextElement();
  229. // Name
  230. cout << "Name:ttt" << StrX(curElem.getFullName()) << "n";
  231. // Model Type
  232. cout << "Model Type:tt";
  233. switch( curElem.getModelType() )
  234. {
  235. case SchemaElementDecl::Empty:          cout << "Empty";         break;
  236. case SchemaElementDecl::Any:            cout << "Any";           break;
  237. case SchemaElementDecl::Mixed_Simple:   cout << "Mixed_Simple";  break;
  238. case SchemaElementDecl::Mixed_Complex:  cout << "Mixed_Complex"; break;
  239. case SchemaElementDecl::Children:       cout << "Children";      break;
  240. case SchemaElementDecl::Simple:         cout << "Simple";        break;
  241. default:                                cout << "Unknown";       break;
  242. }
  243. cout << "n";
  244. // Create Reason
  245. cout << "Create Reason:t";
  246. switch( curElem.getCreateReason() )
  247. {
  248. case XMLElementDecl::NoReason:          cout << "Empty";            break;
  249. case XMLElementDecl::Declared:          cout << "Declared";         break;
  250. case XMLElementDecl::AttList:           cout << "AttList";          break;
  251. case XMLElementDecl::InContentModel:    cout << "InContentModel";   break;
  252. case XMLElementDecl::AsRootElem:        cout << "AsRootElem";       break;
  253. case XMLElementDecl::JustFaultIn:       cout << "JustFaultIn";      break;
  254. default:                            cout << "Unknown";  break;
  255. }
  256. cout << "n";
  257. // Content Spec Node
  258. processContentSpecNode( curElem.getContentSpec() );
  259. // Misc Flags
  260. int mflags = curElem.getMiscFlags();
  261. if( mflags !=0 )
  262. {
  263. cout << "Misc. Flags:t";
  264. }
  265. if( mflags == SchemaSymbols::INFINITY  )
  266. {
  267. cout << "Infinity ";
  268. }
  269. else
  270. {
  271. if ( mflags & SchemaSymbols::NILLABLE  != 0 )
  272. cout << "Nillable ";
  273. if ( mflags & SchemaSymbols::ABSTRACT  != 0 )
  274. cout << "Abstract ";
  275. if ( mflags & SchemaSymbols::FIXED     != 0 )
  276. cout << "Fixed ";
  277. }
  278. if( mflags !=0 )
  279. {
  280. cout << "n";
  281. }
  282. // Substitution Name
  283. XMLCh* subsGroup = curElem.getSubstitutionGroupName();
  284. if( subsGroup )
  285. {
  286. cout << "Substitution Name:t" << StrX(subsGroup) << "n";
  287. }
  288. // Content Model
  289. const XMLCh* fmtCntModel = curElem.getFormattedContentModel();
  290. if( fmtCntModel != NULL )
  291. {
  292. cout << "Content Model:t" << StrX(fmtCntModel) << "n";
  293. }
  294. const ComplexTypeInfo* ctype = curElem.getComplexTypeInfo();
  295. if( ctype != NULL)
  296. {
  297. cout << "ComplexType:n";
  298. cout << "tTypeName:t" << StrX(ctype->getTypeName()) << "n";
  299. ContentSpecNode* cSpecNode = ctype->getContentSpec();
  300. processContentSpecNode(cSpecNode, true );
  301. }
  302. // Datatype
  303. DatatypeValidator* dtValidator = curElem.getDatatypeValidator();
  304. processDatatypeValidator( dtValidator );
  305. // Get an enumerator for this guy's attributes if any
  306. if ( curElem.hasAttDefs() )
  307. {
  308. processAttributes( curElem.getAttDefList() );
  309. }
  310. cout << "--------------------------------------------";
  311. cout << endl;
  312.     }
  313.     return;
  314. }
  315. //---------------------------------------------------------------------
  316. //  Prints the Attribute's properties
  317. //---------------------------------------------------------------------
  318. void processAttributes( XMLAttDefList& attList, bool margin )
  319. {
  320.     if ( attList.isEmpty() )
  321.     {
  322.         return;
  323.     }
  324.     if ( margin )
  325.     {
  326.         cout << "t";
  327.     }
  328.     cout << "Attributes:n";
  329.     while( attList.hasMoreElements() )
  330.     {
  331.         // Name
  332.         SchemaAttDef& curAttDef = (SchemaAttDef&)attList.nextElement();
  333.         cout << "tName:ttt" << StrX(curAttDef.getFullName()) << "n";
  334.         // Type
  335.         cout << "tType:ttt";
  336. cout << StrX(XMLAttDef::getAttTypeString(curAttDef.getType()));
  337.         cout << "n";
  338.         // Default Type
  339.         cout << "tDefault Type:t";
  340. cout << StrX(XMLAttDef::getDefAttTypeString(curAttDef.getDefaultType()));
  341.         cout << "n";
  342.         // Value
  343.         if( curAttDef.getValue() )
  344.         {
  345.             cout << "tValue:ttt";
  346.             cout << StrX(curAttDef.getValue());
  347.             cout << "n";
  348.         }
  349.         // Enum. values
  350.         if( curAttDef.getEnumeration() )
  351.         {
  352.             cout << "tEnumeration:t";
  353.             cout << StrX(curAttDef.getEnumeration());
  354.             cout << "n";
  355.         }
  356.          const DatatypeValidator* dv = curAttDef.getDatatypeValidator();
  357.          processDatatypeValidator( dv, true );
  358.         cout << "n";
  359.     }
  360. }
  361. void processDatatypeValidator( const DatatypeValidator* dtValidator, bool margin )
  362. {
  363.     if( !dtValidator )
  364.     {
  365.         return;
  366.     }
  367.     if( margin )
  368.     {
  369.         cout << "t";
  370.     }
  371.     cout << "Base Datatype:tt";
  372.     switch( dtValidator->getType() )
  373.     {
  374.     case DatatypeValidator::String:         cout << "string";      break;
  375.     case DatatypeValidator::AnyURI:         cout << "AnyURI";      break;
  376.     case DatatypeValidator::QName:          cout << "QName";       break;
  377. case DatatypeValidator::Name:           cout << "Name";        break;
  378. case DatatypeValidator::NCName:         cout << "NCName";      break;
  379.     case DatatypeValidator::Boolean:        cout << "Boolean";     break;
  380.     case DatatypeValidator::Float:          cout << "Float";       break;
  381.     case DatatypeValidator::Double:         cout << "Double";      break;
  382.     case DatatypeValidator::Decimal:        cout << "Decimal";     break;
  383.     case DatatypeValidator::HexBinary:      cout << "HexBinary";   break;
  384.     case DatatypeValidator::Base64Binary:   cout << "Base64Binary";break;
  385.     case DatatypeValidator::Duration:       cout << "Duration";    break;
  386.     case DatatypeValidator::DateTime:       cout << "DateTime";    break;
  387.     case DatatypeValidator::Date:           cout << "Date";        break;
  388.     case DatatypeValidator::Time:           cout << "Time";        break;
  389.     case DatatypeValidator::MonthDay:       cout << "MonthDay";    break;
  390.     case DatatypeValidator::YearMonth:      cout << "YearMonth";   break;
  391.     case DatatypeValidator::Year:           cout << "Year";        break;
  392.     case DatatypeValidator::Month:          cout << "Month";       break;
  393.     case DatatypeValidator::Day:            cout << "Day";         break;
  394.     case DatatypeValidator::ID:             cout << "ID";          break;
  395.     case DatatypeValidator::IDREF:          cout << "IDREF";       break;
  396.     case DatatypeValidator::ENTITY:         cout << "ENTITY";      break;
  397.     case DatatypeValidator::NOTATION:       cout << "NOTATION";    break;
  398.     case DatatypeValidator::List:           cout << "List";        break;
  399.     case DatatypeValidator::Union:          cout << "Union";       break;
  400.     case DatatypeValidator::AnySimpleType:  cout << "AnySimpleType"; break;
  401.     }
  402.     cout << "n";
  403.     // Facets
  404. RefHashTableOf<KVStringPair>* facets = dtValidator->getFacets();
  405.     if( facets )
  406.     {
  407.         RefHashTableOfEnumerator<KVStringPair> enumFacets(facets);
  408.         if( enumFacets.hasMoreElements() )
  409.         {
  410.             cout << "Facets:ttn";
  411.         }
  412.         while(enumFacets.hasMoreElements())
  413.         {
  414.             // Element's properties
  415.             const KVStringPair& curPair = enumFacets.nextElement();
  416.             cout << "t" << StrX( curPair.getKey() )    << "="
  417.                          << StrX( curPair.getValue() )  << "n";
  418.         }
  419.     }
  420. }
  421. void processContentSpecNode( const ContentSpecNode* cSpecNode, bool margin )
  422. {
  423.     if( !cSpecNode )
  424.     {
  425.         return;
  426.     }
  427.     if( margin )
  428.     {
  429.         cout << "t";
  430.     }
  431.     cout << "ContentType:t";
  432.     switch( cSpecNode->getType() )
  433.     {
  434.         case ContentSpecNode::Leaf:             cout << "Leaf";           break;
  435.         case ContentSpecNode::ZeroOrOne:        cout << "ZeroOrOne";      break;
  436.         case ContentSpecNode::ZeroOrMore:       cout << "ZeroOrMore";     break;
  437.         case ContentSpecNode::OneOrMore:        cout << "OneOrMore";      break;
  438.         case ContentSpecNode::Choice:           cout << "Choice";         break;
  439.         case ContentSpecNode::Sequence:         cout << "Sequence";       break;
  440. case ContentSpecNode::All:              cout << "All";            break;
  441.         case ContentSpecNode::Any:              cout << "Any";            break;
  442.         case ContentSpecNode::Any_Other:        cout << "Any_Other";      break;
  443.         case ContentSpecNode::Any_NS:           cout << "Any_NS";         break;
  444.         case ContentSpecNode::Any_Lax:          cout << "Any_Lax";        break;
  445.         case ContentSpecNode::Any_Other_Lax:    cout << "Any_Other_Lax";  break;
  446.         case ContentSpecNode::Any_NS_Lax:       cout << "Any_NS_Lax";     break;
  447.         case ContentSpecNode::Any_Skip:         cout << "Any_Skip";       break;
  448.         case ContentSpecNode::Any_Other_Skip:   cout << "Any_Other_Skip"; break;
  449.         case ContentSpecNode::Any_NS_Skip:      cout << "Any_NS_Skip";    break;
  450.         case ContentSpecNode::UnknownType:      cout << "UnknownType";    break;
  451.     }
  452.     cout << "n";
  453. }