00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _SCHEMAPARSERH
00022 #define _SCHEMAPARSERH
00023
00024
00025 #include "xmlpull/wsdlpull_export.h"
00026 #include "xmlpull/XmlPullParser.h"
00027 #include "xmlpull/XmlPullParserException.h"
00028 #include "schemaparser/Schema.h"
00029 #include "schemaparser/SchemaParserException.h"
00030 #include "schemaparser/Group.h"
00031 #include "schemaparser/Element.h"
00032 #include "schemaparser/Constraint.h"
00033 #include "schemaparser/AttributeGroup.h"
00034 #include "schemaparser/ComplexType.h"
00035 #include "schemaparser/SimpleType.h"
00036 #include "schemaparser/TypesTable.h"
00037
00038
00039 namespace Schema {
00040
00041
00042 class WSDLPULL_EXPORT SchemaParser
00043 {
00044 public:
00045
00046
00047
00048
00049
00050 typedef std::list<Element> ElementList;
00051 typedef std::list<Attribute> AttributeList;
00052 typedef std::list<Group> GroupList;
00053 typedef std::list<AttributeGroup*> AttributeGroupList;
00054 typedef std::list<Constraint*> ConstraintList;
00055 typedef std::list<Qname> QNameList;
00056 typedef std::list < const XSDType *> ConstTypeList;
00057
00058 typedef struct
00059 {
00060 SchemaParser* sParser;
00061 std::string ns;
00062 } ImportedSchema ;
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 SchemaParser(const std::string& Uri, std::string tns = "",
00079 std::ostream & log = std::cout,const std::string & confPath="");
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 SchemaParser(XmlPullParser * parser, std::string tns = "",
00091 std::ostream & log = std::cout,const std::string & confPath="");
00092
00093 ~SchemaParser();
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 bool parseSchemaTag();
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 const XSDType *getType(const Qname & type) ;
00116
00117
00118
00119
00120
00121 const XSDType *getType(int id) const;
00122
00123
00124
00125
00126
00127
00128 const XSDType *getType(int id, std::string &nameSpace);
00129
00130
00131
00132
00133
00134
00135 ConstTypeList *getAllTypes() const;
00136
00137
00138
00139
00140
00141 const Element *getElement(const Qname & element) const;
00142
00143
00144
00145
00146
00147
00148
00149 const ElementList& getElements() const;
00150
00151
00152
00153
00154 int getNumElements() const;
00155
00156
00157
00158
00159
00160
00161 Attribute *getAttribute(const Qname & attribute) ;
00162
00163
00164
00165
00166
00167
00168
00169 const AttributeList& getAttributes()const;
00170
00171
00172
00173
00174 int getNumAttributes() const;
00175
00176
00177
00178
00179
00180 std::string getNamespace(void) const;
00181
00182
00183
00184
00185 int getNumTypes() const;
00186
00187
00188
00189
00190
00191
00192
00193
00194 int getTypeId(const Qname &, bool create = false);
00195
00196
00197
00198
00199
00200
00201 bool isBasicType(int sType) const;
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 int getBasicContentType(int typeId)const;
00226
00227
00228
00229
00230
00231
00232 Group* getGroup(const Qname& name);
00233
00234
00235
00236
00237
00238
00239 AttributeGroup* getAttributeGroup(const Qname& name);
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 bool isImported(const std::string & ns)const;
00250 const SchemaParser* getImportedSchemaParser(const std::string & ns)const;
00251
00252
00253
00254
00255
00256
00257
00258 bool addImport(std::string ns, std::string location="");
00259
00260
00261
00262
00263
00264 bool addImport(SchemaParser* sp);
00265
00266
00267
00268
00269
00270 bool addImports(const std::vector<SchemaParser *>& schemaParsers);
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 bool finalize(void);
00283
00284
00285
00286
00287
00288
00289
00290 void setWarningLevel(int l);
00291
00292
00293
00294
00295 void setSchemaPath(const std::string& s);
00296
00297
00298
00299
00300
00301
00302 void setUri(const std::string& u );
00303
00304
00305
00306
00307 std::string getTypeName(Schema::Type t)const;
00308 TypesTable *getTypesTable();
00309 const SchemaParser *getImportedSchema(std::string &nameSpace);
00310 std::vector<ImportedSchema> &getImportedSchemas();
00311
00312
00313
00314
00315 std::string getVersion()const;
00316
00317 bool getElementQualified() const;
00318 std::string getTnsPrefix( void) const;
00319
00320 #ifdef LOGGING
00321
00322
00323
00324 void print(std::ostream &) ;
00325 #endif
00326
00327
00328 private:
00329
00330 Element parseElement(bool & fwdRef);
00331
00332 Attribute parseAttribute(bool & fwdRef);
00333 void init();
00334
00335
00336 void parseAnnotation();
00337 ComplexType *parseComplexType();
00338 SimpleType *parseSimpleType();
00339
00340
00341 Element addAny(ContentModel* cm);
00342 Group parseGroup(ContentModel* cm=0);
00343 Constraint* parseConstraint(Schema::ConstraintType cstr);
00344 AttributeGroup* parseAttributeGroup(ComplexType* cType=0);
00345 Attribute addAnyAttribute(ComplexType * cType);
00346
00347 void parseRestriction(SimpleType * st,ComplexType * ct=0);
00348 void parseComplexContent(ComplexType * ct);
00349 void parseSimpleContent(ComplexType * ct);
00350
00351 void parseContent(ContentModel * cm);
00352 bool parseImport(void);
00353 bool parseInclude();
00354 bool parseSchema(std::string tag="schema");
00355 bool parseRedefine();
00356 int checkImport(std::string nsp)const;
00357 void copyImports(SchemaParser * sp);
00358 void resolveForwardElementRefs();
00359 void resolveForwardAttributeRefs();
00360 bool& shouldResolve();
00361 bool makeListFromSoapArray (ComplexType * ct);
00362
00363 std::string fname_;
00364 std::string tnsUri_;
00365 std::string tnsPrefix_;
00366 std::string version_;
00367 XmlPullParser * xParser_;
00368 bool elementQualified_;
00369 bool attributeQualified_;
00370 bool deleteXmlParser_;
00371 bool resolveFwdRefs_;
00372 TypesTable typesTable_;
00373 std::ifstream xmlStream_;
00374 ElementList lElems_;
00375 AttributeList lAttributes_;
00376 GroupList lGroups_;
00377 AttributeGroupList lAttributeGroups_;
00378 ConstraintList constraints_;
00379 QNameList lForwardElemRefs_;
00380 QNameList lForwardAttributeRefs_;
00381
00382 std::vector<ImportedSchema> importedSchemas_;
00383 void error(std::string, int level = 0);
00384 int level_;
00385 std::ostream & logFile_;
00386 std::string confPath_;
00387 std::string uri_;
00388 };
00389
00390
00391 inline
00392 bool &
00393 SchemaParser::shouldResolve()
00394 {
00395 return resolveFwdRefs_;
00396
00397 }
00398
00399 inline
00400 const SchemaParser::ElementList&
00401 SchemaParser::getElements() const
00402 {
00403 return lElems_;
00404 }
00405
00406 inline
00407 const SchemaParser::AttributeList&
00408 SchemaParser::getAttributes() const
00409 {
00410 return lAttributes_;
00411 }
00412
00413 inline
00414 void
00415 SchemaParser::setWarningLevel(int l)
00416 {
00417 level_ = l;
00418 }
00419 inline
00420 bool
00421 SchemaParser::isImported(const std::string & ns)const
00422 {
00423 return checkImport(ns) != -1;
00424 }
00425 inline
00426 const SchemaParser*
00427 SchemaParser::getImportedSchemaParser(const std::string & ns)const
00428 {
00429 int i= checkImport(ns);
00430 if (i == -1 )
00431 return 0;
00432
00433 return importedSchemas_[i].sParser;
00434 }
00435
00436 inline
00437 void
00438 SchemaParser::setSchemaPath(const std::string& s)
00439 {
00440 confPath_ = s;
00441 }
00442
00443 inline
00444 void
00445 SchemaParser::setUri(const std::string& s)
00446 {
00447 uri_ = s;
00448 }
00449
00450 inline
00451 TypesTable*
00452 SchemaParser::getTypesTable()
00453 {
00454 return &typesTable_;
00455 }
00456
00457 inline
00458 std::vector<SchemaParser::ImportedSchema>&
00459 SchemaParser::getImportedSchemas()
00460 {
00461 return importedSchemas_;
00462 }
00463
00464 inline
00465 std::string
00466 SchemaParser::getVersion()const
00467 {
00468 return version_;
00469 }
00470
00471 inline
00472 bool
00473 SchemaParser::getElementQualified() const
00474 {
00475 return elementQualified_ ;
00476 }
00477
00478 inline
00479
00480 std::string
00481 SchemaParser::getTnsPrefix( void) const
00482 {
00483 return tnsPrefix_;
00484 }
00485
00486 }
00487 #endif
00488
00489