<!-- This comment will put IE 6, 7 and 8 in quirks mode --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>wsdlpull: /builddir/build/BUILD/wsdlpull-1.23/src/schemaparser/SchemaParser.cpp Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javaScript" src="search/search.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body onload='searchBox.OnSelectItem(0);'> <!-- Generated by Doxygen 1.6.2-20100208 --> <script type="text/javascript"><!-- var searchBox = new SearchBox("searchBox", "search",false,'Search'); --></script> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> <li> <div id="MSearchBox" class="MSearchBoxInactive"> <img id="MSearchSelect" src="search/search.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/> <input type="text" id="MSearchField" value="Search" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/> <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> </div> </li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul> </div> <div class="navpath"><a class="el" href="dir_02f058d422e7266632662d1436e7c90d.html">src</a> » <a class="el" href="dir_aa09c601595277e3f572f9f53a7da262.html">schemaparser</a> </div> </div> <div class="contents"> <h1>SchemaParser.cpp</h1><a href="SchemaParser_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* </span> <a name="l00002"></a>00002 <span class="comment"> * wsdlpull - A C++ parser for WSDL (Web services description language)</span> <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2005-2007 Vivek Krishna</span> <a name="l00004"></a>00004 <span class="comment"> *</span> <a name="l00005"></a>00005 <span class="comment"> * This library is free software; you can redistribute it and/or</span> <a name="l00006"></a>00006 <span class="comment"> * modify it under the terms of the GNU Library General Public</span> <a name="l00007"></a>00007 <span class="comment"> * License as published by the Free Software Foundation; either</span> <a name="l00008"></a>00008 <span class="comment"> * version 2 of the License, or (at your option) any later version.</span> <a name="l00009"></a>00009 <span class="comment"> * This library is distributed in the hope that it will be useful,</span> <a name="l00010"></a>00010 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00011"></a>00011 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span> <a name="l00012"></a>00012 <span class="comment"> * Library General Public License for more details.</span> <a name="l00013"></a>00013 <span class="comment"> *</span> <a name="l00014"></a>00014 <span class="comment"> * You should have received a copy of the GNU Library General Public</span> <a name="l00015"></a>00015 <span class="comment"> * License along with this library; if not, write to the Free</span> <a name="l00016"></a>00016 <span class="comment"> * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</span> <a name="l00017"></a>00017 <span class="comment"> *</span> <a name="l00018"></a>00018 <span class="comment"> *</span> <a name="l00019"></a>00019 <span class="comment"> */</span> <a name="l00020"></a>00020 <a name="l00021"></a>00021 <span class="preprocessor">#include "<a class="code" href="SchemaParser_8h.html">schemaparser/SchemaParser.h</a>"</span> <a name="l00022"></a>00022 <a name="l00023"></a>00023 <span class="preprocessor">#ifndef _WIN32</span> <a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="ConfigFile_8h.html">xmlpull/ConfigFile.h</a>"</span> <a name="l00025"></a>00025 <span class="preprocessor">#endif</span> <a name="l00026"></a>00026 <span class="preprocessor"></span> <a name="l00027"></a>00027 <span class="comment">//</span> <a name="l00028"></a>00028 <span class="preprocessor">#include <climits></span> <a name="l00029"></a>00029 <a name="l00030"></a>00030 <span class="keyword">namespace </span>Schema { <a name="l00031"></a>00031 <span class="keyword">using namespace </span>std; <a name="l00032"></a><a class="code" href="classSchema_1_1SchemaParser.html#ac0e2c65eebd75fb3a5f36dc884fa6083">00032</a> <a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">SchemaParser::SchemaParser</a>(<a class="code" href="classXmlPullParser.html">XmlPullParser</a> * parser, <a name="l00033"></a>00033 std::string tns, <a name="l00034"></a>00034 std::ostream & log, <a name="l00035"></a>00035 <span class="keyword">const</span> std::string & s) <a name="l00036"></a>00036 :tnsUri_(tns), <a name="l00037"></a>00037 xParser_(parser), <a name="l00038"></a>00038 elementQualified_ (false), <a name="l00039"></a>00039 attributeQualified_ (false), <a name="l00040"></a>00040 deleteXmlParser_(false), <a name="l00041"></a>00041 resolveFwdRefs_(true), <a name="l00042"></a>00042 level_(1), <a name="l00043"></a>00043 logFile_(log), <a name="l00044"></a>00044 confPath_(s) <a name="l00045"></a>00045 { <a name="l00046"></a>00046 init(); <a name="l00047"></a>00047 } <a name="l00048"></a>00048 <a name="l00049"></a><a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">00049</a> <a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">SchemaParser::SchemaParser</a>(<span class="keyword">const</span> std::string &Uri, <a name="l00050"></a>00050 std::string tns , <a name="l00051"></a>00051 std::ostream & log , <a name="l00052"></a>00052 <span class="keyword">const</span> std::string & s) <a name="l00053"></a>00053 :tnsUri_(tns), <a name="l00054"></a>00054 xParser_(0), <a name="l00055"></a>00055 elementQualified_ (false), <a name="l00056"></a>00056 attributeQualified_ (false), <a name="l00057"></a>00057 deleteXmlParser_(false), <a name="l00058"></a>00058 resolveFwdRefs_(true), <a name="l00059"></a>00059 level_(1), <a name="l00060"></a>00060 logFile_(log), <a name="l00061"></a>00061 confPath_(s) <a name="l00062"></a>00062 { <a name="l00063"></a>00063 <span class="keywordflow">if</span>(<a class="code" href="namespaceXmlUtils.html#a49cb0c0850b4a22b1fe0d5efd7553b01">XmlUtils::fetchUri</a>(Uri,fname_)) <a name="l00064"></a>00064 { <a name="l00065"></a>00065 xmlStream_.open(fname_.c_str()); <a name="l00066"></a>00066 xParser_ = <span class="keyword">new</span> <a class="code" href="classXmlPullParser.html">XmlPullParser</a>(xmlStream_); <a name="l00067"></a>00067 xParser_-><a class="code" href="classXmlPullParser.html#afd20dea242da6a493321050f24230b54">setFeature</a>(<a class="code" href="XmlPullParser_8h.html#ada32f6169a51300722b9b7dd38fa4032">FEATURE_PROCESS_NAMESPACES</a>, <span class="keyword">true</span>); <a name="l00068"></a>00068 xParser_-><a class="code" href="classXmlPullParser.html#a7b14708ef982d48b41009380146f523a">require</a>(<a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9a40df5e7fdb1a29f88425ef3eb8c1fa">XmlPullParser::START_DOCUMENT</a>, <span class="stringliteral">""</span>, <span class="stringliteral">""</span>); <a name="l00069"></a>00069 <span class="keywordflow">while</span> (!xmlStream_.fail() && xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a7857338db3efb0bcd468b06fe346076f">END_DOCUMENT</a>) <a name="l00070"></a>00070 { <a name="l00071"></a>00071 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00072"></a>00072 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a> && <a name="l00073"></a>00073 xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"schema"</span>) <a name="l00074"></a>00074 { <a name="l00075"></a>00075 deleteXmlParser_=<span class="keyword">true</span>; <a name="l00076"></a>00076 tnsUri_=tns; <a name="l00077"></a>00077 <span class="keywordflow">break</span>; <a name="l00078"></a>00078 } <a name="l00079"></a>00079 } <a name="l00080"></a>00080 <a name="l00081"></a>00081 } <a name="l00082"></a>00082 <span class="keywordflow">if</span>(!deleteXmlParser_) <span class="comment">//something wron while opening the schema file</span> <a name="l00083"></a>00083 { <a name="l00084"></a>00084 <span class="keyword">delete</span> xParser_; <a name="l00085"></a>00085 xParser_=0; <a name="l00086"></a>00086 } <a name="l00087"></a>00087 <a name="l00088"></a>00088 init(); <a name="l00089"></a>00089 uri_ = Uri.substr(0,Uri.rfind(<span class="charliteral">'/'</span>) + 1); <a name="l00090"></a>00090 } <a name="l00091"></a>00091 <a name="l00092"></a>00092 <span class="keywordtype">void</span> <a name="l00093"></a>00093 SchemaParser::init() <a name="l00094"></a>00094 { <a name="l00095"></a>00095 lElems_.clear() ; <a name="l00096"></a>00096 lAttributes_.clear(); <a name="l00097"></a>00097 lAttributeGroups_.clear(); <a name="l00098"></a>00098 importedSchemas_.clear(); <a name="l00099"></a>00099 constraints_.clear(); <a name="l00100"></a>00100 <a name="l00101"></a>00101 <span class="keywordflow">if</span> (confPath_.empty()) { <a name="l00102"></a>00102 <span class="preprocessor">#if defined SCHEMADIR</span> <a name="l00103"></a>00103 <span class="preprocessor"></span> confPath_ = SCHEMADIR; <a name="l00104"></a>00104 <span class="preprocessor">#else</span> <a name="l00105"></a>00105 <span class="preprocessor"></span> confPath_ = <span class="stringliteral">"src/schemas"</span>; <a name="l00106"></a>00106 <span class="preprocessor">#endif</span> <a name="l00107"></a>00107 <span class="preprocessor"></span> } <a name="l00108"></a>00108 <a name="l00109"></a>00109 Element e(<span class="stringliteral">"schema"</span>, <a name="l00110"></a>00110 <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">SchemaUri</a>, <a name="l00111"></a>00111 <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">SchemaUri</a>, <a name="l00112"></a>00112 <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711da80431102c2c828dc1842e7f9a4ef62c1">Schema::XSD_SCHEMA</a>); <a name="l00113"></a>00113 lElems_.push_back(e); <a name="l00114"></a>00114 <a name="l00115"></a>00115 <a name="l00116"></a>00116 <a name="l00117"></a>00117 <span class="preprocessor">#ifdef LOGGING</span> <a name="l00118"></a>00118 <span class="preprocessor"></span> level_ = 2; <a name="l00119"></a>00119 <span class="preprocessor">#endif</span> <a name="l00120"></a>00120 <span class="preprocessor"></span>} <a name="l00121"></a>00121 <a name="l00122"></a><a class="code" href="classSchema_1_1SchemaParser.html#ab7300dc7ba47dfdab07cd7fccad384e9">00122</a> <a class="code" href="classSchema_1_1SchemaParser.html#ab7300dc7ba47dfdab07cd7fccad384e9">SchemaParser::~SchemaParser</a>() <a name="l00123"></a>00123 { <a name="l00124"></a>00124 <span class="comment">//clear the Types table</span> <a name="l00125"></a>00125 typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#aa6d93332463ed4bc266b2e844cc98fa5">clean</a>(); <a name="l00126"></a>00126 <span class="keywordflow">if</span>(deleteXmlParser_) { <a name="l00127"></a>00127 <a name="l00128"></a>00128 <span class="keyword">delete</span> xParser_; <a name="l00129"></a>00129 xmlStream_.close(); <a name="l00130"></a>00130 } <a name="l00131"></a>00131 <a name="l00132"></a>00132 <span class="keywordflow">for</span> (ConstraintList::iterator ci=constraints_.begin(); <a name="l00133"></a>00133 ci != constraints_.end(); <a name="l00134"></a>00134 ci++) <a name="l00135"></a>00135 <span class="keyword">delete</span> *ci; <a name="l00136"></a>00136 <span class="keywordflow">for</span> (AttributeGroupList::iterator agi = lAttributeGroups_.begin(); <a name="l00137"></a>00137 agi != lAttributeGroups_.end(); <a name="l00138"></a>00138 agi++) <a name="l00139"></a>00139 <span class="keyword">delete</span> *agi; <a name="l00140"></a>00140 } <a name="l00141"></a>00141 <a name="l00142"></a>00142 <a name="l00143"></a>00143 <span class="comment">/*</span> <a name="l00144"></a>00144 <span class="comment"> * Parses an schema definition.</span> <a name="l00145"></a>00145 <span class="comment"> * This is the main entry method for the schema parser</span> <a name="l00146"></a>00146 <span class="comment"> */</span> <a name="l00147"></a>00147 <span class="keywordtype">bool</span> <a name="l00148"></a><a class="code" href="classSchema_1_1SchemaParser.html#a6f1dddf50bcb4dec24df5334971400c0">00148</a> <a class="code" href="classSchema_1_1SchemaParser.html#a6f1dddf50bcb4dec24df5334971400c0">SchemaParser::parseSchemaTag</a>() <a name="l00149"></a>00149 { <a name="l00150"></a>00150 <span class="keywordtype">int</span> i = 0; <a name="l00151"></a>00151 <span class="keywordflow">try</span> { <a name="l00152"></a>00152 <span class="keywordflow">if</span>(!xParser_) <a name="l00153"></a>00153 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00154"></a>00154 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l00155"></a>00155 xParser_-><a class="code" href="classXmlPullParser.html#a41f3309e5232870695111df156e4a064">next</a>(); <a name="l00156"></a>00156 xParser_-><a class="code" href="classXmlPullParser.html#a7b14708ef982d48b41009380146f523a">require</a>(xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>, <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>, <span class="stringliteral">"schema"</span>); <a name="l00157"></a>00157 <span class="keywordtype">int</span> attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00158"></a>00158 <a name="l00159"></a>00159 <span class="comment">//parse the schema tag's attributes</span> <a name="l00160"></a>00160 <span class="keywordflow">for</span> (i = 0; i < attcnt; i++) { <a name="l00161"></a>00161 std::string attName = xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i); <a name="l00162"></a>00162 <span class="keywordflow">if</span> (<span class="stringliteral">"targetNamespace"</span> == attName) <a name="l00163"></a>00163 <span class="comment">//store the tns URI</span> <a name="l00164"></a>00164 tnsUri_ = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00165"></a>00165 <span class="keywordflow">if</span> (<span class="stringliteral">"version"</span> == attName) <a name="l00166"></a>00166 version_ = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00167"></a>00167 <span class="keywordflow">if</span> (<span class="stringliteral">"elementFormDefault"</span> == attName){ <a name="l00168"></a>00168 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) == <span class="stringliteral">"unqualified"</span>) <a name="l00169"></a>00169 elementQualified_ = <span class="keyword">false</span>; <a name="l00170"></a>00170 <a name="l00171"></a>00171 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) == <span class="stringliteral">"qualified"</span>) <a name="l00172"></a>00172 elementQualified_ = <span class="keyword">true</span>; <a name="l00173"></a>00173 } <a name="l00174"></a>00174 <span class="keywordflow">if</span> (<span class="stringliteral">"attributeFormDefault"</span> == attName) { <a name="l00175"></a>00175 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) == <span class="stringliteral">"unqualified"</span>) <a name="l00176"></a>00176 attributeQualified_ = <span class="keyword">false</span>; <a name="l00177"></a>00177 <a name="l00178"></a>00178 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) == <span class="stringliteral">"qualified"</span>) <a name="l00179"></a>00179 attributeQualified_ = <span class="keyword">true</span>; <a name="l00180"></a>00180 } <a name="l00181"></a>00181 } <a name="l00182"></a>00182 <a name="l00183"></a>00183 <span class="keywordflow">for</span> (i = xParser_-><a class="code" href="classXmlPullParser.html#ae3a063b82589ddf483a3f28ca997b38d">getNamespaceCount</a>(xParser_-><a class="code" href="classXmlPullParser.html#a6457f790d1b47cb8b236834d9916a5ff">getDepth</a>()) - 1; <a name="l00184"></a>00184 i > xParser_-><a class="code" href="classXmlPullParser.html#ae3a063b82589ddf483a3f28ca997b38d">getNamespaceCount</a>(xParser_-><a class="code" href="classXmlPullParser.html#a6457f790d1b47cb8b236834d9916a5ff">getDepth</a>() - 1) - 1; i--) <a name="l00185"></a>00185 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#ad4f2b72e8fb308dddafe8330aaaad3ab">getNamespaceUri</a>(i) == tnsUri_) <a name="l00186"></a>00186 tnsPrefix_ = xParser_-><a class="code" href="classXmlPullParser.html#af5c4739b6934d81d199a7a825b7c2442">getNamespacePrefix</a>(i); <a name="l00187"></a>00187 typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a7517b44dc9248df4104b14ac68abf3ec">setTargetNamespace</a>(tnsUri_); <a name="l00188"></a>00188 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00189"></a>00189 <a name="l00190"></a>00190 <span class="keywordflow">return</span> parseSchema(); <a name="l00191"></a>00191 } <span class="keywordflow">catch</span> (<a class="code" href="classXmlPullParserException.html">XmlPullParserException</a> xpe){ <a name="l00192"></a>00192 <a name="l00193"></a>00193 logFile_ <<<span class="stringliteral">"Error parsing schema for namespace "</span><<tnsUri_<<std::endl; <a name="l00194"></a>00194 logFile_ << xpe.<a class="code" href="classXmlPullParserException.html#a5e678f53a8e21e41646f669897bf901c">description</a> << <span class="stringliteral">" at "</span> <a name="l00195"></a>00195 << xpe.<a class="code" href="classXmlPullParserException.html#ab91ff9c9c31ddd56f13c7ebe1176dad4">line</a> << <span class="stringliteral">":"</span> << xpe.<a class="code" href="classXmlPullParserException.html#ad31a87cfe1fb235c47ce203c868f9063">col</a> <a name="l00196"></a>00196 << std::endl; <a name="l00197"></a>00197 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00198"></a>00198 } <a name="l00199"></a>00199 <span class="keywordflow">catch</span>(<a class="code" href="classSchema_1_1SchemaParserException.html">SchemaParserException</a> spe) { <a name="l00200"></a>00200 <a name="l00201"></a>00201 spe.<a class="code" href="classSchema_1_1SchemaParserException.html#a962a143b653375a0149bfcd2e373d7e7">line</a> = xParser_-><a class="code" href="classXmlPullParser.html#a85f448552915586aa04c44a7d16e8e48">getLineNumber</a>(); <a name="l00202"></a>00202 spe.<a class="code" href="classSchema_1_1SchemaParserException.html#acba399209c103bd6fda937a6e0e4dff8">col</a> = xParser_-><a class="code" href="classXmlPullParser.html#a81379b1abbe24acb76739836c51563b1">getColumnNumber</a>(); <a name="l00203"></a>00203 <a name="l00204"></a>00204 logFile_ << spe.<a class="code" href="classSchema_1_1SchemaParserException.html#abad96177c969c678702645a9a792fe34">description</a> << <span class="stringliteral">" at "</span> <a name="l00205"></a>00205 << spe.<a class="code" href="classSchema_1_1SchemaParserException.html#a962a143b653375a0149bfcd2e373d7e7">line</a> << <span class="stringliteral">":"</span> << spe.<a class="code" href="classSchema_1_1SchemaParserException.html#acba399209c103bd6fda937a6e0e4dff8">col</a> <a name="l00206"></a>00206 << std::endl; <a name="l00207"></a>00207 <a name="l00208"></a>00208 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00209"></a>00209 } <a name="l00210"></a>00210 } <a name="l00211"></a>00211 <a name="l00212"></a>00212 <span class="comment">//this function handles the schema</span> <a name="l00213"></a>00213 <span class="keywordtype">bool</span> <a name="l00214"></a>00214 SchemaParser::parseSchema(std::string tag) <a name="l00215"></a>00215 { <a name="l00216"></a>00216 <span class="keywordflow">try</span> <a name="l00217"></a>00217 { <a name="l00218"></a>00218 <span class="keywordflow">do</span> <a name="l00219"></a>00219 { <a name="l00220"></a>00220 <a name="l00221"></a>00221 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l00222"></a>00222 { <a name="l00223"></a>00223 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == tag) <a name="l00224"></a>00224 <span class="keywordflow">break</span>; <a name="l00225"></a>00225 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l00226"></a>00226 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00227"></a>00227 } <a name="l00228"></a>00228 <a name="l00229"></a>00229 <span class="comment">/*</span> <a name="l00230"></a>00230 <span class="comment"> This is the main loop</span> <a name="l00231"></a>00231 <span class="comment"> Depending on the tag encountered call the appropriate routines</span> <a name="l00232"></a>00232 <span class="comment"> Schema elements visible at this level</span> <a name="l00233"></a>00233 <span class="comment"> 1. Global Element declarations</span> <a name="l00234"></a>00234 <span class="comment"> 2. Global attribute declarations</span> <a name="l00235"></a>00235 <span class="comment"> 3. Complex type and Simple type declarations</span> <a name="l00236"></a>00236 <span class="comment"></span> <a name="l00237"></a>00237 <span class="comment"> */</span> <a name="l00238"></a>00238 std::string elemName = xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00239"></a>00239 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"element"</span>) { <a name="l00240"></a>00240 <span class="keywordtype">bool</span> fwd; <a name="l00241"></a>00241 Element e = parseElement(fwd); <a name="l00242"></a>00242 lElems_.push_back(e); <a name="l00243"></a>00243 } <a name="l00244"></a>00244 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"complexType"</span>) <a name="l00245"></a>00245 { <a name="l00246"></a>00246 XSDType *t = parseComplexType(); <a name="l00247"></a>00247 typesTable_.addType(t); <a name="l00248"></a>00248 } <a name="l00249"></a>00249 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"simpleType"</span>) <a name="l00250"></a>00250 { <a name="l00251"></a>00251 XSDType *t = parseSimpleType(); <a name="l00252"></a>00252 typesTable_.addType(t); <a name="l00253"></a>00253 } <a name="l00254"></a>00254 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"attribute"</span>) { <a name="l00255"></a>00255 <span class="keywordtype">bool</span> fwd; <a name="l00256"></a>00256 lAttributes_.push_back(parseAttribute(fwd)); <a name="l00257"></a>00257 } <a name="l00258"></a>00258 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"annotation"</span>){ <a name="l00259"></a>00259 parseAnnotation(); <a name="l00260"></a>00260 } <a name="l00261"></a>00261 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"import"</span>) { <a name="l00262"></a>00262 parseImport(); <a name="l00263"></a>00263 } <a name="l00264"></a>00264 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName==<span class="stringliteral">"include"</span>){ <a name="l00265"></a>00265 parseInclude(); <a name="l00266"></a>00266 } <a name="l00267"></a>00267 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"attributeGroup"</span>) { <a name="l00268"></a>00268 AttributeGroup* ag = parseAttributeGroup(); <a name="l00269"></a>00269 <span class="keywordflow">if</span> (ag) <a name="l00270"></a>00270 lAttributeGroups_.push_back(ag); <a name="l00271"></a>00271 <a name="l00272"></a>00272 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"group"</span>) { <a name="l00273"></a>00273 <a name="l00274"></a>00274 lGroups_.push_back(parseGroup()); <a name="l00275"></a>00275 Group & g=lGroups_.back(); <a name="l00276"></a>00276 <span class="comment">//make this grp the owner of the content model</span> <a name="l00277"></a>00277 g.setContents(g.getContents(),<span class="keyword">false</span>); <a name="l00278"></a>00278 } <a name="l00279"></a>00279 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"key"</span>) { <a name="l00280"></a>00280 <a name="l00281"></a>00281 constraints_.push_back(parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca9bdd1ec9b56fc15df2af7358360ec7c2">Schema::Key</a>)); <a name="l00282"></a>00282 } <a name="l00283"></a>00283 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"keyref"</span>) { <a name="l00284"></a>00284 constraints_.push_back(parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca1fbfc9ad564f0975cf903b923e243b8f">Schema::Keyref</a>)); <a name="l00285"></a>00285 } <a name="l00286"></a>00286 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"unique"</span>) { <a name="l00287"></a>00287 constraints_.push_back(parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3cafe0dfe827b7a23a72e2099a8621cacdc">Schema::Unique</a>)); <a name="l00288"></a>00288 }<span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName==<span class="stringliteral">"redefine"</span>){ <a name="l00289"></a>00289 parseRedefine(); <a name="l00290"></a>00290 } <a name="l00291"></a>00291 <span class="keywordflow">else</span> { <a name="l00292"></a>00292 error(<span class="stringliteral">"Unknown element "</span>+ elemName,1); <a name="l00293"></a>00293 <span class="keywordflow">break</span>; <a name="l00294"></a>00294 } <a name="l00295"></a>00295 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00296"></a>00296 } <a name="l00297"></a>00297 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00298"></a>00298 <span class="keywordflow">if</span> ((importedSchemas_.size() == 0) && <a name="l00299"></a>00299 typesTable_.detectUndefinedTypes()){ <a name="l00300"></a>00300 <a name="l00301"></a>00301 typesTable_.printUndefinedTypes(logFile_);logFile_.flush(); <a name="l00302"></a>00302 error(<span class="stringliteral">"Undefined Types in namespace "</span>+tnsUri_); <a name="l00303"></a>00303 } <a name="l00304"></a>00304 <span class="keywordflow">if</span>(shouldResolve()) <a name="l00305"></a>00305 { <a name="l00306"></a>00306 <a name="l00307"></a>00307 resolveForwardElementRefs(); <a name="l00308"></a>00308 resolveForwardAttributeRefs(); <a name="l00309"></a>00309 } <a name="l00310"></a>00310 <a name="l00311"></a>00311 } <a name="l00312"></a>00312 <span class="keywordflow">catch</span>(SchemaParserException spe) <a name="l00313"></a>00313 { <a name="l00314"></a>00314 spe.line = xParser_-><a class="code" href="classXmlPullParser.html#a85f448552915586aa04c44a7d16e8e48">getLineNumber</a>(); <a name="l00315"></a>00315 spe.col = xParser_-><a class="code" href="classXmlPullParser.html#a81379b1abbe24acb76739836c51563b1">getColumnNumber</a>(); <a name="l00316"></a>00316 <a name="l00317"></a>00317 logFile_ << spe.description << <span class="stringliteral">" at "</span> <a name="l00318"></a>00318 << spe.line << <span class="stringliteral">":"</span> << spe.col <a name="l00319"></a>00319 << std::endl; <a name="l00320"></a>00320 <a name="l00321"></a>00321 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00322"></a>00322 } <a name="l00323"></a>00323 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00324"></a>00324 } <a name="l00325"></a>00325 <a name="l00326"></a>00326 <a name="l00327"></a>00327 <span class="keywordtype">void</span> SchemaParser::parseAnnotation() <a name="l00328"></a>00328 { <a name="l00329"></a>00329 <a name="l00330"></a>00330 <span class="keywordflow">do</span> <a name="l00331"></a>00331 { <a name="l00332"></a>00332 xParser_-><a class="code" href="classXmlPullParser.html#a74c8bdd7edc2f341a8ed4eb8fed7c950">nextToken</a>(); <a name="l00333"></a>00333 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a> <a name="l00334"></a>00334 && xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l00335"></a>00335 <span class="keywordflow">break</span>; <a name="l00336"></a>00336 } <a name="l00337"></a>00337 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00338"></a>00338 } <a name="l00339"></a>00339 <a name="l00340"></a>00340 <a name="l00341"></a>00341 ComplexType * <a name="l00342"></a>00342 SchemaParser::parseComplexType() <a name="l00343"></a>00343 { <a name="l00344"></a>00344 ComplexType *newType = <span class="keyword">new</span> ComplexType(tnsUri_); <a name="l00345"></a>00345 <span class="keywordtype">int</span> attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00346"></a>00346 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l00347"></a>00347 { <a name="l00348"></a>00348 <span class="keywordflow">if</span> (<span class="stringliteral">"name"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l00349"></a>00349 newType->setName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l00350"></a>00350 <a name="l00351"></a>00351 <span class="keywordflow">if</span> (<span class="stringliteral">"mixed"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i) && <a name="l00352"></a>00352 (xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i).empty() || <a name="l00353"></a>00353 xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)==<span class="stringliteral">"true"</span>)) <a name="l00354"></a>00354 <a name="l00355"></a>00355 newType->setContentModel(<a class="code" href="namespaceSchema.html#a84b8523395bb986be4b87ff834308103a373040414bed3a7d96ec599e71e75ff7">Schema::Mixed</a>); <a name="l00356"></a>00356 } <a name="l00357"></a>00357 <a name="l00358"></a>00358 <a name="l00359"></a>00359 <span class="keywordflow">do</span> <a name="l00360"></a>00360 { <a name="l00361"></a>00361 <span class="comment">//begin parsing the complex type's children</span> <a name="l00362"></a>00362 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00363"></a>00363 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l00364"></a>00364 { <a name="l00365"></a>00365 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"complexType"</span>) <a name="l00366"></a>00366 <span class="keywordflow">break</span>; <a name="l00367"></a>00367 <a name="l00368"></a>00368 <span class="comment">//if an end tag is seen proceed till next start tag</span> <a name="l00369"></a>00369 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l00370"></a>00370 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00371"></a>00371 } <a name="l00372"></a>00372 std::string elemName = xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00373"></a>00373 <a name="l00374"></a>00374 <a name="l00375"></a>00375 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"all"</span>){ <a name="l00376"></a>00376 ContentModel * cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cad72664c314f8671075e550b614c63990">Schema::All</a>); <a name="l00377"></a>00377 newType->setContents(cm); <a name="l00378"></a>00378 parseContent(cm); <a name="l00379"></a>00379 } <a name="l00380"></a>00380 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"sequence"</span>){ <a name="l00381"></a>00381 ContentModel * cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l00382"></a>00382 newType->setContents(cm); <a name="l00383"></a>00383 parseContent(cm); <a name="l00384"></a>00384 } <a name="l00385"></a>00385 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"choice"</span>){ <a name="l00386"></a>00386 ContentModel * cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cab1b96c47de244209c2c1ed736cb08869">Schema::Choice</a>); <a name="l00387"></a>00387 newType->setContents(cm); <a name="l00388"></a>00388 parseContent(cm); <a name="l00389"></a>00389 } <a name="l00390"></a>00390 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"attribute"</span>) { <a name="l00391"></a>00391 <span class="keywordtype">bool</span> f=<span class="keyword">false</span>; <a name="l00392"></a>00392 Attribute a=parseAttribute(f); <a name="l00393"></a>00393 newType->addAttribute(a,f); <a name="l00394"></a>00394 }<span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName==<span class="stringliteral">"attributeGroup"</span>){ <a name="l00395"></a>00395 parseAttributeGroup(newType); <a name="l00396"></a>00396 } <a name="l00397"></a>00397 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName==<span class="stringliteral">"group"</span>){ <a name="l00398"></a>00398 <span class="comment">//TODO</span> <a name="l00399"></a>00399 ContentModel* cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l00400"></a>00400 newType->setContents(cm); <a name="l00401"></a>00401 parseGroup(cm); <a name="l00402"></a>00402 } <a name="l00403"></a>00403 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"anyAttribute"</span>) <a name="l00404"></a>00404 addAnyAttribute(newType); <a name="l00405"></a>00405 <a name="l00406"></a>00406 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"complexContent"</span>) <a name="l00407"></a>00407 parseComplexContent(newType); <a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"simpleContent"</span>) <a name="l00410"></a>00410 parseSimpleContent(newType); <a name="l00411"></a>00411 <a name="l00412"></a>00412 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l00413"></a>00413 parseAnnotation(); <a name="l00414"></a>00414 <a name="l00415"></a>00415 <span class="keywordflow">else</span> <a name="l00416"></a>00416 error(<span class="stringliteral">"Unexpected tag: '"</span>+elemName+<span class="stringliteral">"' in "</span>+newType->getName() ); <a name="l00417"></a>00417 } <a name="l00418"></a>00418 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00419"></a>00419 makeListFromSoapArray(newType); <a name="l00420"></a>00420 <span class="keywordflow">return</span> newType; <a name="l00421"></a>00421 } <a name="l00422"></a>00422 <a name="l00423"></a>00423 AttributeGroup* <a name="l00424"></a>00424 SchemaParser::parseAttributeGroup(ComplexType* cType) <a name="l00425"></a>00425 { <a name="l00426"></a>00426 std::string name,ref; <a name="l00427"></a>00427 ref = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"ref"</span>); <a name="l00428"></a>00428 <span class="keywordflow">if</span> (!ref.empty()) <a name="l00429"></a>00429 { <a name="l00430"></a>00430 <a class="code" href="classQname.html">Qname</a> agRef(ref); <a name="l00431"></a>00431 AttributeGroup *ag= <a class="code" href="classSchema_1_1SchemaParser.html#af7b03dfae9c493636019f1851a57e6f5">getAttributeGroup</a>(agRef); <a name="l00432"></a>00432 <span class="keywordflow">if</span>(cType && ag){ <a name="l00433"></a>00433 <a name="l00434"></a>00434 <span class="keywordflow">for</span>(list<Attribute>::iterator ai= ag->begin(); <a name="l00435"></a>00435 ai!=ag->end(); <a name="l00436"></a>00436 ai++) <a name="l00437"></a>00437 cType->addAttribute(*ai); <a name="l00438"></a>00438 } <a name="l00439"></a>00439 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cType){ <a name="l00440"></a>00440 cType->addAttributeGroupName(ref); <a name="l00441"></a>00441 } <a name="l00442"></a>00442 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00443"></a>00443 <span class="keywordflow">return</span> ag; <a name="l00444"></a>00444 } <a name="l00445"></a>00445 <a name="l00446"></a>00446 name = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"name"</span>); <a name="l00447"></a>00447 AttributeGroup *ag = <span class="keyword">new</span> AttributeGroup(name); <a name="l00448"></a>00448 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00449"></a>00449 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l00450"></a>00450 { <a name="l00451"></a>00451 parseAnnotation(); <a name="l00452"></a>00452 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00453"></a>00453 } <a name="l00454"></a>00454 std::string elemName=xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00455"></a>00455 <span class="keywordflow">while</span> (!((xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) && <a name="l00456"></a>00456 (elemName == <span class="stringliteral">"attributeGroup"</span>))){ <a name="l00457"></a>00457 <a name="l00458"></a>00458 <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"attribute"</span>){ <a name="l00459"></a>00459 <span class="keywordtype">bool</span> fwd; <a name="l00460"></a>00460 ag->addAttribute(parseAttribute(fwd)); <a name="l00461"></a>00461 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"attributeGroup"</span>){ <a name="l00462"></a>00462 AttributeGroup* ag1=parseAttributeGroup(); <a name="l00463"></a>00463 <span class="keywordflow">for</span>(list<Attribute>::iterator ai= ag1->begin(); <a name="l00464"></a>00464 ai!=ag1->end(); <a name="l00465"></a>00465 ai++) <a name="l00466"></a>00466 ag->addAttribute(*ai); <a name="l00467"></a>00467 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"anyAttribute"</span>){ <a name="l00468"></a>00468 ag->addAttribute(addAnyAttribute(cType)); <a name="l00469"></a>00469 } <a name="l00470"></a>00470 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00471"></a>00471 elemName=xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00472"></a>00472 } <a name="l00473"></a>00473 <a name="l00474"></a>00474 <span class="keywordflow">if</span>(cType){ <a name="l00475"></a>00475 <a name="l00476"></a>00476 <span class="keywordflow">for</span>(list<Attribute>::iterator ai= ag->begin(); <a name="l00477"></a>00477 ai!=ag->end(); <a name="l00478"></a>00478 ai++) <a name="l00479"></a>00479 cType->addAttribute(*ai); <a name="l00480"></a>00480 <span class="keyword">delete</span> ag;<span class="comment">//dont store anonymous attribute groups</span> <a name="l00481"></a>00481 ag = 0; <a name="l00482"></a>00482 } <a name="l00483"></a>00483 <span class="keywordflow">return</span> ag; <a name="l00484"></a>00484 } <a name="l00485"></a>00485 <a name="l00486"></a>00486 Group <a name="l00487"></a>00487 SchemaParser::parseGroup(ContentModel* c) <a name="l00488"></a>00488 { <a name="l00489"></a>00489 <span class="keywordtype">int</span> minimum = 1, maximum = 1; <a name="l00490"></a>00490 std::string tmp, name,ref; <a name="l00491"></a>00491 <a name="l00492"></a>00492 tmp = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"minOccurs"</span>); <a name="l00493"></a>00493 <span class="keywordflow">if</span> (!tmp.empty()) <a name="l00494"></a>00494 minimum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(tmp); <a name="l00495"></a>00495 tmp = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"maxOccurs"</span>); <a name="l00496"></a>00496 <span class="keywordflow">if</span> (!tmp.empty()) { <a name="l00497"></a>00497 <span class="keywordflow">if</span> (<span class="stringliteral">"unbounded"</span> == tmp) <a name="l00498"></a>00498 maximum = <a class="code" href="Element_8h.html#af17df4d5d5bad0ea1d48fa796a91d4ce">UNBOUNDED</a>; <a name="l00499"></a>00499 <span class="keywordflow">else</span> <a name="l00500"></a>00500 maximum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(tmp); <a name="l00501"></a>00501 } <a name="l00502"></a>00502 ref = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"ref"</span>); <a name="l00503"></a>00503 <span class="keywordflow">if</span> (!ref.empty()) { <a name="l00504"></a>00504 <a name="l00505"></a>00505 <a class="code" href="classQname.html">Qname</a> gName(ref); <a name="l00506"></a>00506 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00507"></a>00507 Group* gRef=<a class="code" href="classSchema_1_1SchemaParser.html#a0ebc5538bb373dd99c04b3485462acfa">getGroup</a>(gName); <a name="l00508"></a>00508 <span class="keywordflow">if</span>(gRef){ <a name="l00509"></a>00509 Group g(*gRef); <a name="l00510"></a>00510 <span class="keywordflow">if</span>(c) <a name="l00511"></a>00511 c->addGroup(g,<span class="keyword">true</span>); <a name="l00512"></a>00512 <span class="keywordflow">return</span> g; <a name="l00513"></a>00513 } <a name="l00514"></a>00514 <span class="keywordflow">else</span>{ <a name="l00515"></a>00515 Group g(gName.getLocalName(),minimum,maximum); <a name="l00516"></a>00516 <span class="keywordflow">if</span>(c) <a name="l00517"></a>00517 c->addGroup(g,<span class="keyword">true</span>); <a name="l00518"></a>00518 <span class="keywordflow">return</span> g; <a name="l00519"></a>00519 } <a name="l00520"></a>00520 } <a name="l00521"></a>00521 <a name="l00522"></a>00522 name = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"name"</span>); <a name="l00523"></a>00523 Group g(name,minimum,maximum); <a name="l00524"></a>00524 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00525"></a>00525 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) { <a name="l00526"></a>00526 parseAnnotation(); <a name="l00527"></a>00527 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00528"></a>00528 } <a name="l00529"></a>00529 <a name="l00530"></a>00530 std::string elemName = xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00531"></a>00531 ContentModel * cm=0; <a name="l00532"></a>00532 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"all"</span>){ <a name="l00533"></a>00533 cm = <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cad72664c314f8671075e550b614c63990">Schema::All</a>); <a name="l00534"></a>00534 } <a name="l00535"></a>00535 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"sequence"</span>){ <a name="l00536"></a>00536 cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l00537"></a>00537 } <a name="l00538"></a>00538 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"choice"</span>){ <a name="l00539"></a>00539 cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cab1b96c47de244209c2c1ed736cb08869">Schema::Choice</a>); <a name="l00540"></a>00540 } <a name="l00541"></a>00541 g.setContents(cm,<span class="keyword">true</span>); <a name="l00542"></a>00542 parseContent(cm); <a name="l00543"></a>00543 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00544"></a>00544 <a name="l00545"></a>00545 <span class="keywordflow">if</span>(c) <a name="l00546"></a>00546 c->addGroup(g,<span class="keyword">false</span>); <a name="l00547"></a>00547 <span class="keywordflow">return</span> g; <a name="l00548"></a>00548 } <a name="l00549"></a>00549 <a name="l00550"></a>00550 <span class="keywordtype">void</span> <a name="l00551"></a>00551 SchemaParser::parseContent(ContentModel * cm) <a name="l00552"></a>00552 { <a name="l00553"></a>00553 <span class="keywordtype">int</span> minimum = 1, maximum = 1; <a name="l00554"></a>00554 std::string tmp; <a name="l00555"></a>00555 <a name="l00556"></a>00556 tmp = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"minOccurs"</span>); <a name="l00557"></a>00557 <span class="keywordflow">if</span> (!tmp.empty()) <a name="l00558"></a>00558 minimum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(tmp); <a name="l00559"></a>00559 tmp = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"maxOccurs"</span>); <a name="l00560"></a>00560 <span class="keywordflow">if</span> (!tmp.empty()) <a name="l00561"></a>00561 { <a name="l00562"></a>00562 <span class="keywordflow">if</span> (<span class="stringliteral">"unbounded"</span> == tmp) <a name="l00563"></a>00563 maximum = <a class="code" href="Element_8h.html#af17df4d5d5bad0ea1d48fa796a91d4ce">UNBOUNDED</a>; <a name="l00564"></a>00564 <span class="keywordflow">else</span> <a name="l00565"></a>00565 maximum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(tmp); <a name="l00566"></a>00566 } <a name="l00567"></a>00567 cm->setMin(minimum); <a name="l00568"></a>00568 cm->setMax(maximum); <a name="l00569"></a>00569 <a name="l00570"></a>00570 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00571"></a>00571 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l00572"></a>00572 { <a name="l00573"></a>00573 parseAnnotation(); <a name="l00574"></a>00574 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00575"></a>00575 } <a name="l00576"></a>00576 <a name="l00577"></a>00577 <span class="keywordflow">while</span> (!((xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) && <a name="l00578"></a>00578 (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"choice"</span> <a name="l00579"></a>00579 || xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"sequence"</span> <a name="l00580"></a>00580 || xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"all"</span>))) <a name="l00581"></a>00581 { <a name="l00582"></a>00582 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"element"</span>) { <a name="l00583"></a>00583 <span class="keywordtype">bool</span> f=<span class="keyword">false</span>; <a name="l00584"></a>00584 Element e =parseElement(f); <a name="l00585"></a>00585 cm->addElement(e); <a name="l00586"></a>00586 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(cm->getCompositor()!=<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cad72664c314f8671075e550b614c63990">Schema::All</a>){ <a name="l00587"></a>00587 <a name="l00588"></a>00588 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"any"</span>) <a name="l00589"></a>00589 addAny(cm); <a name="l00590"></a>00590 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"choice"</span>){ <a name="l00591"></a>00591 ContentModel * cmc= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cab1b96c47de244209c2c1ed736cb08869">Schema::Choice</a>); <a name="l00592"></a>00592 cm->addContentModel(cmc); <a name="l00593"></a>00593 parseContent(cmc); <a name="l00594"></a>00594 } <a name="l00595"></a>00595 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"sequence"</span>){ <a name="l00596"></a>00596 ContentModel * cms= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l00597"></a>00597 cm->addContentModel(cms); <a name="l00598"></a>00598 parseContent(cms); <a name="l00599"></a>00599 } <a name="l00600"></a>00600 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"group"</span>){ <a name="l00601"></a>00601 parseGroup(cm); <a name="l00602"></a>00602 } <a name="l00603"></a>00603 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) { <a name="l00604"></a>00604 parseAnnotation(); <a name="l00605"></a>00605 } <a name="l00606"></a>00606 <span class="keywordflow">else</span> <a name="l00607"></a>00607 error(<span class="stringliteral">"parseContent: Unexpected tag "</span>+xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>()); <a name="l00608"></a>00608 }<span class="keywordflow">else</span>{ <a name="l00609"></a>00609 <a name="l00610"></a>00610 error(<span class="stringliteral">"parseContent <all>:Syntax Error"</span>); <a name="l00611"></a>00611 } <a name="l00612"></a>00612 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00613"></a>00613 } <a name="l00614"></a>00614 } <a name="l00615"></a>00615 <a name="l00616"></a>00616 Element <a name="l00617"></a>00617 SchemaParser::parseElement(<span class="keywordtype">bool</span> & fwdRef) <a name="l00618"></a>00618 { <a name="l00619"></a>00619 std::string name, fixedVal, defaultVal, <a name="l00620"></a>00620 <span class="comment">// the namespace of the element is the</span> <a name="l00621"></a>00621 <span class="comment">// namespace of the sp that parsed it!</span> <a name="l00622"></a>00622 typeNs = tnsUri_,elemNs = tnsUri_; <a name="l00623"></a>00623 Constraint* c=0; <a name="l00624"></a>00624 <span class="keywordtype">int</span> type_id = 0, minimum = 1, maximum = 1, attcnt; <a name="l00625"></a>00625 <a class="code" href="classQname.html">Qname</a> refName; <a name="l00626"></a>00626 <span class="keywordtype">bool</span> qualified = <span class="keyword">false</span>,nill = <span class="keyword">false</span>; <a name="l00627"></a>00627 XSDType *elemType; <a name="l00628"></a>00628 fwdRef=<span class="keyword">false</span>; <a name="l00629"></a>00629 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00630"></a>00630 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l00631"></a>00631 { <a name="l00632"></a>00632 std::string attName = xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i); <a name="l00633"></a>00633 <span class="keywordflow">if</span> (<span class="stringliteral">"name"</span> == attName) <a name="l00634"></a>00634 name = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00635"></a>00635 <a name="l00636"></a>00636 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"type"</span> == attName) <a name="l00637"></a>00637 { <a name="l00638"></a>00638 <a class="code" href="classQname.html">Qname</a> typeName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l00639"></a>00639 <span class="keywordflow">if</span> (type_id > 0) <a name="l00640"></a>00640 error <a name="l00641"></a>00641 (<span class="stringliteral">"<element> : type and ref are mutually exclusive in element decl"</span>); <a name="l00642"></a>00642 typeName.setNamespace(typeNs=xParser_-><a class="code" href="classXmlPullParser.html#ab64f42eff37c0c049024c8267f0732e8">getNamespace</a>(typeName.getPrefix())); <a name="l00643"></a>00643 type_id = <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>); <a name="l00644"></a>00644 <span class="keywordflow">if</span> (type_id == 0) <a name="l00645"></a>00645 error(<span class="stringliteral">"<element>:Could not resolve type "</span> + <a name="l00646"></a>00646 typeName.getNamespace() + <span class="stringliteral">":"</span> + <a name="l00647"></a>00647 typeName.getLocalName(),0); <a name="l00648"></a>00648 } <a name="l00649"></a>00649 <a name="l00650"></a>00650 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"form"</span> == attName) <a name="l00651"></a>00651 { <a name="l00652"></a>00652 <span class="keywordflow">if</span> (<span class="stringliteral">"qualified"</span> == xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)) <a name="l00653"></a>00653 qualified = <span class="keyword">true</span>; <a name="l00654"></a>00654 <a name="l00655"></a>00655 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"unqualified"</span> == xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)) <a name="l00656"></a>00656 qualified = <span class="keyword">false</span>; <a name="l00657"></a>00657 <span class="keywordflow">else</span> <a name="l00658"></a>00658 error(<span class="stringliteral">"<element>:Invalid value for form in element "</span> + <a name="l00659"></a>00659 name,1); <a name="l00660"></a>00660 } <a name="l00661"></a>00661 <a name="l00662"></a>00662 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"ref"</span> == attName) <a name="l00663"></a>00663 { <a name="l00664"></a>00664 <span class="keywordflow">if</span> (!name.empty()) <a name="l00665"></a>00665 error <a name="l00666"></a>00666 (<span class="stringliteral">"<element>:name and ref are mutually exclusive in element decl"</span>); <a name="l00667"></a>00667 <span class="keywordflow">if</span> (type_id > 0) <a name="l00668"></a>00668 error <a name="l00669"></a>00669 (<span class="stringliteral">"<element>:type and ref are mutually exclusive in element decl"</span>); <a name="l00670"></a>00670 refName = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00671"></a>00671 refName.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-><a class="code" href="classXmlPullParser.html#ab64f42eff37c0c049024c8267f0732e8">getNamespace</a>(refName.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l00672"></a>00672 Element *e=0; <a name="l00673"></a>00673 elemNs = refName.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l00674"></a>00674 <a name="l00675"></a>00675 <span class="keywordflow">if</span>(refName.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()==tnsUri_){ <a name="l00676"></a>00676 <a name="l00677"></a>00677 e = <span class="keyword">const_cast<</span>Element*<span class="keyword">></span>(<a class="code" href="classSchema_1_1SchemaParser.html#aa11d8f9bf85870304ab35e387fd486b1">getElement</a>(refName)); <a name="l00678"></a>00678 <span class="keywordflow">if</span> (e) <a name="l00679"></a>00679 type_id = e->getType(); <a name="l00680"></a>00680 } <a name="l00681"></a>00681 <span class="keywordflow">else</span>{ <a name="l00682"></a>00682 <span class="comment">//The referenced element may be in an imported schemaparser</span> <a name="l00683"></a>00683 <span class="keywordtype">int</span> i=checkImport(refName.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()); <a name="l00684"></a>00684 <span class="keywordflow">if</span>(i>=0 && importedSchemas_[i].sParser) { <a name="l00685"></a>00685 <a name="l00686"></a>00686 e=<span class="keyword">const_cast<</span>Element*<span class="keyword">></span>(importedSchemas_[i].sParser->getElement(refName)); <a name="l00687"></a>00687 <span class="keywordflow">if</span> (e){ <a name="l00688"></a>00688 <span class="comment">//if the type is in an imported schema then we must add a local reference to</span> <a name="l00689"></a>00689 <span class="comment">// its type,because the type id as got by e->getType()</span> <a name="l00690"></a>00690 <span class="comment">// is not valid in the current schema context</span> <a name="l00691"></a>00691 <span class="keyword">const</span> XSDType* pType = importedSchemas_[i].sParser->getType(e->getType()); <a name="l00692"></a>00692 type_id= typesTable_.addExternalTypeId(e->getName()+<span class="stringliteral">"_"</span>+e->getTypeNamespace(), <a name="l00693"></a>00693 pType); <a name="l00694"></a>00694 } <a name="l00695"></a>00695 } <a name="l00696"></a>00696 } <a name="l00697"></a>00697 <a name="l00698"></a>00698 <span class="keywordflow">if</span> (e == 0){ <a name="l00699"></a>00699 <a name="l00700"></a>00700 fwdRef=<span class="keyword">true</span>; <a name="l00701"></a>00701 name=refName.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>(); <a name="l00702"></a>00702 lForwardElemRefs_.push_back(refName); <a name="l00703"></a>00703 <span class="comment">//this will be resolved later</span> <a name="l00704"></a>00704 } <a name="l00705"></a>00705 <span class="keywordflow">else</span>{ <a name="l00706"></a>00706 name = e->getName(); <a name="l00707"></a>00707 qualified = e->isQualified(); <a name="l00708"></a>00708 defaultVal = e->defaultVal(); <a name="l00709"></a>00709 fixedVal = e->fixedVal(); <a name="l00710"></a>00710 typeNs = e->getTypeNamespace(); <a name="l00711"></a>00711 elemNs = e->getNamespace(); <a name="l00712"></a>00712 } <a name="l00713"></a>00713 <a name="l00714"></a>00714 <span class="preprocessor">#ifdef LOGGING</span> <a name="l00715"></a>00715 <span class="preprocessor"></span> logFile_<<elemNs<<<span class="stringliteral">":"</span><<name<<<span class="stringliteral">" -> element reference("</span><<type_id<<<span class="stringliteral">")"</span><<std::endl; <a name="l00716"></a>00716 <span class="preprocessor">#endif</span> <a name="l00717"></a>00717 <span class="preprocessor"></span> <a name="l00718"></a>00718 } <a name="l00719"></a>00719 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"minOccurs"</span> == attName){ <a name="l00720"></a>00720 minimum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i), 10); <a name="l00721"></a>00721 } <a name="l00722"></a>00722 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"maxOccurs"</span> == attName){ <a name="l00723"></a>00723 <span class="keywordflow">if</span> (<span class="stringliteral">"unbounded"</span> == xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)) <a name="l00724"></a>00724 maximum = <a class="code" href="Element_8h.html#af17df4d5d5bad0ea1d48fa796a91d4ce">UNBOUNDED</a>; <a name="l00725"></a>00725 <span class="keywordflow">else</span> <a name="l00726"></a>00726 maximum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i), 10); <a name="l00727"></a>00727 <span class="keywordflow">if</span> (maximum == -1){ <span class="comment">//invalid value for maxOccurs</span> <a name="l00728"></a>00728 error(<span class="stringliteral">"<element>:Invalid value for maxOccurs"</span>,1); <a name="l00729"></a>00729 maximum=1; <a name="l00730"></a>00730 } <a name="l00731"></a>00731 } <a name="l00732"></a>00732 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"default"</span> == attName){ <a name="l00733"></a>00733 <span class="keywordflow">if</span> (fixedVal.empty()) <a name="l00734"></a>00734 defaultVal = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00735"></a>00735 <a name="l00736"></a>00736 <span class="keywordflow">else</span> <a name="l00737"></a>00737 error(<span class="stringliteral">"<element>:fixed and default cannot occur together"</span>); <a name="l00738"></a>00738 } <a name="l00739"></a>00739 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"fixed"</span> == attName){ <a name="l00740"></a>00740 <span class="keywordflow">if</span> (defaultVal.empty()) <a name="l00741"></a>00741 fixedVal = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00742"></a>00742 <a name="l00743"></a>00743 <span class="keywordflow">else</span> <a name="l00744"></a>00744 error(<span class="stringliteral">"<element>:fixed and default cannot occur together"</span>); <a name="l00745"></a>00745 } <a name="l00746"></a>00746 <a name="l00747"></a>00747 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"substitutionGroup"</span> == attName) { <a name="l00748"></a>00748 <a name="l00749"></a>00749 <span class="comment">//do nothing</span> <a name="l00750"></a>00750 } <a name="l00751"></a>00751 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"nillable"</span> == attName) { <a name="l00752"></a>00752 <a name="l00753"></a>00753 <span class="comment">//a nillable element need not have a type ,so set it to anyType id if nop type was given</span> <a name="l00754"></a>00754 nill = <span class="keyword">true</span>; <a name="l00755"></a>00755 minimum = 0; <a name="l00756"></a>00756 } <a name="l00757"></a>00757 <span class="keywordflow">else</span> <a name="l00758"></a>00758 error(<span class="stringliteral">"<element>:Unsupported Attribute "</span>+attName ,2) ; <a name="l00759"></a>00759 } <a name="l00760"></a>00760 <a name="l00761"></a>00761 <span class="keywordflow">do</span> <a name="l00762"></a>00762 { <a name="l00763"></a>00763 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00764"></a>00764 std::string elemName=xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00765"></a>00765 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) { <a name="l00766"></a>00766 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"element"</span>) <a name="l00767"></a>00767 <span class="keywordflow">break</span>; <a name="l00768"></a>00768 <a name="l00769"></a>00769 <span class="comment">//if an end tag is seen proceed till next start tag</span> <a name="l00770"></a>00770 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l00771"></a>00771 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00772"></a>00772 } <a name="l00773"></a>00773 <a name="l00774"></a>00774 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"complexType"</span>){ <a name="l00775"></a>00775 elemType = parseComplexType(); <a name="l00776"></a>00776 type_id = typesTable_.addType(elemType); <a name="l00777"></a>00777 typeNs = elemType->getNamespace(); <a name="l00778"></a>00778 } <a name="l00779"></a>00779 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"simpleType"</span>){ <a name="l00780"></a>00780 elemType = parseSimpleType(); <a name="l00781"></a>00781 type_id = typesTable_.addType(elemType); <a name="l00782"></a>00782 typeNs = elemType->getNamespace(); <a name="l00783"></a>00783 } <a name="l00784"></a>00784 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"annotation"</span>){ <a name="l00785"></a>00785 parseAnnotation(); <a name="l00786"></a>00786 } <a name="l00787"></a>00787 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"key"</span>) { <a name="l00788"></a>00788 <span class="keywordflow">if</span> (c) <a name="l00789"></a>00789 <span class="keyword">delete</span> c; <a name="l00790"></a>00790 c=parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca9bdd1ec9b56fc15df2af7358360ec7c2">Schema::Key</a>); <a name="l00791"></a>00791 } <a name="l00792"></a>00792 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"keyref"</span>) { <a name="l00793"></a>00793 <span class="keywordflow">if</span> (c) <a name="l00794"></a>00794 <span class="keyword">delete</span> c; <a name="l00795"></a>00795 c=parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca1fbfc9ad564f0975cf903b923e243b8f">Schema::Keyref</a>); <a name="l00796"></a>00796 } <a name="l00797"></a>00797 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( elemName==<span class="stringliteral">"unique"</span>) { <a name="l00798"></a>00798 <span class="keywordflow">if</span> (c) <a name="l00799"></a>00799 <span class="keyword">delete</span> c; <a name="l00800"></a>00800 c=parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3cafe0dfe827b7a23a72e2099a8621cacdc">Schema::Unique</a>); <a name="l00801"></a>00801 } <a name="l00802"></a>00802 <span class="keywordflow">else</span>{ <a name="l00803"></a>00803 error(<span class="stringliteral">"<element> : syntax error or unkown tag :"</span>+elemName); <a name="l00804"></a>00804 } <a name="l00805"></a>00805 } <a name="l00806"></a>00806 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00807"></a>00807 <a name="l00808"></a>00808 <span class="keywordflow">if</span> (nill && type_id == 0) { <a name="l00809"></a>00809 type_id = <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711da36f13e661b35c242dcdbab96af0696c8">Schema::XSD_ANYTYPE</a>; <a name="l00810"></a>00810 } <a name="l00811"></a>00811 <a name="l00812"></a>00812 constraints_.push_back(c); <a name="l00813"></a>00813 Element e(name, <a name="l00814"></a>00814 elemNs, <a name="l00815"></a>00815 typeNs, <a name="l00816"></a>00816 type_id, <a name="l00817"></a>00817 minimum, <a name="l00818"></a>00818 maximum, <a name="l00819"></a>00819 qualified, <a name="l00820"></a>00820 defaultVal, <a name="l00821"></a>00821 fixedVal); <a name="l00822"></a>00822 e.addConstraint(c); <a name="l00823"></a>00823 <span class="keywordflow">return</span> e; <a name="l00824"></a>00824 } <a name="l00825"></a>00825 <a name="l00826"></a>00826 Constraint* <a name="l00827"></a>00827 SchemaParser::parseConstraint(<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3c">Schema::ConstraintType</a> cstr) <a name="l00828"></a>00828 { <a name="l00829"></a>00829 Constraint * c= <span class="keyword">new</span> Constraint(cstr); <a name="l00830"></a>00830 c->setName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>,<span class="stringliteral">"name"</span>)); <a name="l00831"></a>00831 <a name="l00832"></a>00832 <span class="keywordflow">do</span> <a name="l00833"></a>00833 { <a name="l00834"></a>00834 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00835"></a>00835 std::string elemName=xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l00836"></a>00836 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) { <a name="l00837"></a>00837 <span class="keywordflow">if</span> (cstr==<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca9bdd1ec9b56fc15df2af7358360ec7c2">Schema::Key</a> && elemName == <span class="stringliteral">"key"</span> || <a name="l00838"></a>00838 cstr==<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3ca1fbfc9ad564f0975cf903b923e243b8f">Schema::Keyref</a> && elemName == <span class="stringliteral">"keyref"</span> || <a name="l00839"></a>00839 cstr==<a class="code" href="namespaceSchema.html#a016df5c282799f5a08aeb68727dfae3cafe0dfe827b7a23a72e2099a8621cacdc">Schema::Unique</a> && elemName == <span class="stringliteral">"unique"</span> ) <a name="l00840"></a>00840 <span class="keywordflow">break</span>; <a name="l00841"></a>00841 <a name="l00842"></a>00842 <span class="comment">//if an end tag is seen proceed till next start tag</span> <a name="l00843"></a>00843 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l00844"></a>00844 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00845"></a>00845 } <a name="l00846"></a>00846 <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"selector"</span>){ <a name="l00847"></a>00847 c->setSelector(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"xpath"</span>)); <a name="l00848"></a>00848 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00849"></a>00849 } <a name="l00850"></a>00850 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(elemName==<span class="stringliteral">"field"</span>){ <a name="l00851"></a>00851 c->addField(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"xpath"</span>)); <a name="l00852"></a>00852 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00853"></a>00853 } <a name="l00854"></a>00854 }<span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00855"></a>00855 <span class="keywordflow">return</span> c; <a name="l00856"></a>00856 } <a name="l00857"></a>00857 <a name="l00858"></a>00858 <a name="l00859"></a>00859 Element <a name="l00860"></a>00860 SchemaParser::addAny(ContentModel* cm) <a name="l00861"></a>00861 { <a name="l00862"></a>00862 std::string ns; <a name="l00863"></a>00863 <a name="l00864"></a>00864 <span class="keywordtype">int</span> type_id = <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711daf98e1b46502181ba445f7331b6b38de3">Schema::XSD_ANY</a>, minimum = 1, maximum = 1, attcnt; <a name="l00865"></a>00865 <span class="comment">//note processContents=lax .</span> <a name="l00866"></a>00866 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00867"></a>00867 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l00868"></a>00868 { <a name="l00869"></a>00869 std::string attr = xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i); <a name="l00870"></a>00870 <span class="keywordflow">if</span> (<span class="stringliteral">"namespace"</span> == attr) <a name="l00871"></a>00871 ns = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00872"></a>00872 <a name="l00873"></a>00873 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"minOccurs"</span> == attr) <a name="l00874"></a>00874 minimum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i), 10); <a name="l00875"></a>00875 <a name="l00876"></a>00876 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"maxOccurs"</span> == attr) <a name="l00877"></a>00877 { <a name="l00878"></a>00878 <span class="keywordflow">if</span> (<span class="stringliteral">"unbounded"</span> == xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)) <a name="l00879"></a>00879 maximum = <a class="code" href="Element_8h.html#af17df4d5d5bad0ea1d48fa796a91d4ce">UNBOUNDED</a>; <a name="l00880"></a>00880 <span class="keywordflow">else</span> <a name="l00881"></a>00881 maximum = <a class="code" href="namespaceXmlUtils.html#a3241046dfb313c27669514a95f7538d5">XmlUtils::parseInt</a>(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i), 10); <a name="l00882"></a>00882 <span class="keywordflow">if</span> (maximum == -1){ <span class="comment">//invalid value for maxOccurs</span> <a name="l00883"></a>00883 error(<span class="stringliteral">"<element>:Invalid value for maxOccurs"</span>,1); <a name="l00884"></a>00884 maximum=1; <a name="l00885"></a>00885 } <a name="l00886"></a>00886 } <a name="l00887"></a>00887 <a name="l00888"></a>00888 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"processContents"</span> == attr || <span class="stringliteral">"id"</span> == attr) { <a name="l00889"></a>00889 <a name="l00890"></a>00890 <span class="comment">//do nothing</span> <a name="l00891"></a>00891 } <a name="l00892"></a>00892 <span class="keywordflow">else</span> <a name="l00893"></a>00893 error(<span class="stringliteral">"<any>:Unsupported Attribute "</span>+attr,2); <a name="l00894"></a>00894 } <a name="l00895"></a>00895 <a name="l00896"></a>00896 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00897"></a>00897 <span class="keywordflow">do</span> <a name="l00898"></a>00898 { <a name="l00899"></a>00899 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l00900"></a>00900 { <a name="l00901"></a>00901 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"any"</span>) <a name="l00902"></a>00902 <span class="keywordflow">break</span>; <a name="l00903"></a>00903 <a name="l00904"></a>00904 } <a name="l00905"></a>00905 xParser_-><a class="code" href="classXmlPullParser.html#a74c8bdd7edc2f341a8ed4eb8fed7c950">nextToken</a>(); <a name="l00906"></a>00906 }<span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l00907"></a>00907 <a name="l00908"></a>00908 <a name="l00909"></a>00909 Element e(ns, <a name="l00910"></a>00910 ns, <a name="l00911"></a>00911 ns, <a name="l00912"></a>00912 type_id, <a name="l00913"></a>00913 minimum, <a name="l00914"></a>00914 maximum); <a name="l00915"></a>00915 <a name="l00916"></a>00916 cm->addElement(e); <a name="l00917"></a>00917 <span class="keywordflow">return</span> e; <a name="l00918"></a>00918 } <a name="l00919"></a>00919 <a name="l00920"></a>00920 <a name="l00921"></a>00921 Attribute <a name="l00922"></a>00922 SchemaParser::addAnyAttribute(ComplexType * cType) <a name="l00923"></a>00923 { <a name="l00924"></a>00924 std::string ns; <a name="l00925"></a>00925 <span class="keywordtype">int</span> type_id = <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711daf98e1b46502181ba445f7331b6b38de3">Schema::XSD_ANY</a>,attcnt; <a name="l00926"></a>00926 <span class="keywordtype">bool</span> qualified = <span class="keyword">true</span>; <a name="l00927"></a>00927 <a name="l00928"></a>00928 <span class="comment">//note processContents=lax .</span> <a name="l00929"></a>00929 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00930"></a>00930 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l00931"></a>00931 { <a name="l00932"></a>00932 std::string attr = xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i); <a name="l00933"></a>00933 <span class="keywordflow">if</span> (<span class="stringliteral">"namespace"</span> == attr) <a name="l00934"></a>00934 ns = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00935"></a>00935 <a name="l00936"></a>00936 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"processContents"</span> == attr || <span class="stringliteral">"id"</span> == attr) <a name="l00937"></a>00937 { <a name="l00938"></a>00938 <a name="l00939"></a>00939 <span class="comment">//do nothing</span> <a name="l00940"></a>00940 } <a name="l00941"></a>00941 <span class="keywordflow">else</span> <a name="l00942"></a>00942 error(<span class="stringliteral">"<anyAttribute>:Unsupported Attribute "</span>+attr,1); <a name="l00943"></a>00943 } <a name="l00944"></a>00944 <a name="l00945"></a>00945 Attribute a(ns, <a name="l00946"></a>00946 type_id, <a name="l00947"></a>00947 qualified); <a name="l00948"></a>00948 <span class="keywordflow">if</span>(cType) <a name="l00949"></a>00949 cType->addAttribute(a); <a name="l00950"></a>00950 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00951"></a>00951 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l00952"></a>00952 { <a name="l00953"></a>00953 parseAnnotation(); <a name="l00954"></a>00954 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l00955"></a>00955 } <a name="l00956"></a>00956 <span class="keywordflow">return</span> a; <a name="l00957"></a>00957 <a name="l00958"></a>00958 } <a name="l00959"></a>00959 <a name="l00960"></a>00960 <a name="l00961"></a>00961 <span class="comment">//This function parses and attribute</span> <a name="l00962"></a>00962 Attribute <a name="l00963"></a>00963 SchemaParser::parseAttribute(<span class="keywordtype">bool</span> & fwdRef) <a name="l00964"></a>00964 { <a name="l00965"></a>00965 std::string name, fixedVal, defaultVal; <a name="l00966"></a>00966 <span class="keywordtype">int</span> type_id = 0, attcnt; <a name="l00967"></a>00967 <span class="keywordtype">bool</span> qualified = <span class="keyword">false</span>, use = <span class="keyword">false</span>; <a name="l00968"></a>00968 fwdRef=<span class="keyword">false</span>; <a name="l00969"></a>00969 <a name="l00970"></a>00970 <a class="code" href="classQname.html">Qname</a> refAttribute; <a name="l00971"></a>00971 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l00972"></a>00972 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) { <a name="l00973"></a>00973 std::string attName = xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i); <a name="l00974"></a>00974 std::string attNs=xParser_-><a class="code" href="classXmlPullParser.html#adc0e22132b843b7a34452a8bacb56efb">getAttributeNamespace</a>(i); <a name="l00975"></a>00975 std::string attVal=xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l00976"></a>00976 <a name="l00977"></a>00977 <a name="l00978"></a>00978 <span class="keywordflow">if</span> (<span class="stringliteral">"name"</span> == attName) <a name="l00979"></a>00979 name = attVal; <a name="l00980"></a>00980 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"type"</span> == attName) { <a name="l00981"></a>00981 <span class="keywordflow">if</span> (type_id > 0) <a name="l00982"></a>00982 error(<span class="stringliteral">"<attribute>:type and ref are mutually exclusive in element decl"</span>); <a name="l00983"></a>00983 <a class="code" href="classQname.html">Qname</a> typeName(attVal); <a name="l00984"></a>00984 typeName.setNamespace(xParser_-> <a name="l00985"></a>00985 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName.getPrefix())); <a name="l00986"></a>00986 type_id = <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>); <a name="l00987"></a>00987 <span class="keywordflow">if</span> (type_id == 0) <a name="l00988"></a>00988 error(<span class="stringliteral">"<attribute>:Could not resolve type "</span> + <a name="l00989"></a>00989 typeName.getNamespace() + <a name="l00990"></a>00990 <span class="stringliteral">":"</span> +typeName.getLocalName(),1); <a name="l00991"></a>00991 } <a name="l00992"></a>00992 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"form"</span> == attName) { <a name="l00993"></a>00993 <span class="keywordflow">if</span> (<span class="stringliteral">"qualified"</span> == attVal) <a name="l00994"></a>00994 qualified = <span class="keyword">true</span>; <a name="l00995"></a>00995 <span class="keywordflow">else</span> <a name="l00996"></a>00996 qualified = <span class="keyword">false</span>; <a name="l00997"></a>00997 } <a name="l00998"></a>00998 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"ref"</span> == attName) { <a name="l00999"></a>00999 <span class="keywordflow">if</span> (!name.empty()) <a name="l01000"></a>01000 error(<span class="stringliteral">"<attribute>:name and ref are mutually exclusive in element decl"</span>); <a name="l01001"></a>01001 <span class="keywordflow">if</span> (type_id > 0) <a name="l01002"></a>01002 error(<span class="stringliteral">"<attribute>:type and ref are mutually exclusive in element decl"</span>); <a name="l01003"></a>01003 refAttribute = attVal; <a name="l01004"></a>01004 refAttribute.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-><a class="code" href="classXmlPullParser.html#ab64f42eff37c0c049024c8267f0732e8">getNamespace</a>(refAttribute.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l01005"></a>01005 Attribute *a =0; <a name="l01006"></a>01006 <span class="keywordflow">if</span>(refAttribute.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()==tnsUri_){ <a name="l01007"></a>01007 a=<a class="code" href="classSchema_1_1SchemaParser.html#a47bd98ca4024da64894ed46ade0f9554">getAttribute</a>(refAttribute); <a name="l01008"></a>01008 }<span class="keywordflow">else</span>{ <a name="l01009"></a>01009 <span class="keywordtype">int</span> i=checkImport(refAttribute.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()); <a name="l01010"></a>01010 <span class="keywordflow">if</span>(i >=0 && importedSchemas_[i].sParser){ <a name="l01011"></a>01011 a=importedSchemas_[i].sParser->getAttribute(refAttribute); <a name="l01012"></a>01012 } <a name="l01013"></a>01013 <span class="keywordflow">else</span> <a name="l01014"></a>01014 a=0; <a name="l01015"></a>01015 } <a name="l01016"></a>01016 <a name="l01017"></a>01017 <span class="keywordflow">if</span> (a == 0){ <a name="l01018"></a>01018 fwdRef = <span class="keyword">true</span>; <a name="l01019"></a>01019 name=refAttribute.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>(); <a name="l01020"></a>01020 lForwardAttributeRefs_.push_back(refAttribute); <a name="l01021"></a>01021 } <a name="l01022"></a>01022 <span class="keywordflow">else</span>{ <a name="l01023"></a>01023 name = a->getName(); <a name="l01024"></a>01024 type_id = a->getType(); <a name="l01025"></a>01025 qualified = a->isQualified(); <a name="l01026"></a>01026 <span class="keywordflow">if</span> (defaultVal.empty()) <a name="l01027"></a>01027 defaultVal = a->defaultVal(); <a name="l01028"></a>01028 <span class="keywordflow">if</span> (fixedVal.empty()) <a name="l01029"></a>01029 fixedVal = a->fixedVal(); <a name="l01030"></a>01030 } <a name="l01031"></a>01031 } <a name="l01032"></a>01032 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"default"</span> == attName) { <a name="l01033"></a>01033 <span class="keywordflow">if</span> (fixedVal.empty()) <a name="l01034"></a>01034 defaultVal = attVal; <a name="l01035"></a>01035 <span class="keywordflow">else</span> <a name="l01036"></a>01036 error <a name="l01037"></a>01037 (<span class="stringliteral">"<attribute>:fixed and default cannot occur together"</span>); <a name="l01038"></a>01038 } <a name="l01039"></a>01039 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"fixed"</span> == attName) { <a name="l01040"></a>01040 <span class="keywordflow">if</span> (defaultVal.empty()) <a name="l01041"></a>01041 fixedVal = attVal; <a name="l01042"></a>01042 <span class="keywordflow">else</span> <a name="l01043"></a>01043 error(<span class="stringliteral">"<attribute>:fixed and default cannot occur together"</span>); <a name="l01044"></a>01044 } <a name="l01045"></a>01045 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="stringliteral">"use"</span> == attName) { <a name="l01046"></a>01046 <span class="keywordflow">if</span> (attVal == <span class="stringliteral">"required"</span>) <a name="l01047"></a>01047 use = <span class="keyword">true</span>; <a name="l01048"></a>01048 <span class="keywordflow">else</span> <a name="l01049"></a>01049 use = <span class="keyword">false</span>; <a name="l01050"></a>01050 } <a name="l01051"></a>01051 <span class="keywordflow">else</span> { <a name="l01052"></a>01052 <span class="keywordtype">int</span> n=-1; <a name="l01053"></a>01053 <span class="keywordflow">if</span>(!attNs.empty() && ((n=checkImport(attNs))!=-1)){ <a name="l01054"></a>01054 fixedVal=attNs;<span class="comment">//hack for non schema attributes</span> <a name="l01055"></a>01055 defaultVal=attVal;<span class="comment">//store non schema attributes.esp for soapenc:arrayType</span> <a name="l01056"></a>01056 }<span class="keywordflow">else</span>{ <a name="l01057"></a>01057 error(<span class="stringliteral">"<attribute>:Unsupported attribute {"</span>+ attNs+ <span class="stringliteral">"}:"</span>+attName,2); <a name="l01058"></a>01058 } <a name="l01059"></a>01059 } <a name="l01060"></a>01060 } <a name="l01061"></a>01061 <span class="comment">//Now parse the children of the attribute tag viz simpleType</span> <a name="l01062"></a>01062 <span class="keywordflow">do</span> <a name="l01063"></a>01063 { <a name="l01064"></a>01064 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01065"></a>01065 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l01066"></a>01066 { <a name="l01067"></a>01067 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"attribute"</span>) <a name="l01068"></a>01068 <span class="keywordflow">break</span>; <a name="l01069"></a>01069 <a name="l01070"></a>01070 <span class="comment">//if an end tag is seen proceed till next start tag</span> <a name="l01071"></a>01071 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l01072"></a>01072 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01073"></a>01073 } <a name="l01074"></a>01074 <a name="l01075"></a>01075 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"simpleType"</span>) <a name="l01076"></a>01076 { <a name="l01077"></a>01077 XSDType *elemType = parseSimpleType(); <a name="l01078"></a>01078 <a name="l01079"></a>01079 <span class="comment">//create an anonymous type</span> <a name="l01080"></a>01080 type_id = typesTable_.addType(elemType); <a name="l01081"></a>01081 } <a name="l01082"></a>01082 <a name="l01083"></a>01083 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l01084"></a>01084 parseAnnotation(); <a name="l01085"></a>01085 <span class="keywordflow">else</span> <a name="l01086"></a>01086 error(<span class="stringliteral">"<attribute>:Syntax error or unkown tag "</span>+xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>()); <a name="l01087"></a>01087 } <a name="l01088"></a>01088 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l01089"></a>01089 <a name="l01090"></a>01090 Attribute a(name, <a name="l01091"></a>01091 type_id, <a name="l01092"></a>01092 qualified, <a name="l01093"></a>01093 defaultVal, <a name="l01094"></a>01094 fixedVal, <a name="l01095"></a>01095 use); <a name="l01096"></a>01096 <span class="keywordflow">return</span> a; <a name="l01097"></a>01097 <a name="l01098"></a>01098 } <a name="l01099"></a>01099 <a name="l01100"></a>01100 SimpleType * <a name="l01101"></a>01101 SchemaParser::parseSimpleType() <a name="l01102"></a>01102 { <a name="l01103"></a>01103 SimpleType *st = <span class="keyword">new</span> SimpleType(tnsUri_); <a name="l01104"></a>01104 <span class="keywordtype">int</span> basetype_id = 0; <a name="l01105"></a>01105 <span class="keywordtype">int</span> attcnt; <a name="l01106"></a>01106 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01107"></a>01107 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l01108"></a>01108 { <a name="l01109"></a>01109 <span class="keywordflow">if</span> (<span class="stringliteral">"name"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l01110"></a>01110 st->setName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l01111"></a>01111 <a name="l01112"></a>01112 <span class="keywordflow">else</span> <a name="l01113"></a>01113 error(<span class="stringliteral">"<simpleType> :"</span> + xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i) + <a name="l01114"></a>01114 <span class="stringliteral">":Unknown/Unsupported attribute "</span>,2); <a name="l01115"></a>01115 } <a name="l01116"></a>01116 <a name="l01117"></a>01117 <span class="keywordflow">do</span> <a name="l01118"></a>01118 { <a name="l01119"></a>01119 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01120"></a>01120 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l01121"></a>01121 { <a name="l01122"></a>01122 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"simpleType"</span>) <a name="l01123"></a>01123 <span class="keywordflow">break</span>; <a name="l01124"></a>01124 <a name="l01125"></a>01125 <span class="comment">//if an end tag is seen proceed till next start tag</span> <a name="l01126"></a>01126 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a>) <a name="l01127"></a>01127 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01128"></a>01128 } <a name="l01129"></a>01129 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span>) <a name="l01130"></a>01130 { <a name="l01131"></a>01131 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01132"></a>01132 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l01133"></a>01133 { <a name="l01134"></a>01134 <span class="keywordflow">if</span> (<span class="stringliteral">"base"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l01135"></a>01135 { <a name="l01136"></a>01136 <a class="code" href="classQname.html">Qname</a> typeName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l01137"></a>01137 typeName.setNamespace(xParser_-> <a name="l01138"></a>01138 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName. <a name="l01139"></a>01139 getPrefix())); <a name="l01140"></a>01140 st->setBaseType(basetype_id = <a name="l01141"></a>01141 <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>)); <a name="l01142"></a>01142 <span class="keywordflow">if</span> (basetype_id == 0) <a name="l01143"></a>01143 error(<span class="stringliteral">"<simpleType>:"</span> + <a name="l01144"></a>01144 xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) + <a name="l01145"></a>01145 <span class="stringliteral">":Unknown base type "</span>,1); <a name="l01146"></a>01146 } <a name="l01147"></a>01147 <span class="keywordflow">else</span> <a name="l01148"></a>01148 error(<span class="stringliteral">"<simpleType>:"</span> + xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i) + <a name="l01149"></a>01149 <span class="stringliteral">":Unknown/Unsupported attribute for <restriction>"</span>,2); <a name="l01150"></a>01150 } <a name="l01151"></a>01151 parseRestriction(st); <a name="l01152"></a>01152 } <a name="l01153"></a>01153 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"union"</span>){ <a name="l01154"></a>01154 <a name="l01155"></a>01155 std::string members = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"memberTypes"</span>); <a name="l01156"></a>01156 <span class="keywordtype">size_t</span> s = 0; <a name="l01157"></a>01157 <span class="keywordflow">while</span>(s < members.length()){ <a name="l01158"></a>01158 <span class="keywordflow">while</span>(members[s]==<span class="charliteral">' '</span>)s++; <a name="l01159"></a>01159 std::string type = members.substr(s,members.find(<span class="charliteral">' '</span>,s)-s); <a name="l01160"></a>01160 <a class="code" href="classQname.html">Qname</a> typeName(type); <a name="l01161"></a>01161 typeName.setNamespace(xParser_-><a class="code" href="classXmlPullParser.html#ab64f42eff37c0c049024c8267f0732e8">getNamespace</a>(typeName.getPrefix())); <a name="l01162"></a>01162 basetype_id = <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName,<span class="keyword">true</span>); <a name="l01163"></a>01163 st->setUnionType(basetype_id); <a name="l01164"></a>01164 s+=type.length()+1; <a name="l01165"></a>01165 } <a name="l01166"></a>01166 <a name="l01167"></a>01167 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01168"></a>01168 <span class="keywordflow">while</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"simpleType"</span>){ <a name="l01169"></a>01169 XSDType * t = parseSimpleType(); <a name="l01170"></a>01170 <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711d">Schema::Type</a> i = (<a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711d">Schema::Type</a>)typesTable_.addType(t); <a name="l01171"></a>01171 <a name="l01172"></a>01172 st->setUnionType(i); <a name="l01173"></a>01173 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01174"></a>01174 } <a name="l01175"></a>01175 } <a name="l01176"></a>01176 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"list"</span>){ <a name="l01177"></a>01177 <a name="l01178"></a>01178 basetype_id = <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"itemType"</span>)); <a name="l01179"></a>01179 st->setListType(basetype_id); <a name="l01180"></a>01180 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01181"></a>01181 } <a name="l01182"></a>01182 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) <a name="l01183"></a>01183 parseAnnotation(); <a name="l01184"></a>01184 <span class="keywordflow">else</span> <a name="l01185"></a>01185 error(<span class="stringliteral">"<simpleType>:Syntax error"</span>); <a name="l01186"></a>01186 } <a name="l01187"></a>01187 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l01188"></a>01188 <span class="keywordflow">return</span> st; <a name="l01189"></a>01189 } <a name="l01190"></a>01190 <a name="l01191"></a>01191 <span class="keywordtype">void</span> <a name="l01192"></a>01192 SchemaParser::parseRestriction(SimpleType * st, <a name="l01193"></a>01193 ComplexType * ct) <a name="l01194"></a>01194 { <a name="l01195"></a>01195 <span class="keywordflow">if</span> (st->getBaseTypeId() == 0) <a name="l01196"></a>01196 error(<span class="stringliteral">"<restriction>:unkown BaseType"</span>,1); <a name="l01197"></a>01197 <a name="l01198"></a>01198 <span class="keywordflow">do</span> { <a name="l01199"></a>01199 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01200"></a>01200 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l01201"></a>01201 { <a name="l01202"></a>01202 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span>) <a name="l01203"></a>01203 <span class="keywordflow">break</span>; <a name="l01204"></a>01204 <span class="keywordflow">else</span> <a name="l01205"></a>01205 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01206"></a>01206 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span> <a name="l01207"></a>01207 && xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l01208"></a>01208 <span class="keywordflow">break</span>; <a name="l01209"></a>01209 } <a name="l01210"></a>01210 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) { <a name="l01211"></a>01211 parseAnnotation(); <a name="l01212"></a>01212 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01213"></a>01213 } <a name="l01214"></a>01214 <span class="keywordflow">if</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>()==<span class="stringliteral">"attribute"</span> && ct!=0){ <a name="l01215"></a>01215 <span class="keywordtype">bool</span> f=<span class="keyword">false</span>; <a name="l01216"></a>01216 Attribute a=parseAttribute(f); <a name="l01217"></a>01217 ct->addAttribute(a,f); <a name="l01218"></a>01218 } <a name="l01219"></a>01219 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (st->isvalidFacet(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>())){ <a name="l01220"></a>01220 <span class="comment">//This function also sets the facet if valid</span> <a name="l01221"></a>01221 <a name="l01222"></a>01222 st->setFacetValue(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(), <a name="l01223"></a>01223 xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"value"</span>)); <a name="l01224"></a>01224 }<span class="keywordflow">else</span>{ <a name="l01225"></a>01225 error(<span class="stringliteral">"<restriction>:"</span> + xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() + <a name="l01226"></a>01226 <span class="stringliteral">" is not a valid facet /attribute for the type"</span>,1); <a name="l01227"></a>01227 } <a name="l01228"></a>01228 } <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l01229"></a>01229 } <a name="l01230"></a>01230 <a name="l01231"></a>01231 <span class="keywordtype">void</span> <a name="l01232"></a>01232 SchemaParser::parseComplexContent(ComplexType * ct) <a name="l01233"></a>01233 { <a name="l01234"></a>01234 <span class="keywordtype">int</span> attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01235"></a>01235 <span class="keywordtype">int</span> i = 0; <a name="l01236"></a>01236 <a class="code" href="classQname.html">Qname</a> typeName; <a name="l01237"></a>01237 <a name="l01238"></a>01238 ct->setContentModel(<a class="code" href="namespaceSchema.html#a84b8523395bb986be4b87ff834308103afd82bbac2e953f816f3ea3462f08929b">Schema::Complex</a>); <a name="l01239"></a>01239 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01240"></a>01240 <a name="l01241"></a>01241 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) { <a name="l01242"></a>01242 parseAnnotation(); <a name="l01243"></a>01243 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01244"></a>01244 } <a name="l01245"></a>01245 <a name="l01246"></a>01246 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span>) { <a name="l01247"></a>01247 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01248"></a>01248 <span class="keywordflow">for</span> (i = 0; i < attcnt; i++) { <a name="l01249"></a>01249 <span class="keywordflow">if</span> (<span class="stringliteral">"base"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l01250"></a>01250 { <a name="l01251"></a>01251 typeName = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l01252"></a>01252 typeName.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-> <a name="l01253"></a>01253 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l01254"></a>01254 } <a name="l01255"></a>01255 } <a name="l01256"></a>01256 ct->setBaseType(<a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>), <a name="l01257"></a>01257 <a class="code" href="namespaceSchema.html#a37860d038e5376a5c902ff2c2adf2fd8a68d20493c325a2415e5110ba42e273f2">Schema::Restriction</a>); <a name="l01258"></a>01258 } <a name="l01259"></a>01259 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"extension"</span>) { <a name="l01260"></a>01260 attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01261"></a>01261 <span class="keywordflow">for</span> (i = 0; i < attcnt; i++) { <a name="l01262"></a>01262 <span class="keywordflow">if</span> (<span class="stringliteral">"base"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) { <a name="l01263"></a>01263 typeName = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i); <a name="l01264"></a>01264 typeName.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-> <a name="l01265"></a>01265 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l01266"></a>01266 } <a name="l01267"></a>01267 } <a name="l01268"></a>01268 ct->setBaseType(<a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>), <a name="l01269"></a>01269 <a class="code" href="namespaceSchema.html#a37860d038e5376a5c902ff2c2adf2fd8a4313ec3c74f679785d51168032149620">Schema::Extension</a>); <a name="l01270"></a>01270 } <a name="l01271"></a>01271 <a name="l01272"></a>01272 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01273"></a>01273 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"annotation"</span>) { <a name="l01274"></a>01274 parseAnnotation(); <a name="l01275"></a>01275 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01276"></a>01276 } <a name="l01277"></a>01277 <a name="l01278"></a>01278 { <a name="l01279"></a>01279 std::string elemName=xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>(); <a name="l01280"></a>01280 ContentModel * cm=0; <a name="l01281"></a>01281 <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"all"</span>){ <a name="l01282"></a>01282 cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cad72664c314f8671075e550b614c63990">Schema::All</a>); <a name="l01283"></a>01283 } <a name="l01284"></a>01284 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"sequence"</span>){ <a name="l01285"></a>01285 cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l01286"></a>01286 } <a name="l01287"></a>01287 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (elemName == <span class="stringliteral">"choice"</span>){ <a name="l01288"></a>01288 cm= <span class="keyword">new</span> ContentModel(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434cab1b96c47de244209c2c1ed736cb08869">Schema::Choice</a>); <a name="l01289"></a>01289 } <a name="l01290"></a>01290 <a name="l01291"></a>01291 <span class="keywordflow">if</span>(cm){ <a name="l01292"></a>01292 parseContent(cm); <a name="l01293"></a>01293 ct->setContents(cm); <a name="l01294"></a>01294 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01295"></a>01295 } <a name="l01296"></a>01296 <a name="l01297"></a>01297 <span class="comment">//parse any attributes</span> <a name="l01298"></a>01298 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>){ <a name="l01299"></a>01299 <a name="l01300"></a>01300 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"attribute"</span>) { <a name="l01301"></a>01301 <span class="keywordtype">bool</span> f=<span class="keyword">false</span>; <a name="l01302"></a>01302 Attribute a=parseAttribute(f); <a name="l01303"></a>01303 ct->addAttribute(a,f); <a name="l01304"></a>01304 } <a name="l01305"></a>01305 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"attributeGroup"</span>) <a name="l01306"></a>01306 { <a name="l01307"></a>01307 parseAttributeGroup(ct); <a name="l01308"></a>01308 <a name="l01309"></a>01309 } <a name="l01310"></a>01310 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"anyAttribute"</span>) <a name="l01311"></a>01311 addAnyAttribute(ct); <a name="l01312"></a>01312 <a name="l01313"></a>01313 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01314"></a>01314 } <a name="l01315"></a>01315 } <a name="l01316"></a>01316 <a name="l01317"></a>01317 <span class="keywordflow">do</span> { <a name="l01318"></a>01318 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>) <a name="l01319"></a>01319 <span class="keywordflow">if</span> ((xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span> || <a name="l01320"></a>01320 xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"extension"</span>) ) <a name="l01321"></a>01321 <span class="keywordflow">break</span>; <a name="l01322"></a>01322 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01323"></a>01323 } <a name="l01324"></a>01324 <span class="keywordflow">while</span> (<span class="keyword">true</span>); <a name="l01325"></a>01325 <a name="l01326"></a>01326 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01327"></a>01327 } <a name="l01328"></a>01328 <a name="l01329"></a>01329 <a name="l01330"></a>01330 <span class="keywordtype">void</span> <a name="l01331"></a>01331 SchemaParser::parseSimpleContent(ComplexType * ct) <a name="l01332"></a>01332 { <a name="l01333"></a>01333 ct->setContentModel(<a class="code" href="namespaceSchema.html#a84b8523395bb986be4b87ff834308103ac32a5decc6e36a85f67c84470f71967f">Schema::Simple</a>); <a name="l01334"></a>01334 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01335"></a>01335 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"restriction"</span>) <a name="l01336"></a>01336 { <a name="l01337"></a>01337 SimpleType *st = <span class="keyword">new</span> SimpleType(tnsUri_); <a name="l01338"></a>01338 <span class="keywordtype">int</span> attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01339"></a>01339 <span class="keywordtype">int</span> basetype_id = 0; <a name="l01340"></a>01340 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l01341"></a>01341 { <a name="l01342"></a>01342 <span class="keywordflow">if</span> (<span class="stringliteral">"base"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l01343"></a>01343 { <a name="l01344"></a>01344 <a class="code" href="classQname.html">Qname</a> typeName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l01345"></a>01345 typeName.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-> <a name="l01346"></a>01346 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l01347"></a>01347 st->setBaseType(basetype_id = <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>)); <a name="l01348"></a>01348 <span class="keywordflow">if</span> (basetype_id == 0) <a name="l01349"></a>01349 error(<span class="stringliteral">"<simpleContent> :"</span> + <a name="l01350"></a>01350 xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) + <a name="l01351"></a>01351 <span class="stringliteral">":Unknown base type "</span>,1); <a name="l01352"></a>01352 } <a name="l01353"></a>01353 <a name="l01354"></a>01354 <span class="keywordflow">else</span> <a name="l01355"></a>01355 error(<span class="stringliteral">"<simpleContent> :"</span> + xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i) + <a name="l01356"></a>01356 <span class="stringliteral">":Unknown/Unsupported attribute "</span>,2); <a name="l01357"></a>01357 } <a name="l01358"></a>01358 parseRestriction(st,ct); <a name="l01359"></a>01359 <span class="keywordtype">int</span> typeId = typesTable_.addType(st); <a name="l01360"></a>01360 ct->setSimpleContentType(typeId); <a name="l01361"></a>01361 } <a name="l01362"></a>01362 <a name="l01363"></a>01363 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"extension"</span>) <a name="l01364"></a>01364 { <a name="l01365"></a>01365 <span class="comment">//This extension does not use the full model that can come in</span> <a name="l01366"></a>01366 <span class="comment">//ComplexContent .It uses the simple model.no particle allowed ,only attributes</span> <a name="l01367"></a>01367 <span class="keywordtype">int</span> attcnt = xParser_-><a class="code" href="classXmlPullParser.html#afa91180fecdf4078ad07884f481eed86">getAttributeCount</a>(); <a name="l01368"></a>01368 <span class="keywordtype">int</span> basetype_id = 0; <a name="l01369"></a>01369 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < attcnt; i++) <a name="l01370"></a>01370 { <a name="l01371"></a>01371 <span class="keywordflow">if</span> (<span class="stringliteral">"base"</span> == xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i)) <a name="l01372"></a>01372 { <a name="l01373"></a>01373 <a class="code" href="classQname.html">Qname</a> typeName(xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i)); <a name="l01374"></a>01374 typeName.<a class="code" href="classQname.html#a1351793363ec2ed89910fc4f45ee36c1">setNamespace</a>(xParser_-> <a name="l01375"></a>01375 <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(typeName.<a class="code" href="classQname.html#a63ea9b0f43fa50e3a2ee6e35b50830e1">getPrefix</a>())); <a name="l01376"></a>01376 ct->setSimpleContentType(basetype_id = <a name="l01377"></a>01377 <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(typeName, <span class="keyword">true</span>)); <a name="l01378"></a>01378 <span class="keywordflow">if</span> (basetype_id == 0) <a name="l01379"></a>01379 error(<span class="stringliteral">"<simpleContent> :"</span> + <a name="l01380"></a>01380 xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(i) + <a name="l01381"></a>01381 <span class="stringliteral">":Unknown base type "</span>,1); <a name="l01382"></a>01382 } <a name="l01383"></a>01383 <a name="l01384"></a>01384 <span class="keywordflow">else</span> <a name="l01385"></a>01385 error(<span class="stringliteral">"<simpleContent> :"</span> + xParser_-><a class="code" href="classXmlPullParser.html#aeae0b53785bfb92acaa86b9bf11a29de">getAttributeName</a>(i) + <a name="l01386"></a>01386 <span class="stringliteral">":Unknown/Unsupported attribute "</span>); <a name="l01387"></a>01387 } <a name="l01388"></a>01388 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01389"></a>01389 <span class="keywordflow">do</span> <a name="l01390"></a>01390 { <a name="l01391"></a>01391 <a name="l01392"></a>01392 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"attribute"</span>) <a name="l01393"></a>01393 { <a name="l01394"></a>01394 <span class="keywordtype">bool</span> f=<span class="keyword">false</span>; <a name="l01395"></a>01395 Attribute a=parseAttribute(f); <a name="l01396"></a>01396 ct->addAttribute(a,f); <a name="l01397"></a>01397 <a name="l01398"></a>01398 <a name="l01399"></a>01399 } <a name="l01400"></a>01400 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"attributeGroup"</span>) <a name="l01401"></a>01401 { <a name="l01402"></a>01402 parseAttributeGroup(ct); <a name="l01403"></a>01403 <a name="l01404"></a>01404 } <a name="l01405"></a>01405 <a name="l01406"></a>01406 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"anyAttribute"</span>) <a name="l01407"></a>01407 addAnyAttribute(ct); <a name="l01408"></a>01408 <span class="keywordflow">else</span> <a name="l01409"></a>01409 <span class="keywordflow">break</span>; <a name="l01410"></a>01410 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01411"></a>01411 }<span class="keywordflow">while</span>(<span class="keyword">true</span>); <a name="l01412"></a>01412 <a name="l01413"></a>01413 <span class="keywordflow">if</span> (! <a name="l01414"></a>01414 (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"extension"</span> <a name="l01415"></a>01415 && xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>)) <a name="l01416"></a>01416 error(<span class="stringliteral">"<simpleContent> :Syntax error :extension"</span>); <a name="l01417"></a>01417 } <a name="l01418"></a>01418 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01419"></a>01419 <span class="keywordflow">if</span> (! <a name="l01420"></a>01420 (xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"simpleContent"</span> <a name="l01421"></a>01421 && xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a01175879185048fcb8f34df520b2bfdb">END_TAG</a>)) <a name="l01422"></a>01422 error(<span class="stringliteral">"<simpleContent> :Syntax error "</span>); <a name="l01423"></a>01423 } <a name="l01424"></a>01424 <a name="l01425"></a>01425 <a name="l01426"></a>01426 <span class="keywordtype">bool</span> <a name="l01427"></a>01427 SchemaParser::parseRedefine() <a name="l01428"></a>01428 { <a name="l01429"></a>01429 parseInclude(); <a name="l01430"></a>01430 resolveFwdRefs_=<span class="keyword">false</span>; <a name="l01431"></a>01431 parseSchema(<span class="stringliteral">"redefine"</span>); <a name="l01432"></a>01432 resolveFwdRefs_=<span class="keyword">true</span>; <a name="l01433"></a>01433 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01434"></a>01434 } <a name="l01435"></a>01435 <a name="l01436"></a>01436 <span class="keywordtype">bool</span> <a name="l01437"></a>01437 SchemaParser::parseInclude() <a name="l01438"></a>01438 { <a name="l01439"></a>01439 ifstream xsdStream; <a name="l01440"></a>01440 std::string loc = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"schemaLocation"</span>); <a name="l01441"></a>01441 <a name="l01442"></a>01442 <a name="l01443"></a>01443 <span class="comment">// FV Sat Dec 22 15:33:09 CET 2007 I added the absolute path and the file:/ use-cases </span> <a name="l01444"></a>01444 <span class="comment">//in the the test. Will not work for paths like "C:\temp\schema.xsd" .Use the file:/ protocol</span> <a name="l01445"></a>01445 <a name="l01446"></a>01446 <a name="l01447"></a>01447 <span class="keywordflow">if</span> ( loc.find(<span class="stringliteral">"/"</span>,0) != 0 && <span class="comment">// not an asolute path</span> <a name="l01448"></a>01448 loc.find(<span class="stringliteral">"file:/"</span>,0) == std::string::npos && <a name="l01449"></a>01449 loc.find(<span class="stringliteral">"http://"</span>) == std::string::npos) <a name="l01450"></a>01450 loc = uri_ + loc; <a name="l01451"></a>01451 <a name="l01452"></a>01452 <a name="l01453"></a>01453 <span class="preprocessor">#ifndef _WIN32</span> <a name="l01454"></a>01454 <span class="preprocessor"></span> <a name="l01455"></a>01455 <span class="keywordflow">if</span> (!loc.empty()) { <a name="l01456"></a>01456 <a name="l01457"></a>01457 std::string schemaconf= confPath_ + <span class="stringliteral">"schema.conf"</span>; <a name="l01458"></a>01458 <span class="keywordflow">try</span> { <a name="l01459"></a>01459 <a class="code" href="classConfigFile.html">ConfigFile</a> cf(schemaconf); <a name="l01460"></a>01460 cf.readInto<std::string>(loc,loc); <a name="l01461"></a>01461 }<span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="structConfigFile_1_1file__not__found.html">ConfigFile::file_not_found</a> & e) {} <a name="l01462"></a>01462 } <a name="l01463"></a>01463 <span class="preprocessor">#endif</span> <a name="l01464"></a>01464 <span class="preprocessor"></span> <a name="l01465"></a>01465 <a name="l01466"></a>01466 <span class="keywordflow">if</span>(!loc.empty()) <a name="l01467"></a>01467 { <a name="l01468"></a>01468 <span class="keywordflow">if</span>(<a class="code" href="namespaceXmlUtils.html#a49cb0c0850b4a22b1fe0d5efd7553b01">XmlUtils::fetchUri</a>(loc,fname_)) <a name="l01469"></a>01469 { <a name="l01470"></a>01470 <span class="comment">/*</span> <a name="l01471"></a>01471 <span class="comment"> * If the schema definition was retrieved successfully </span> <a name="l01472"></a>01472 <span class="comment"> * process it and add all type definitions and</span> <a name="l01473"></a>01473 <span class="comment"> * declaration to the current namespace</span> <a name="l01474"></a>01474 <span class="comment"> */</span> <a name="l01475"></a>01475 xsdStream.open(fname_.c_str()); <a name="l01476"></a>01476 <a name="l01477"></a>01477 <a class="code" href="classXmlPullParser.html">XmlPullParser</a> * xpp = <span class="keyword">new</span> <a class="code" href="classXmlPullParser.html">XmlPullParser</a>(xsdStream); <a name="l01478"></a>01478 <a class="code" href="classXmlPullParser.html">XmlPullParser</a> * tmpXparser=xParser_; <a name="l01479"></a>01479 xParser_=xpp; <a name="l01480"></a>01480 <a name="l01481"></a>01481 xParser_-><a class="code" href="classXmlPullParser.html#afd20dea242da6a493321050f24230b54">setFeature</a>(<a class="code" href="XmlPullParser_8h.html#ada32f6169a51300722b9b7dd38fa4032">FEATURE_PROCESS_NAMESPACES</a>, <span class="keyword">true</span>); <a name="l01482"></a>01482 xParser_-><a class="code" href="classXmlPullParser.html#a7b14708ef982d48b41009380146f523a">require</a>(<a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9a40df5e7fdb1a29f88425ef3eb8c1fa">XmlPullParser::START_DOCUMENT</a>, <span class="stringliteral">""</span>, <span class="stringliteral">""</span>); <a name="l01483"></a>01483 <span class="keywordflow">while</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() != xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a7857338db3efb0bcd468b06fe346076f">END_DOCUMENT</a>){ <a name="l01484"></a>01484 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01485"></a>01485 <span class="keywordflow">if</span> (xParser_-><a class="code" href="classXmlPullParser.html#a707466b0d0f10ead2266a750ad84278f">getEventType</a>() == xParser_-><a class="code" href="classXmlPullParser.html#ad5db81dea47b59d1aab8e24ca78baf45a9b3020c88a2935db197d7a72cf36067c">START_TAG</a> && <a name="l01486"></a>01486 xParser_-><a class="code" href="classXmlPullParser.html#a861f8c8b5b08ab96fb7c33756f7cc94d">getName</a>() == <span class="stringliteral">"schema"</span>){ <a name="l01487"></a>01487 resolveFwdRefs_=<span class="keyword">false</span>; <a name="l01488"></a>01488 <a name="l01489"></a>01489 <span class="keywordflow">if</span>(!<a class="code" href="classSchema_1_1SchemaParser.html#a6f1dddf50bcb4dec24df5334971400c0">parseSchemaTag</a>()) <a name="l01490"></a>01490 error(<span class="stringliteral">"Error while parsing the included schema "</span> + loc); <a name="l01491"></a>01491 <span class="keywordflow">else</span>{ <a name="l01492"></a>01492 <a name="l01493"></a>01493 resolveFwdRefs_=<span class="keyword">true</span>; <a name="l01494"></a>01494 <span class="keywordflow">break</span>; <a name="l01495"></a>01495 } <a name="l01496"></a>01496 } <a name="l01497"></a>01497 } <a name="l01498"></a>01498 xParser_=tmpXparser; <a name="l01499"></a>01499 <span class="keyword">delete</span> xpp; <a name="l01500"></a>01500 } <a name="l01501"></a>01501 <span class="keywordflow">else</span>{ <a name="l01502"></a>01502 <a name="l01503"></a>01503 error(<span class="stringliteral">"Error while opening the included schema "</span> + loc); <a name="l01504"></a>01504 } <a name="l01505"></a>01505 } <a name="l01506"></a>01506 <span class="keywordflow">else</span>{ <a name="l01507"></a>01507 <a name="l01508"></a>01508 error(<span class="stringliteral">"schemaLocation is a required attribute for <include>"</span>); <a name="l01509"></a>01509 } <a name="l01510"></a>01510 <a name="l01511"></a>01511 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01512"></a>01512 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01513"></a>01513 } <a name="l01514"></a>01514 <a name="l01515"></a>01515 <span class="keywordtype">bool</span> <a name="l01516"></a>01516 SchemaParser::parseImport() <a name="l01517"></a>01517 { <a name="l01518"></a>01518 <a class="code" href="classQname.html">Qname</a> typeName; <a name="l01519"></a>01519 std::string xsdFile; <a name="l01520"></a>01520 std::string ns = xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"namespace"</span>); <a name="l01521"></a>01521 std::string loc=xParser_-><a class="code" href="classXmlPullParser.html#abcadde67a15be58a4eac0b4592b2e645">getAttributeValue</a>(<span class="stringliteral">""</span>, <span class="stringliteral">"schemaLocation"</span>); <a name="l01522"></a>01522 <a name="l01523"></a>01523 <span class="keywordflow">if</span>(ns == tnsUri_) <a name="l01524"></a>01524 <span class="keywordflow">return</span> parseInclude();<span class="comment">//sometimes import is used to import schemas in same ns.</span> <a name="l01525"></a>01525 <span class="comment">//treat it internally like include</span> <a name="l01526"></a>01526 <a name="l01527"></a>01527 <span class="comment">// if (loc.empty()) </span> <a name="l01528"></a>01528 <span class="comment">// loc = ns; //try using the namespace as schemalocation</span> <a name="l01529"></a>01529 <a name="l01530"></a>01530 <span class="comment">// FV Sat Dec 22 15:33:09 CET 2007 I added the absolute path and the file:/ use-cases in the the test</span> <a name="l01531"></a>01531 <span class="comment">// if ( !loc.empty() && loc.find("http://") == std::string::npos)</span> <a name="l01532"></a>01532 <span class="comment">// loc = uri_ + loc;</span> <a name="l01533"></a>01533 <a name="l01534"></a>01534 <span class="keywordflow">if</span> ( !loc.empty() && <a name="l01535"></a>01535 loc.find(<span class="stringliteral">"/"</span>,0) != 0 && <span class="comment">// no an asolute path</span> <a name="l01536"></a>01536 loc.find(<span class="stringliteral">"file:/"</span>,0) == std::string::npos && <a name="l01537"></a>01537 loc.find(<span class="stringliteral">"http://"</span>) == std::string::npos) <a name="l01538"></a>01538 loc = uri_ + loc; <a name="l01539"></a>01539 <a name="l01540"></a>01540 <span class="preprocessor">#ifndef _WIN32 </span> <a name="l01541"></a>01541 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!loc.empty()) { <a name="l01542"></a>01542 <a name="l01543"></a>01543 std::string schemaconf= confPath_ + <span class="stringliteral">"schema.conf"</span>; <a name="l01544"></a>01544 <span class="keywordflow">try</span> { <a name="l01545"></a>01545 <a class="code" href="classConfigFile.html">ConfigFile</a> cf(schemaconf); <a name="l01546"></a>01546 cf.readInto<std::string>(loc,loc); <a name="l01547"></a>01547 }<span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="structConfigFile_1_1file__not__found.html">ConfigFile::file_not_found</a> &e) {} <a name="l01548"></a>01548 } <a name="l01549"></a>01549 <span class="preprocessor">#endif</span> <a name="l01550"></a>01550 <span class="preprocessor"></span> <a name="l01551"></a>01551 <span class="keywordflow">if</span>(!loc.empty()) <a name="l01552"></a>01552 { <a name="l01553"></a>01553 <span class="keywordflow">if</span>(<a class="code" href="namespaceXmlUtils.html#a49cb0c0850b4a22b1fe0d5efd7553b01">XmlUtils::fetchUri</a>(loc,xsdFile)) <a name="l01554"></a>01554 { <a name="l01555"></a>01555 <span class="comment">/*</span> <a name="l01556"></a>01556 <span class="comment"> * If the schema definition was retrieved successfully </span> <a name="l01557"></a>01557 <span class="comment"> * process it and add it to list of imported schemas</span> <a name="l01558"></a>01558 <span class="comment"> */</span> <a name="l01559"></a>01559 <a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">SchemaParser</a> *sp = <span class="keyword">new</span> <a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">SchemaParser</a>(xsdFile,ns); <a name="l01560"></a>01560 sp->setUri(uri_); <a name="l01561"></a>01561 <span class="comment">//pass the imports to the new schema parser</span> <a name="l01562"></a>01562 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) { <a name="l01563"></a>01563 <a name="l01564"></a>01564 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) { <a name="l01565"></a>01565 sp->addImport(importedSchemas_[i].sParser); <a name="l01566"></a>01566 } <a name="l01567"></a>01567 } <a name="l01568"></a>01568 <a name="l01569"></a>01569 <span class="keywordflow">if</span>(sp->parseSchemaTag()) <a name="l01570"></a>01570 <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">addImport</a>(sp); <a name="l01571"></a>01571 <span class="keywordflow">else</span> <a name="l01572"></a>01572 error(<span class="stringliteral">"Error while parsing imported namespace "</span>+ns,0); <a name="l01573"></a>01573 <a name="l01574"></a>01574 } <a name="l01575"></a>01575 <span class="keywordflow">else</span>{ <a name="l01576"></a>01576 <a name="l01577"></a>01577 error(<span class="stringliteral">"could not import namespace from location "</span>+loc); <a name="l01578"></a>01578 } <a name="l01579"></a>01579 } <a name="l01580"></a>01580 <span class="keywordflow">else</span>{ <a name="l01581"></a>01581 <span class="comment">// if no location is mentioned ,just add the namespace,types will be resolved later</span> <a name="l01582"></a>01582 <a name="l01583"></a>01583 <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">addImport</a>(ns); <a name="l01584"></a>01584 } <a name="l01585"></a>01585 <a name="l01586"></a>01586 error(<span class="stringliteral">"Imported namespace "</span>+ns+<span class="stringliteral">" from "</span> + loc,2); <a name="l01587"></a>01587 <a name="l01588"></a>01588 <span class="keywordflow">if</span> (loc.empty()) <a name="l01589"></a>01589 error(<span class="stringliteral">"No location supplied for the import"</span>+ns,2); <a name="l01590"></a>01590 <a name="l01591"></a>01591 xParser_-><a class="code" href="classXmlPullParser.html#a12e19fdc259b06078316b861cfaac791">nextTag</a>(); <a name="l01592"></a>01592 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01593"></a>01593 } <a name="l01594"></a>01594 <a name="l01595"></a><a class="code" href="classSchema_1_1SchemaParser.html#adea72dec2bf6296659459642d4291b86">01595</a> <span class="keywordtype">bool</span> <a class="code" href="classSchema_1_1SchemaParser.html#adea72dec2bf6296659459642d4291b86">SchemaParser::isBasicType</a>(<span class="keywordtype">int</span> sType)<span class="keyword"> const</span> <a name="l01596"></a>01596 <span class="keyword"></span>{ <a name="l01597"></a>01597 <span class="keywordflow">if</span> (sType > <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711dafe1e2787d9278ac67be79e01f93f40a5">Schema::XSD_ANYURI</a> || sType <= <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711da0c01ff4fc47f2f6e148f3bc01aee7caf">Schema::XSD_INVALID</a>) <a name="l01598"></a>01598 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01599"></a>01599 <a name="l01600"></a>01600 <span class="keywordflow">else</span> <a name="l01601"></a>01601 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01602"></a>01602 } <a name="l01603"></a>01603 <a name="l01604"></a>01604 <a name="l01605"></a>01605 <span class="comment">//This function gets the id of a type whose Qname is passed.</span> <a name="l01606"></a>01606 <span class="comment">//The Qname struct if it has a prefix must either be a valid namespace</span> <a name="l01607"></a>01607 <span class="comment">//default is http://www.w3.org/2001/XMLSchema</span> <a name="l01608"></a>01608 <span class="comment">//This function has two modes</span> <a name="l01609"></a>01609 <span class="comment">//if 'create' is true a new type is created (for fwd references)</span> <a name="l01610"></a>01610 <span class="comment">//otherwise the existing list of parsed types is used for resolution</span> <a name="l01611"></a>01611 <a name="l01612"></a>01612 <span class="keywordtype">int</span> <a name="l01613"></a><a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">01613</a> <a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">SchemaParser::getTypeId</a>( <span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & type, <span class="keywordtype">bool</span> create) <a name="l01614"></a>01614 { <a name="l01615"></a>01615 std::string typens = type.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l01616"></a>01616 <span class="keywordflow">if</span> (typens.empty()|| <a name="l01617"></a>01617 typens == tnsUri_ || <a name="l01618"></a>01618 typens == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>){ <a name="l01619"></a>01619 <a name="l01620"></a>01620 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#ae38cc3b4c35b897ae0e690ff2d6d8681">getTypeId</a>(type, create); <a name="l01621"></a>01621 } <a name="l01622"></a>01622 <span class="keywordflow">else</span> { <a name="l01623"></a>01623 <span class="comment">//postpone resolution till matchExtRefs is called</span> <a name="l01624"></a>01624 <span class="keywordflow">if</span> (importedSchemas_.size() == 0 && create) { <a name="l01625"></a>01625 <a name="l01626"></a>01626 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#abe499b2221b242a9c604c7d41cc4c28a">addExternalTypeId</a>(type, 0); <a name="l01627"></a>01627 } <a name="l01628"></a>01628 <a name="l01629"></a>01629 <span class="comment">//search in the array of imported schemas</span> <a name="l01630"></a>01630 <span class="keywordtype">int</span> typeId = 0; <a name="l01631"></a>01631 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) { <a name="l01632"></a>01632 <a name="l01633"></a>01633 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == type.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()) { <a name="l01634"></a>01634 <a name="l01635"></a>01635 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) { <a name="l01636"></a>01636 <a name="l01637"></a>01637 typeId = importedSchemas_[i].sParser->getTypeId(type, <span class="keyword">false</span>); <a name="l01638"></a>01638 <span class="comment">//get the type definition from the imported namespace schema parser and </span> <a name="l01639"></a>01639 <span class="comment">// add a reference to the current schema parser</span> <a name="l01640"></a>01640 <span class="keywordflow">if</span> (typeId) { <a name="l01641"></a>01641 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#abe499b2221b242a9c604c7d41cc4c28a">addExternalTypeId</a>(type, <a name="l01642"></a>01642 (<a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *) importedSchemas_[i].sParser->getType(typeId)); <a name="l01643"></a>01643 } <a name="l01644"></a>01644 <span class="keywordflow">else</span> <a name="l01645"></a>01645 <span class="keywordflow">return</span> 0; <a name="l01646"></a>01646 } <a name="l01647"></a>01647 } <a name="l01648"></a>01648 } <a name="l01649"></a>01649 <span class="keywordflow">if</span> (create){ <a name="l01650"></a>01650 <span class="comment">//automatically add an unreferenced namespace as an import</span> <a name="l01651"></a>01651 <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">addImport</a>(type.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()); <a name="l01652"></a>01652 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#abe499b2221b242a9c604c7d41cc4c28a">addExternalTypeId</a>(type, 0); <a name="l01653"></a>01653 } <a name="l01654"></a>01654 } <a name="l01655"></a>01655 <span class="keywordflow">return</span> <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711da0c01ff4fc47f2f6e148f3bc01aee7caf">XSD_INVALID</a>; <a name="l01656"></a>01656 } <a name="l01657"></a>01657 <a name="l01658"></a>01658 <a name="l01659"></a>01659 <span class="comment">//resolves any external references with the imported schemas</span> <a name="l01660"></a>01660 <span class="comment">//This method must be called to ensure resolution of all types</span> <a name="l01661"></a><a class="code" href="classSchema_1_1SchemaParser.html#a14b7afa532833ecace14459384ec6a74">01661</a> <span class="keywordtype">bool</span> <a class="code" href="classSchema_1_1SchemaParser.html#a14b7afa532833ecace14459384ec6a74">SchemaParser::finalize</a>(<span class="keywordtype">void</span>) <a name="l01662"></a>01662 { <a name="l01663"></a>01663 <span class="keywordtype">int</span> unresolved=typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a87f56d64bb7f5d9faaafad78ae5450cb">getNumExtRefs</a>(); <a name="l01664"></a>01664 <span class="keywordflow">if</span>(unresolved > 0) { <a name="l01665"></a>01665 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < unresolved; i++){ <a name="l01666"></a>01666 <a name="l01667"></a>01667 <a class="code" href="classQname.html">Qname</a> & type = typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#ae15e67210a022d01e67d6447f9d67502">getExtRefName</a>(i); <a name="l01668"></a>01668 <span class="keywordtype">int</span> localId = typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#ac95151c9d7ceb76348d8047fad31d34d">getExtRefType</a>(i); <a name="l01669"></a>01669 <a name="l01670"></a>01670 <span class="comment">//search in the array of imported schemas</span> <a name="l01671"></a>01671 <span class="keywordtype">int</span> typeId = 0; <a name="l01672"></a>01672 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> n = 0; n < importedSchemas_.size(); n++) <a name="l01673"></a>01673 { <a name="l01674"></a>01674 <span class="keywordflow">if</span> (importedSchemas_[n].ns == type.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>()) <a name="l01675"></a>01675 { <a name="l01676"></a>01676 <span class="keywordflow">if</span>(importedSchemas_[n].sParser){ <a name="l01677"></a>01677 typeId = importedSchemas_[n].sParser->getTypeId(type); <a name="l01678"></a>01678 <span class="keywordflow">if</span> (typeId != 0) <a name="l01679"></a>01679 typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a79c431d07d932c20b7381ba72ebb4cdb">addExtType</a>((<a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *) importedSchemas_[n].sParser->getType(typeId), <a name="l01680"></a>01680 localId); <a name="l01681"></a>01681 } <a name="l01682"></a>01682 } <a name="l01683"></a>01683 } <a name="l01684"></a>01684 <a name="l01685"></a>01685 <span class="keywordflow">if</span> (typeId == 0) { <a name="l01686"></a>01686 <a name="l01687"></a>01687 logFile_<<<span class="stringliteral">"Undefined type "</span><<type<<std::endl; <a name="l01688"></a>01688 } <a name="l01689"></a>01689 } <a name="l01690"></a>01690 } <a name="l01691"></a>01691 <span class="keywordflow">if</span> (typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a4236e1822d56c6a4bb0ed6f1262e9f0b">detectUndefinedTypes</a>()) <a name="l01692"></a>01692 { <a name="l01693"></a>01693 typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#af17e89b141f33901fd8adcd93d295502">printUndefinedTypes</a>(logFile_);logFile_.flush(); <a name="l01694"></a>01694 logFile_<<<span class="stringliteral">"Unresolved types in namespace "</span><<tnsUri_<<std::endl; <a name="l01695"></a>01695 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01696"></a>01696 } <a name="l01697"></a>01697 <a name="l01698"></a>01698 <span class="keywordflow">else</span>{ <a name="l01699"></a>01699 <a name="l01700"></a>01700 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01701"></a>01701 } <a name="l01702"></a>01702 <a name="l01703"></a>01703 } <a name="l01704"></a>01704 <a name="l01705"></a>01705 <a name="l01706"></a>01706 <span class="comment">//resolves any forward references of the kind<element ref=Qname... ></span> <a name="l01707"></a>01707 <span class="keywordtype">void</span> <a name="l01708"></a>01708 SchemaParser::resolveForwardElementRefs() <a name="l01709"></a>01709 { <a name="l01710"></a>01710 <span class="keywordtype">bool</span> errors=<span class="keyword">false</span>; <a name="l01711"></a>01711 <span class="keywordflow">if</span> (lForwardElemRefs_.empty()) <a name="l01712"></a>01712 <span class="keywordflow">return</span>; <a name="l01713"></a>01713 <span class="keywordflow">for</span> (list < Qname >::iterator pQnames = lForwardElemRefs_.begin(); <a name="l01714"></a>01714 pQnames != lForwardElemRefs_.end(); pQnames++) { <a name="l01715"></a>01715 <a name="l01716"></a>01716 <span class="comment">// cout<<*pQnames<<std::endl;</span> <a name="l01717"></a>01717 <a class="code" href="classSchema_1_1Element.html">Element</a> *e = <span class="keyword">const_cast<</span><a class="code" href="classSchema_1_1Element.html">Element</a>*<span class="keyword">></span>(<a class="code" href="classSchema_1_1SchemaParser.html#aa11d8f9bf85870304ab35e387fd486b1">getElement</a>(*pQnames)); <a name="l01718"></a>01718 <span class="comment">//TODO , in case the forward ref is in an imported schema we cant just copy the type id</span> <a name="l01719"></a>01719 <span class="comment">//it needs to be changed to make it a valid type id in current schema</span> <a name="l01720"></a>01720 <span class="keywordflow">if</span> (e) <a name="l01721"></a>01721 typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a5214c2e934cf4816754827be6eb621c9">resolveForwardElementRefs</a>(pQnames->getLocalName(),*e); <a name="l01722"></a>01722 <span class="keywordflow">else</span> { <a name="l01723"></a>01723 error(<span class="stringliteral">"Could not resolve element reference "</span>+pQnames->getLocalName(),1); <a name="l01724"></a>01724 errors=<span class="keyword">true</span>; <a name="l01725"></a>01725 } <a name="l01726"></a>01726 } <a name="l01727"></a>01727 <span class="keywordflow">if</span>(errors) <a name="l01728"></a>01728 error(<span class="stringliteral">"Unresolved element references"</span>,1); <a name="l01729"></a>01729 } <a name="l01730"></a>01730 <a name="l01731"></a>01731 <a name="l01732"></a>01732 <span class="keywordtype">void</span> <a name="l01733"></a>01733 SchemaParser::resolveForwardAttributeRefs() <a name="l01734"></a>01734 { <a name="l01735"></a>01735 <span class="keywordtype">bool</span> errors=<span class="keyword">false</span>; <a name="l01736"></a>01736 <span class="keywordflow">if</span> (lForwardAttributeRefs_.empty()) <a name="l01737"></a>01737 <span class="keywordflow">return</span>; <a name="l01738"></a>01738 <span class="keywordflow">for</span> (list < Qname >::iterator pQnames = lForwardAttributeRefs_.begin(); <a name="l01739"></a>01739 pQnames != lForwardAttributeRefs_.end(); pQnames++) <a name="l01740"></a>01740 { <a name="l01741"></a>01741 Attribute *a = <a class="code" href="classSchema_1_1SchemaParser.html#a47bd98ca4024da64894ed46ade0f9554">getAttribute</a>(*pQnames); <a name="l01742"></a>01742 <span class="keywordflow">if</span> (a) <a name="l01743"></a>01743 typesTable_.resolveForwardAttributeRefs(pQnames-> getLocalName(), *a); <a name="l01744"></a>01744 <span class="keywordflow">else</span> { <a name="l01745"></a>01745 error(<span class="stringliteral">"Could not resolve attribute reference {"</span>+pQnames->getNamespace() <a name="l01746"></a>01746 +<span class="stringliteral">"}"</span>+pQnames->getLocalName(),1); <a name="l01747"></a>01747 errors=<span class="keyword">true</span>; <a name="l01748"></a>01748 } <a name="l01749"></a>01749 } <a name="l01750"></a>01750 <span class="keywordflow">if</span>(errors) <a name="l01751"></a>01751 error(<span class="stringliteral">"Unresolved attributes references"</span>); <a name="l01752"></a>01752 } <a name="l01753"></a>01753 <a name="l01754"></a>01754 <a name="l01755"></a>01755 <span class="comment">//get the element id of a globally declared element</span> <a name="l01756"></a>01756 <span class="keyword">const</span> Element* <a name="l01757"></a><a class="code" href="classSchema_1_1SchemaParser.html#aa11d8f9bf85870304ab35e387fd486b1">01757</a> <a class="code" href="classSchema_1_1SchemaParser.html#aa11d8f9bf85870304ab35e387fd486b1">SchemaParser::getElement</a>(<span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & element,<span class="keywordtype">bool</span> checkImports)<span class="keyword">const</span> <a name="l01758"></a>01758 <span class="keyword"></span>{ <a name="l01759"></a>01759 std::string typens = element.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l01760"></a>01760 <span class="keywordflow">if</span> (typens.empty()) <a name="l01761"></a>01761 typens = tnsUri_; <a name="l01762"></a>01762 <span class="keywordflow">if</span> (typens== tnsUri_ || typens == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>) <a name="l01763"></a>01763 { <a name="l01764"></a>01764 <span class="keywordtype">int</span> i = 0; <a name="l01765"></a>01765 <span class="comment">//check if it is a global element</span> <a name="l01766"></a>01766 <span class="keywordflow">for</span> (std::list<Element>::const_iterator eli=lElems_.begin(); <a name="l01767"></a>01767 eli!= lElems_.end(); <a name="l01768"></a>01768 eli++,i++) <a name="l01769"></a>01769 <span class="keywordflow">if</span> (eli->getName() == element.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>()) <a name="l01770"></a>01770 <span class="keywordflow">return</span> &(*eli); <a name="l01771"></a>01771 <span class="keywordflow">return</span> 0; <a name="l01772"></a>01772 } <a name="l01773"></a>01773 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (checkImports) <a name="l01774"></a>01774 { <span class="comment">//search imported namespaces</span> <a name="l01775"></a>01775 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) <a name="l01776"></a>01776 { <a name="l01777"></a>01777 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == typens) <a name="l01778"></a>01778 { <a name="l01779"></a>01779 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) <a name="l01780"></a>01780 { <a name="l01781"></a>01781 <span class="keywordflow">return</span> importedSchemas_[i].sParser->getElement(element); <a name="l01782"></a>01782 } <a name="l01783"></a>01783 } <a name="l01784"></a>01784 } <a name="l01785"></a>01785 } <a name="l01786"></a>01786 <span class="keywordflow">return</span> 0; <a name="l01787"></a>01787 } <a name="l01788"></a>01788 <a name="l01789"></a>01789 <span class="comment">//get the attribute id of a globally declared attribute</span> <a name="l01790"></a>01790 <a class="code" href="classSchema_1_1Attribute.html">Attribute</a>* <a name="l01791"></a><a class="code" href="classSchema_1_1SchemaParser.html#a47bd98ca4024da64894ed46ade0f9554">01791</a> <a class="code" href="classSchema_1_1SchemaParser.html#a47bd98ca4024da64894ed46ade0f9554">SchemaParser::getAttribute</a>(<span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & attribute) <a name="l01792"></a>01792 { <a name="l01793"></a>01793 std::string typens = attribute.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l01794"></a>01794 <span class="keywordflow">if</span> (typens.empty()) <a name="l01795"></a>01795 typens = tnsUri_; <a name="l01796"></a>01796 <a name="l01797"></a>01797 <span class="keywordflow">if</span> (typens == tnsUri_ || typens == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>) { <a name="l01798"></a>01798 <span class="comment">//check if it is a global attribute</span> <a name="l01799"></a>01799 <span class="keywordflow">for</span>(std::list<Attribute>::iterator ali=lAttributes_.begin(); <a name="l01800"></a>01800 ali!=lAttributes_.end(); <a name="l01801"></a>01801 ali++) <a name="l01802"></a>01802 <span class="keywordflow">if</span> (ali->getName() == attribute.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>()) <a name="l01803"></a>01803 <span class="keywordflow">return</span> &(*ali); <a name="l01804"></a>01804 }<span class="keywordflow">else</span> { <a name="l01805"></a>01805 <span class="comment">//search imported namespaces</span> <a name="l01806"></a>01806 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) <a name="l01807"></a>01807 { <a name="l01808"></a>01808 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == typens) <a name="l01809"></a>01809 { <a name="l01810"></a>01810 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) <a name="l01811"></a>01811 { <a name="l01812"></a>01812 <span class="keywordflow">return</span> importedSchemas_[i].sParser->getAttribute(attribute); <a name="l01813"></a>01813 } <a name="l01814"></a>01814 } <a name="l01815"></a>01815 } <a name="l01816"></a>01816 } <a name="l01817"></a>01817 <span class="keywordflow">return</span> 0; <a name="l01818"></a>01818 } <a name="l01819"></a>01819 <a name="l01820"></a>01820 <span class="comment">//get the element id of a globally declared element</span> <a name="l01821"></a>01821 <a class="code" href="classSchema_1_1Group.html">Group</a>* <a name="l01822"></a><a class="code" href="classSchema_1_1SchemaParser.html#a0ebc5538bb373dd99c04b3485462acfa">01822</a> <a class="code" href="classSchema_1_1SchemaParser.html#a0ebc5538bb373dd99c04b3485462acfa">SchemaParser::getGroup</a>(<span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & name) <a name="l01823"></a>01823 { <a name="l01824"></a>01824 std::string typens = name.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l01825"></a>01825 <span class="keywordflow">if</span> (typens.empty()) <a name="l01826"></a>01826 typens = tnsUri_; <a name="l01827"></a>01827 <span class="keywordflow">if</span> (typens== tnsUri_ || typens == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>) <a name="l01828"></a>01828 { <a name="l01829"></a>01829 <a name="l01830"></a>01830 <span class="comment">//check if it is a global group</span> <a name="l01831"></a>01831 <span class="keywordflow">for</span> (std::list<Group>::iterator gli =lGroups_.begin(); <a name="l01832"></a>01832 gli!= lGroups_.end(); <a name="l01833"></a>01833 gli++) <a name="l01834"></a>01834 <span class="keywordflow">if</span> (gli->getName() == name.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>()) <a name="l01835"></a>01835 <span class="keywordflow">return</span> &(*gli); <a name="l01836"></a>01836 <span class="keywordflow">return</span> 0; <a name="l01837"></a>01837 } <a name="l01838"></a>01838 <span class="keywordflow">else</span> <a name="l01839"></a>01839 { <span class="comment">//search imported namespaces</span> <a name="l01840"></a>01840 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) <a name="l01841"></a>01841 { <a name="l01842"></a>01842 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == typens) <a name="l01843"></a>01843 { <a name="l01844"></a>01844 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) <a name="l01845"></a>01845 { <a name="l01846"></a>01846 <span class="keywordflow">return</span> importedSchemas_[i].sParser->getGroup(name); <a name="l01847"></a>01847 } <a name="l01848"></a>01848 } <a name="l01849"></a>01849 } <a name="l01850"></a>01850 } <a name="l01851"></a>01851 <span class="keywordflow">return</span> 0; <a name="l01852"></a>01852 } <a name="l01853"></a>01853 <a name="l01854"></a>01854 <a class="code" href="classSchema_1_1AttributeGroup.html">AttributeGroup</a>* <a name="l01855"></a><a class="code" href="classSchema_1_1SchemaParser.html#af7b03dfae9c493636019f1851a57e6f5">01855</a> <a class="code" href="classSchema_1_1SchemaParser.html#af7b03dfae9c493636019f1851a57e6f5">SchemaParser::getAttributeGroup</a>(<span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & name) <a name="l01856"></a>01856 { <a name="l01857"></a>01857 std::string typens = name.<a class="code" href="classQname.html#ab7b6decf0167443096f034cd33c7d839">getNamespace</a>(); <a name="l01858"></a>01858 <span class="keywordflow">if</span> (typens.empty()) <a name="l01859"></a>01859 typens = tnsUri_; <a name="l01860"></a>01860 <span class="keywordflow">if</span> (typens== tnsUri_ || typens == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>) <a name="l01861"></a>01861 { <a name="l01862"></a>01862 <a name="l01863"></a>01863 <span class="comment">//check if it is a global group</span> <a name="l01864"></a>01864 <span class="keywordflow">for</span> (AttributeGroupList::iterator agli = lAttributeGroups_.begin(); <a name="l01865"></a>01865 agli!= lAttributeGroups_.end(); <a name="l01866"></a>01866 agli++) <a name="l01867"></a>01867 <span class="keywordflow">if</span> ((*agli)->getName() == name.<a class="code" href="classQname.html#acc177c6742061f76a3f09a3898256bf2">getLocalName</a>()) <a name="l01868"></a>01868 <span class="keywordflow">return</span> (*agli); <a name="l01869"></a>01869 <span class="keywordflow">return</span> 0; <a name="l01870"></a>01870 } <a name="l01871"></a>01871 <span class="keywordflow">else</span> <a name="l01872"></a>01872 { <span class="comment">//search imported namespaces</span> <a name="l01873"></a>01873 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) <a name="l01874"></a>01874 { <a name="l01875"></a>01875 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == typens) <a name="l01876"></a>01876 { <a name="l01877"></a>01877 <span class="keywordflow">if</span>(importedSchemas_[i].sParser ) <a name="l01878"></a>01878 { <a name="l01879"></a>01879 <span class="keywordflow">return</span> importedSchemas_[i].sParser->getAttributeGroup(name); <a name="l01880"></a>01880 } <a name="l01881"></a>01881 } <a name="l01882"></a>01882 } <a name="l01883"></a>01883 } <a name="l01884"></a>01884 <span class="keywordflow">return</span> 0; <a name="l01885"></a>01885 } <a name="l01886"></a>01886 <a name="l01887"></a>01887 std::string <a name="l01888"></a><a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">01888</a> <a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">SchemaParser::getNamespace</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span> <a name="l01889"></a>01889 <span class="keyword"></span>{ <a name="l01890"></a>01890 <span class="keywordflow">return</span> tnsUri_; <a name="l01891"></a>01891 } <a name="l01892"></a>01892 <a name="l01893"></a>01893 <a name="l01894"></a>01894 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> * <a name="l01895"></a><a class="code" href="classSchema_1_1SchemaParser.html#ae544d4d2df1ca02efc42dfa9d5630d6c">01895</a> <a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">SchemaParser::getType</a>(<span class="keywordtype">int</span> <span class="keywordtype">id</span>)<span class="keyword"> const</span> <a name="l01896"></a>01896 <span class="keyword"></span>{ <a name="l01897"></a>01897 <span class="keywordflow">return</span> (<span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *) typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a545c3d32a0232f75b47aeaeda6ff7bda">getTypePtr</a>(<span class="keywordtype">id</span>); <a name="l01898"></a>01898 } <a name="l01899"></a>01899 <a name="l01900"></a>01900 <a name="l01901"></a>01901 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> * <a name="l01902"></a><a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">01902</a> <a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">SchemaParser::getType</a>(<span class="keyword">const</span> <a class="code" href="classQname.html">Qname</a> & type,<span class="keywordtype">bool</span> checkImports ) <a name="l01903"></a>01903 { <a name="l01904"></a>01904 <span class="keywordtype">int</span> id; <a name="l01905"></a>01905 <a class="code" href="classQname.html">Qname</a> t=type; <a name="l01906"></a>01906 <a name="l01907"></a>01907 <span class="keywordflow">if</span>((<span class="keywordtype">id</span>=<a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(t,<span class="keyword">false</span>))==0) <a name="l01908"></a>01908 <span class="keywordflow">return</span> 0; <a name="l01909"></a>01909 <span class="keywordflow">else</span> { <a name="l01910"></a>01910 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a>* pType = (<span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *) typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a545c3d32a0232f75b47aeaeda6ff7bda">getTypePtr</a>(<span class="keywordtype">id</span>); <a name="l01911"></a>01911 <span class="keywordflow">if</span> (!checkImports) { <a name="l01912"></a>01912 <a name="l01913"></a>01913 <span class="keywordflow">if</span>(pType-><a class="code" href="classSchema_1_1XSDType.html#a0f61cf178c30a0afd00ef29ba82bcc98">getNamespace</a>() != tnsUri_) <a name="l01914"></a>01914 <span class="keywordflow">return</span> 0; <a name="l01915"></a>01915 <a name="l01916"></a>01916 } <a name="l01917"></a>01917 <span class="keywordflow">return</span> pType; <a name="l01918"></a>01918 } <a name="l01919"></a>01919 } <a name="l01920"></a>01920 <a name="l01921"></a>01921 <a name="l01922"></a>01922 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> * <a name="l01923"></a><a class="code" href="classSchema_1_1SchemaParser.html#a64b8d5b094b9387840cd1cbea3f03f46">01923</a> <a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">SchemaParser::getType</a>(<span class="keywordtype">int</span> <span class="keywordtype">id</span>, std::string &nameSpace) <a name="l01924"></a>01924 { <a name="l01925"></a>01925 <span class="keyword">const</span> <a class="code" href="classSchema_1_1SchemaParser.html">SchemaParser</a> *sp = <a class="code" href="classSchema_1_1SchemaParser.html#a7075e1bb5d4454c04fbdd0fadcc5f828">getImportedSchema</a>(nameSpace); <a name="l01926"></a>01926 <span class="keywordflow">if</span> (sp == NULL) <a name="l01927"></a>01927 { <a name="l01928"></a>01928 <span class="keywordflow">return</span> 0; <a name="l01929"></a>01929 } <a name="l01930"></a>01930 <span class="keywordflow">else</span> <a name="l01931"></a>01931 { <a name="l01932"></a>01932 <span class="keywordflow">return</span> sp-><a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">getType</a>(<span class="keywordtype">id</span>); <a name="l01933"></a>01933 } <a name="l01934"></a>01934 } <a name="l01935"></a>01935 <a name="l01936"></a>01936 <span class="keyword">const</span> <a class="code" href="classSchema_1_1SchemaParser.html">SchemaParser</a> * <a name="l01937"></a><a class="code" href="classSchema_1_1SchemaParser.html#a7075e1bb5d4454c04fbdd0fadcc5f828">01937</a> <a class="code" href="classSchema_1_1SchemaParser.html#a7075e1bb5d4454c04fbdd0fadcc5f828">SchemaParser::getImportedSchema</a>(std::string &nameSpace) <a name="l01938"></a>01938 { <a name="l01939"></a>01939 <span class="keywordflow">if</span> (nameSpace.empty()|| nameSpace == tnsUri_ || nameSpace == <a class="code" href="namespaceSchema.html#a72d35008bb7fd2d8627e8347240e7d98">Schema::SchemaUri</a>) <a name="l01940"></a>01940 { <a name="l01941"></a>01941 <span class="keywordflow">return</span> <span class="keyword">this</span>; <a name="l01942"></a>01942 } <a name="l01943"></a>01943 <a name="l01944"></a>01944 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < importedSchemas_.size(); i++) <a name="l01945"></a>01945 { <a name="l01946"></a>01946 <span class="keywordflow">if</span> ( importedSchemas_[i].ns == nameSpace) <a name="l01947"></a>01947 { <a name="l01948"></a>01948 <span class="keywordflow">return</span> importedSchemas_[i].sParser; <a name="l01949"></a>01949 } <a name="l01950"></a>01950 } <a name="l01951"></a>01951 <span class="keywordflow">return</span> NULL; <a name="l01952"></a>01952 } <a name="l01953"></a>01953 <a name="l01954"></a>01954 list < const XSDType *>* <a name="l01955"></a><a class="code" href="classSchema_1_1SchemaParser.html#a8504fe37fc887f27480dd36e8deeef99">01955</a> <a class="code" href="classSchema_1_1SchemaParser.html#a8504fe37fc887f27480dd36e8deeef99">SchemaParser::getAllTypes</a>()<span class="keyword"> const</span> <a name="l01956"></a>01956 <span class="keyword"></span>{ <a name="l01957"></a>01957 list < const XSDType *>*pLTypes = <span class="keyword">new</span> list < const XSDType * >; <a name="l01958"></a>01958 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="classSchema_1_1SchemaParser.html#a648f733fd3b058ffb82b8d25359abae6">getNumTypes</a>(); i++) <a name="l01959"></a>01959 { <a name="l01960"></a>01960 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *pType = <a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">getType</a>(i + <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711dafe1e2787d9278ac67be79e01f93f40a5">Schema::XSD_ANYURI</a> + 1); <a name="l01961"></a>01961 pLTypes->push_back(pType); <a name="l01962"></a>01962 } <a name="l01963"></a>01963 <span class="keywordflow">return</span> pLTypes; <a name="l01964"></a>01964 } <a name="l01965"></a>01965 <a name="l01966"></a>01966 <a name="l01967"></a>01967 <span class="keywordtype">int</span> <a name="l01968"></a><a class="code" href="classSchema_1_1SchemaParser.html#a648f733fd3b058ffb82b8d25359abae6">01968</a> <a class="code" href="classSchema_1_1SchemaParser.html#a648f733fd3b058ffb82b8d25359abae6">SchemaParser::getNumTypes</a>()<span class="keyword"> const</span> <a name="l01969"></a>01969 <span class="keyword"></span>{ <a name="l01970"></a>01970 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a9ada8d390149be21b8f3bd9183b7186f">getNumTypes</a>(); <a name="l01971"></a>01971 } <a name="l01972"></a>01972 <a name="l01973"></a>01973 <a name="l01974"></a>01974 <span class="keywordtype">int</span> <a name="l01975"></a><a class="code" href="classSchema_1_1SchemaParser.html#aad15ce5731f98126124b35ee2b982d40">01975</a> <a class="code" href="classSchema_1_1SchemaParser.html#aad15ce5731f98126124b35ee2b982d40">SchemaParser::getNumElements</a>()<span class="keyword"> const</span> <a name="l01976"></a>01976 <span class="keyword"></span>{ <a name="l01977"></a>01977 <span class="keywordflow">return</span> lElems_.size(); <a name="l01978"></a>01978 } <a name="l01979"></a>01979 <a name="l01980"></a>01980 <a name="l01981"></a>01981 <span class="keywordtype">int</span> <a name="l01982"></a><a class="code" href="classSchema_1_1SchemaParser.html#a03737b95f34a4b8a48fbb4f55ed7cfd2">01982</a> <a class="code" href="classSchema_1_1SchemaParser.html#a03737b95f34a4b8a48fbb4f55ed7cfd2">SchemaParser::getNumAttributes</a>()<span class="keyword"> const</span> <a name="l01983"></a>01983 <span class="keyword"></span>{ <a name="l01984"></a>01984 <span class="keywordflow">return</span> lAttributes_.size(); <a name="l01985"></a>01985 } <a name="l01986"></a>01986 <a name="l01987"></a>01987 <span class="comment">//To be deprecated</span> <a name="l01988"></a>01988 <span class="keywordtype">bool</span> <a name="l01989"></a><a class="code" href="classSchema_1_1SchemaParser.html#a3c1cd49cbd366366b4127a7d64252a2d">01989</a> <a class="code" href="classSchema_1_1SchemaParser.html#a3c1cd49cbd366366b4127a7d64252a2d">SchemaParser::addImports</a>(<span class="keyword">const</span> std::vector<SchemaParser *> & schemaParsers) <a name="l01990"></a>01990 { <a name="l01991"></a>01991 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0;i<schemaParsers.size() ;i++){ <a name="l01992"></a>01992 <a name="l01993"></a>01993 <span class="keywordflow">if</span>(schemaParsers[i]-><a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>()!=tnsUri_){ <a name="l01994"></a>01994 <a name="l01995"></a>01995 <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">addImport</a>(schemaParsers[i]); <a name="l01996"></a>01996 } <a name="l01997"></a>01997 } <a name="l01998"></a>01998 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01999"></a>01999 } <a name="l02000"></a>02000 <a name="l02001"></a>02001 <span class="keywordtype">bool</span> <a name="l02002"></a><a class="code" href="classSchema_1_1SchemaParser.html#a845bb71f97cba857e34d0c69d696ca02">02002</a> <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">SchemaParser::addImport</a>(<a class="code" href="classSchema_1_1SchemaParser.html">SchemaParser</a> *sp) <a name="l02003"></a>02003 { <a name="l02004"></a>02004 <span class="comment">//check if the namespace is added in the import list</span> <a name="l02005"></a>02005 <span class="keywordtype">int</span> i= checkImport(sp-><a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>()); <a name="l02006"></a>02006 <span class="comment">// std::cout<<"Copying imports to "<<sp->tnsUri_<<std::endl;</span> <a name="l02007"></a>02007 <span class="comment">// sp->copyImports(this);</span> <a name="l02008"></a>02008 <span class="keywordflow">if</span>(i>=0) { <a name="l02009"></a>02009 importedSchemas_[i].sParser=sp; <a name="l02010"></a>02010 importedSchemas_[i].ns=sp-><a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(); <a name="l02011"></a>02011 } <a name="l02012"></a>02012 <span class="keywordflow">else</span> { <a name="l02013"></a>02013 <span class="comment">//if this was a new import increment</span> <a name="l02014"></a>02014 <a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html">ImportedSchema</a> imp; <a name="l02015"></a>02015 imp.<a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html#a2512ce0c8e71c410bd4f70e548a00b1c">sParser</a>=sp; <a name="l02016"></a>02016 imp.<a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html#a4f84a9b9ab0dfc04c75659660096f65e">ns</a>=sp-><a class="code" href="classSchema_1_1SchemaParser.html#a64e1a1534e45266a717fd1c52cbb337c">getNamespace</a>(); <a name="l02017"></a>02017 importedSchemas_.push_back(imp); <a name="l02018"></a>02018 } <a name="l02019"></a>02019 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02020"></a>02020 } <a name="l02021"></a>02021 <a name="l02022"></a>02022 <span class="keywordtype">void</span> <a name="l02023"></a>02023 SchemaParser::copyImports(<a class="code" href="classSchema_1_1SchemaParser.html">SchemaParser</a> * sp) <a name="l02024"></a>02024 { <a name="l02025"></a>02025 <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0;i<importedSchemas_.size();i++) { <a name="l02026"></a>02026 <a name="l02027"></a>02027 <span class="keywordflow">if</span> (importedSchemas_[i].sParser) <a name="l02028"></a>02028 sp-><a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">addImport</a>(importedSchemas_[i].sParser); <a name="l02029"></a>02029 } <a name="l02030"></a>02030 } <a name="l02031"></a>02031 <a name="l02032"></a>02032 <span class="keywordtype">int</span> <a name="l02033"></a>02033 SchemaParser::checkImport(std::string nsp)<span class="keyword">const</span> <a name="l02034"></a>02034 <span class="keyword"></span>{ <a name="l02035"></a>02035 <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0;i<importedSchemas_.size();i++) <a name="l02036"></a>02036 { <a name="l02037"></a>02037 <span class="keywordflow">if</span>(importedSchemas_[i].ns==nsp) <a name="l02038"></a>02038 <span class="keywordflow">return</span> i; <a name="l02039"></a>02039 } <a name="l02040"></a>02040 <span class="keywordflow">return</span> -1; <a name="l02041"></a>02041 } <a name="l02042"></a>02042 <a name="l02043"></a>02043 <span class="keywordtype">bool</span> <a name="l02044"></a><a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">02044</a> <a class="code" href="classSchema_1_1SchemaParser.html#af01538823b660050028b2b52071f031f">SchemaParser::addImport</a>(std::string ns, <a name="l02045"></a>02045 std::string location) <a name="l02046"></a>02046 { <a name="l02047"></a>02047 <a name="l02048"></a>02048 <span class="keywordtype">int</span> i= checkImport(ns); <a name="l02049"></a>02049 <span class="keywordflow">if</span>(i==-1) { <a name="l02050"></a>02050 <a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html">ImportedSchema</a> imp; <a name="l02051"></a>02051 imp.<a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html#a2512ce0c8e71c410bd4f70e548a00b1c">sParser</a>=0; <a name="l02052"></a>02052 imp.<a class="code" href="structSchema_1_1SchemaParser_1_1ImportedSchema.html#a4f84a9b9ab0dfc04c75659660096f65e">ns</a>=ns; <a name="l02053"></a>02053 importedSchemas_.push_back(imp); <a name="l02054"></a>02054 i =importedSchemas_.size()-1; <a name="l02055"></a>02055 }<span class="keywordflow">else</span> { <a name="l02056"></a>02056 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02057"></a>02057 } <a name="l02058"></a>02058 <a name="l02059"></a>02059 <span class="keywordflow">if</span>(location.empty()) <a name="l02060"></a>02060 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02061"></a>02061 std::string xsdFile; <a name="l02062"></a>02062 <span class="keywordflow">if</span>(<a class="code" href="namespaceXmlUtils.html#a49cb0c0850b4a22b1fe0d5efd7553b01">XmlUtils::fetchUri</a>(location,xsdFile)) <a name="l02063"></a>02063 { <a name="l02064"></a>02064 <span class="comment">/*</span> <a name="l02065"></a>02065 <span class="comment"> * If the schema definition was retrieved successfully </span> <a name="l02066"></a>02066 <span class="comment"> * process it and add it to list of imported schemas</span> <a name="l02067"></a>02067 <span class="comment"> */</span> <a name="l02068"></a>02068 <a class="code" href="classSchema_1_1SchemaParser.html">SchemaParser</a> *sp = <span class="keyword">new</span> <a class="code" href="classSchema_1_1SchemaParser.html#a1c3f89d88098fdaee9705dd2b599819e">SchemaParser</a>(xsdFile,ns); <a name="l02069"></a>02069 sp-><a class="code" href="classSchema_1_1SchemaParser.html#a3b34d1a790d25778b56df0bf07a01a30">setUri</a>(uri_); <a name="l02070"></a>02070 <span class="keywordflow">if</span>(sp-><a class="code" href="classSchema_1_1SchemaParser.html#a6f1dddf50bcb4dec24df5334971400c0">parseSchemaTag</a>()) <a name="l02071"></a>02071 { <a name="l02072"></a>02072 importedSchemas_[i].sParser=sp; <a name="l02073"></a>02073 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02074"></a>02074 } <a name="l02075"></a>02075 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l02076"></a>02076 } <a name="l02077"></a>02077 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l02078"></a>02078 <a name="l02079"></a>02079 } <a name="l02080"></a>02080 <a name="l02081"></a>02081 <a name="l02082"></a>02082 <span class="keywordtype">void</span> SchemaParser::error(std::string mesg, <span class="keywordtype">int</span> level) <a name="l02083"></a>02083 { <a name="l02084"></a>02084 <a name="l02085"></a>02085 <span class="keywordflow">if</span> (level == 0) { <a name="l02086"></a>02086 <a name="l02087"></a>02087 <a class="code" href="classSchema_1_1SchemaParserException.html">SchemaParserException</a> spe(mesg + <span class="stringliteral">"\nFatal Error in SchemaParser\n"</span>); <a name="l02088"></a>02088 spe.line = xParser_-><a class="code" href="classXmlPullParser.html#a85f448552915586aa04c44a7d16e8e48">getLineNumber</a>(); <a name="l02089"></a>02089 spe.col = xParser_-><a class="code" href="classXmlPullParser.html#a81379b1abbe24acb76739836c51563b1">getColumnNumber</a>(); <a name="l02090"></a>02090 <span class="keywordflow">throw</span> spe; <a name="l02091"></a>02091 } <a name="l02092"></a>02092 <a name="l02093"></a>02093 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (level_ >=1 && level == 1){ <a name="l02094"></a>02094 <a name="l02095"></a>02095 logFile_ << <span class="stringliteral">"Error @"</span> << xParser_-> <a name="l02096"></a>02096 getLineNumber() << <span class="stringliteral">":"</span> << xParser_-> <a name="l02097"></a>02097 getColumnNumber() << <a class="code" href="namespaceXmlUtils.html#ae0e3faa27567770a885ba4e4e187844e">XmlUtils::dbsp</a> << mesg << endl; <a name="l02098"></a>02098 } <a name="l02099"></a>02099 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (level_ >= 2 && level == 2) { <a name="l02100"></a>02100 <a name="l02101"></a>02101 logFile_ << <span class="stringliteral">"Alert @"</span> << xParser_-> <a name="l02102"></a>02102 getLineNumber() << <span class="stringliteral">":"</span> << xParser_-> <a name="l02103"></a>02103 getColumnNumber() << <a class="code" href="namespaceXmlUtils.html#ae0e3faa27567770a885ba4e4e187844e">XmlUtils::dbsp</a> << mesg << endl; <a name="l02104"></a>02104 <a name="l02105"></a>02105 } <a name="l02106"></a>02106 } <a name="l02107"></a>02107 <a name="l02108"></a>02108 <a name="l02109"></a>02109 <span class="keywordtype">int</span> <a name="l02110"></a><a class="code" href="classSchema_1_1SchemaParser.html#a9ae0bb284b527910e9c5a7373ebb2b24">02110</a> <a class="code" href="classSchema_1_1SchemaParser.html#a9ae0bb284b527910e9c5a7373ebb2b24">SchemaParser::getBasicContentType</a>(<span class="keywordtype">int</span> typeId)<span class="keyword">const</span> <a name="l02111"></a>02111 <span class="keyword"></span>{ <a name="l02112"></a>02112 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *pType = <a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">getType</a>(typeId); <a name="l02113"></a>02113 <span class="keywordtype">int</span> <span class="keywordtype">id</span> = typeId; <a name="l02114"></a>02114 <span class="keywordflow">if</span> (pType != 0) { <a name="l02115"></a>02115 <a name="l02116"></a>02116 <span class="comment">/* </span> <a name="l02117"></a>02117 <span class="comment"> It could be a complex type with</span> <a name="l02118"></a>02118 <span class="comment"> simple content or a schema defined simpleType</span> <a name="l02119"></a>02119 <span class="comment"> */</span> <a name="l02120"></a>02120 <span class="keywordflow">if</span> (pType-><a class="code" href="classSchema_1_1XSDType.html#a6f87708ce2ba5f5ec7a7b3f5e7e0007b">isSimple</a>() == <span class="keyword">false</span>){ <a name="l02121"></a>02121 <a name="l02122"></a>02122 <span class="keyword">const</span> <a class="code" href="classSchema_1_1ComplexType.html">ComplexType</a> * cType= <span class="keyword">static_cast<</span><span class="keyword">const </span><a class="code" href="classSchema_1_1ComplexType.html">ComplexType</a>*<span class="keyword">></span> (pType); <a name="l02123"></a>02123 <a name="l02124"></a>02124 <span class="keywordflow">if</span>(cType-><a class="code" href="classSchema_1_1XSDType.html#a4e1831007feec63c1a279cf16415e987">getContentModel</a>()==<a class="code" href="namespaceSchema.html#a84b8523395bb986be4b87ff834308103ac32a5decc6e36a85f67c84470f71967f">Schema::Simple</a>){ <a name="l02125"></a>02125 <a name="l02126"></a>02126 <span class="keywordtype">id</span> = cType-><a class="code" href="classSchema_1_1ComplexType.html#a436ce9ff7dae1815505bf179306b0938">getContentType</a>(); <a name="l02127"></a>02127 } <a name="l02128"></a>02128 <span class="keywordflow">else</span> { <a name="l02129"></a>02129 <a name="l02130"></a>02130 <span class="keywordflow">return</span> <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711da0c01ff4fc47f2f6e148f3bc01aee7caf">Schema::XSD_INVALID</a>; <a name="l02131"></a>02131 } <a name="l02132"></a>02132 } <a name="l02133"></a>02133 <span class="keywordflow">else</span>{ <a name="l02134"></a>02134 <a name="l02135"></a>02135 <span class="keywordtype">id</span> = (<span class="keyword">static_cast<</span><span class="keyword">const </span><a class="code" href="classSchema_1_1SimpleType.html">SimpleType</a> *<span class="keyword">></span>(pType))->getBaseTypeId(); <a name="l02136"></a>02136 } <a name="l02137"></a>02137 <span class="keywordtype">id</span> = <a class="code" href="classSchema_1_1SchemaParser.html#a9ae0bb284b527910e9c5a7373ebb2b24">getBasicContentType</a>(<span class="keywordtype">id</span>); <a name="l02138"></a>02138 } <a name="l02139"></a>02139 <span class="keywordflow">return</span> id; <a name="l02140"></a>02140 } <a name="l02141"></a>02141 <a name="l02142"></a>02142 std::string <a name="l02143"></a><a class="code" href="classSchema_1_1SchemaParser.html#aa92a73e7ae4a81583348e682e7f54f96">02143</a> <a class="code" href="classSchema_1_1SchemaParser.html#aa92a73e7ae4a81583348e682e7f54f96">SchemaParser::getTypeName</a>(<a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711d">Schema::Type</a> t)<span class="keyword">const</span> <a name="l02144"></a>02144 <span class="keyword"></span>{ <a name="l02145"></a>02145 <span class="keywordflow">if</span> (<a class="code" href="classSchema_1_1SchemaParser.html#adea72dec2bf6296659459642d4291b86">isBasicType</a>(t)){ <a name="l02146"></a>02146 <span class="keywordflow">return</span> typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a7c638ba8b3f93bce6d5b252357c9dcd5">getAtomicTypeName</a>(t); <a name="l02147"></a>02147 } <a name="l02148"></a>02148 <span class="keywordflow">else</span> { <a name="l02149"></a>02149 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> * pType = (<span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> *) typesTable_.<a class="code" href="classSchema_1_1TypesTable.html#a545c3d32a0232f75b47aeaeda6ff7bda">getTypePtr</a>(t); <a name="l02150"></a>02150 <span class="keywordflow">if</span> (pType) <a name="l02151"></a>02151 <span class="keywordflow">return</span> pType-><a class="code" href="classSchema_1_1XSDType.html#ab2bf5bd951cc67fe5dd710532af0bfac">getName</a>(); <a name="l02152"></a>02152 } <a name="l02153"></a>02153 <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l02154"></a>02154 } <a name="l02155"></a>02155 <a name="l02156"></a>02156 <a name="l02157"></a>02157 <span class="comment">//handle soap arrays .this is really a special case.more like a hack</span> <a name="l02158"></a>02158 <span class="keywordtype">bool</span> <a name="l02159"></a>02159 SchemaParser::makeListFromSoapArray (<a class="code" href="classSchema_1_1ComplexType.html">ComplexType</a> * ct) <a name="l02160"></a>02160 { <a name="l02161"></a>02161 <span class="keyword">const</span> <a class="code" href="classSchema_1_1XSDType.html">XSDType</a> * baseType=<a class="code" href="classSchema_1_1SchemaParser.html#a8f4e9997d8d4d84f37e33e425e3185c1">getType</a>(ct-><a class="code" href="classSchema_1_1XSDType.html#ae423450dc2aaf5c60070b56340b48e2e">getBaseTypeId</a>()); <a name="l02162"></a>02162 <span class="keywordflow">if</span> (baseType) { <a name="l02163"></a>02163 <span class="keywordflow">if</span>(baseType-><a class="code" href="classSchema_1_1XSDType.html#a0f61cf178c30a0afd00ef29ba82bcc98">getNamespace</a>()== <span class="stringliteral">"http://schemas.xmlsoap.org/soap/encoding/"</span> && <a name="l02164"></a>02164 baseType-><a class="code" href="classSchema_1_1XSDType.html#ab2bf5bd951cc67fe5dd710532af0bfac">getName</a>()==<span class="stringliteral">"Array"</span>){ <a name="l02165"></a>02165 <a name="l02166"></a>02166 <span class="keyword">const</span> <a class="code" href="classSchema_1_1Attribute.html">Attribute</a>* a = ct-><a class="code" href="classSchema_1_1ComplexType.html#a434a6364bf3b9107e4a0a7e697c0e0b3">getAttribute</a>(<span class="stringliteral">"arrayType"</span>); <a name="l02167"></a>02167 <span class="keywordflow">if</span> (!a) <a name="l02168"></a>02168 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l02169"></a>02169 <a name="l02170"></a>02170 std::string array = a-><a class="code" href="classSchema_1_1Attribute.html#add1aca16644e3b2fe101a4459df9ce99">defaultVal</a>(); <a name="l02171"></a>02171 <a class="code" href="classQname.html">Qname</a> q(array); <a name="l02172"></a>02172 array = q.getLocalName(); <a name="l02173"></a>02173 <span class="keywordflow">while</span> (array[array.length()-1] ==<span class="charliteral">']'</span> && <a name="l02174"></a>02174 array[array.length()-2] ==<span class="charliteral">'['</span>) <a name="l02175"></a>02175 array = array.substr(0,array.length()-2); <a name="l02176"></a>02176 <a name="l02177"></a>02177 std::string arrayNs = xParser_-><a class="code" href="classXmlPullParser.html#ab64f42eff37c0c049024c8267f0732e8">getNamespace</a>(q.getPrefix()); <a name="l02178"></a>02178 q = <a class="code" href="classQname.html">Qname</a>(array); <a name="l02179"></a>02179 q.setNamespace(arrayNs); <a name="l02180"></a>02180 <a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711d">Schema::Type</a> t = (<a class="code" href="namespaceSchema.html#acbe1398d097409fb3c2f948fa876711d">Schema::Type</a>)<a class="code" href="classSchema_1_1SchemaParser.html#ad8f407de76f38f1fa24c844faf9ca611">getTypeId</a>(q,<span class="keyword">true</span>); <a name="l02181"></a>02181 <a class="code" href="classSchema_1_1Element.html">Element</a> e(<span class="stringliteral">"*"</span>,tnsUri_,tnsUri_,t,0,<a class="code" href="Element_8h.html#af17df4d5d5bad0ea1d48fa796a91d4ce">UNBOUNDED</a>); <a name="l02182"></a>02182 <span class="keywordflow">if</span> (ct-><a class="code" href="classSchema_1_1ComplexType.html#a1a76250fcf51c807803c1fb929fdf628">getContents</a>() == 0){ <a name="l02183"></a>02183 <a class="code" href="classSchema_1_1ContentModel.html">ContentModel</a> * cm = <span class="keyword">new</span> <a class="code" href="classSchema_1_1ContentModel.html">ContentModel</a>(<a class="code" href="namespaceSchema.html#a1adfaf18fd7d826648b3d01d953a434ca24a2a381feadbd50e8005da5f7dbffca">Schema::Sequence</a>); <a name="l02184"></a>02184 ct-><a class="code" href="classSchema_1_1ComplexType.html#ac983adf971998d67f1c9bc9b7a61766a">setContents</a>(cm); <a name="l02185"></a>02185 } <a name="l02186"></a>02186 ct-><a class="code" href="classSchema_1_1ComplexType.html#a1a76250fcf51c807803c1fb929fdf628">getContents</a>()->addElement(e); <a name="l02187"></a>02187 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l02188"></a>02188 } <a name="l02189"></a>02189 } <a name="l02190"></a>02190 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l02191"></a>02191 } <a name="l02192"></a>02192 } </pre></div></div> <!--- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Defines</a></div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <hr class="footer"/><address style="text-align: right;"><small>Generated by <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2-20100208 </small></address> </body> </html>