00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _WSDLPARSERH
00021 #define _WSDLPARSERH
00022
00023 #include "xmlpull/wsdlpull_export.h"
00024 #include "xmlpull/XmlPullParser.h"
00025 #include "xmlpull/XmlPullParserException.h"
00026 #include "schemaparser/SchemaParser.h"
00027
00028 #include "wsdlparser/PortType.h"
00029 #include "wsdlparser/Message.h"
00030 #include "wsdlparser/Operation.h"
00031 #include "wsdlparser/Binding.h"
00032 #include "wsdlparser/Service.h"
00033 #include "wsdlparser/WsdlExtension.h"
00034
00035
00036 namespace WsdlPull{
00037
00038 const std::string wsdlUri="http://schemas.xmlsoap.org/wsdl/";
00039
00040
00041 class Soap;
00042
00043 class WSDLPULL_EXPORT WsdlParser
00044 {
00045 public:
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 WsdlParser(std::istream & in = std::cin, std::ostream & out = std::cout,
00056 const std::string & schemaPath = "");
00057 WsdlParser(const std::string& Uri,std::ostream & out = std::cout,
00058 const std::string & schemaPath = "");
00059 ~WsdlParser();
00060
00061
00062
00063
00064
00065
00066 void setSchemaPath(const std::string & schemaPath);
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 int getNextElement();
00077
00078
00079
00080
00081
00082
00083 int getEventType();
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 std::string getNamespace(void);
00098
00099
00100
00101
00102
00103 std::string getName();
00104
00105
00106
00107
00108
00109
00110 const std::string* getDocumentation();
00111
00112
00113
00114
00115
00116
00117
00118 const Binding *getBinding();
00119
00120
00121
00122
00123
00124
00125
00126 const Binding *getBinding(const Qname & q);
00127
00128
00129
00130
00131
00132
00133 bool getBindings(Binding::cBindingIterator & begin,
00134 Binding::cBindingIterator & end)const;
00135
00136
00137
00138
00139
00140
00141
00142 const Service *getService();
00143
00144
00145
00146
00147
00148
00149
00150 typedef std::list<Service*>::iterator ServiceIterator;
00151 const Service *getService(const Qname & q);
00152 void getServices(ServiceIterator &from, ServiceIterator &to);
00153
00154
00155
00156
00157
00158
00159
00160 const PortType *getPortType();
00161
00162
00163
00164
00165
00166
00167
00168 const PortType *getPortType(const Qname & q);
00169
00170
00171
00172
00173
00174
00175 bool getPortTypes(PortType::cPortTypeIterator& begin,
00176 PortType::cPortTypeIterator& end)const;
00177
00178
00179
00180
00181
00182
00183
00184
00185 bool getOperations(const Qname & portType,
00186 Operation::cOpIterator& begin,
00187 Operation::cOpIterator& end);
00188
00189
00190
00191
00192
00193
00194
00195
00196 const Operation *getOperation(const Qname & portType,
00197 const Qname & q);
00198
00199
00200
00201
00202
00203
00204
00205 const Message *getMessage();
00206
00207
00208
00209
00210
00211
00212
00213 const Message *getMessage(const Qname & q);
00214
00215
00216
00217
00218
00219
00220 std::list < const Message *>& getMessages();
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 void getSchemaParsers(std::vector<SchemaParser* >::iterator & from,
00231 std::vector<SchemaParser* >::iterator & to) ;
00232
00233
00234
00235
00236
00237
00238 int getNumSchemas() const;
00239
00240
00241
00242
00243
00244
00245
00246 const SchemaParser *getSchemaParser(std::string targetNamespace) const;
00247
00248
00249
00250
00251
00252 bool status()const;
00253 std::string wsdlPath()const;
00254 std::ostream & logger();
00255 std::string &getWsdlFileName() {
00256 return wsdlFileName;
00257 }
00258
00259 static bool useLocalSchema_;
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 void addExtensibilityHandler(WsdlExtension * ext);
00272
00273
00274
00275
00276
00277
00278 WsdlExtension * getExtensibilityHandler(const std::string & ns);
00279
00280
00281 WsdlExtension * getExtensibilityHandler(int extId);
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 bool setFeature (int feature_id);
00292
00293
00294
00295
00296
00297
00298 enum
00299 {
00300 NONE ,
00301 START,
00302 DEFINITION,
00303 DOCUMENTATION,
00304 ANNOTATION,
00305 IMPORT,
00306 SCHEMA,
00307 TYPES,
00308 MESSAGE,
00309 PART,
00310 PORT_TYPE,
00311 OPERATION,
00312 INPUT,
00313 OUTPUT,
00314 FAULT,
00315 BINDING,
00316 EXTENSIBILITY,
00317 SERVICE,
00318 PORT,
00319 END
00320 };
00321
00322 #ifdef LOGGING
00323
00324 void print(std::ostream & out);
00325 #endif
00326
00327
00328
00329
00330
00331
00332
00333
00334 const SchemaParser *getSchemaParser(int schemaId) const;
00335
00336
00337 private:
00338
00339
00340
00341 int peek(bool lookahead = true);
00342 int next();
00343 void error(std::string s,int level=0);
00344 std::string getNamespace(std::string prefix);
00345 Element * getElement(const Qname &);
00346 int getTypeId(const Qname &);
00347 int getSchema(const Qname & name,bool type = true);
00348 std::string* parseDoc();
00349 void parseDefinitions();
00350 void parseMessage();
00351 void parseAnnotation();
00352 void parseImport();
00353 PortType *parsePortType();
00354 Operation *parseOperation(PortType* p);
00355 void parseTypes();
00356 void parseBinding();
00357 void parseService();
00358 int handleExtensibilityAttributes(std::string prefix, std::string name);
00359 int handleExtensibilityElement(int);
00360 void putMessage(Message * m);
00361 void putPortType(PortType * pt);
00362 void putBinding(Binding * bn);
00363 void initialize(bool);
00364 bool errorOccured_;
00365 XmlPullParser* openSchemaFile(const std::string& path);
00366 const Message *pgetMessage(const Qname& q);
00367 std::string name_, tnsPrefix_, tnsUri_;
00368 std::vector<SchemaParser*> schemaParser_;
00369
00370 typedef struct
00371 {
00372 WsdlExtension *we;
00373 SchemaParser *spe;
00374 } ExtensionInfo;
00375 std::list < const Message *> messages_;
00376 std::vector<ExtensionInfo> wsdlExtensions_;
00377 std::list < PortType *>porttypes_;
00378 std::list < Binding *>bindings_;
00379 std::list < Service*> services_;
00380
00381 class Imports
00382 {
00383 public:
00384 Imports(std::string,std::string);
00385 std::string ns, loc;
00386 };
00387 std::vector<Imports> imports_;
00388 std::list < std::string *> docs_list_;
00389 std::ostream & ostr;
00390 std::istream & istr;
00391 int state_;
00392 int element_;
00393 std::string* Doc_;
00394 XmlPullParser * xParser_;
00395 std::ifstream xmlStream;
00396 std::string wsdlFileName;
00397 Soap * soap_;
00398 const int MAX_EXT_XML;
00399 std::string schemaPath_;
00400 std::string uri_;
00401 };
00402
00403
00404 inline
00405 WsdlParser::Imports::Imports(std::string nameSpace,std::string location)
00406 :ns(nameSpace),
00407 loc(location)
00408 {
00409 }
00410
00411
00412 inline
00413 std::string
00414 WsdlParser::getNamespace(std::string prefix)
00415 {
00416 return xParser_->getNamespace(prefix);
00417 }
00418
00419
00420
00421 inline
00422 int
00423 WsdlParser::getNextElement()
00424 {
00425 next();
00426 return element_;
00427 }
00428
00429 inline
00430 const std::string*
00431 WsdlParser::getDocumentation()
00432 {
00433 return (const std::string*) Doc_;
00434 }
00435
00436 inline
00437 std::string
00438 WsdlParser::getNamespace(void)
00439 {
00440 return tnsUri_;
00441 }
00442
00443 inline
00444 std::string
00445 WsdlParser::getName()
00446 {
00447 return name_;
00448 }
00449
00450
00451
00452 inline
00453 int
00454 WsdlParser::getEventType()
00455 {
00456 return element_;
00457 }
00458
00459
00460 inline
00461 std::list < const Message *>&
00462 WsdlParser::getMessages()
00463 {
00464 return messages_;
00465 }
00466
00467
00468
00469
00470
00471 inline
00472 const SchemaParser *
00473 WsdlParser::getSchemaParser(int schemaId) const
00474 {
00475 return (const SchemaParser *) schemaParser_[schemaId];
00476 }
00477
00478 inline
00479 std::string
00480 WsdlParser::wsdlPath()const
00481 {
00482 return wsdlFileName ;
00483 }
00484 inline
00485 bool
00486 WsdlParser::status()const
00487 {
00488 return !errorOccured_;
00489 }
00490
00491 inline
00492 std::ostream&
00493 WsdlParser::logger()
00494 {
00495 return ostr;
00496 }
00497 }
00498
00499 #endif