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 processMessageExtensibility(Operation * op,
00356 WsdlPull::MessageType mtype);
00357 void parseTypes();
00358 void parseBinding();
00359 void parseService();
00360 int handleExtensibilityAttributes(std::string prefix, std::string name);
00361 int handleExtensibilityElement(int);
00362 void putMessage(Message * m);
00363 void putPortType(PortType * pt);
00364 void putBinding(Binding * bn);
00365 void initialize(bool);
00366 bool errorOccured_;
00367 XmlPullParser* openSchemaFile(const std::string& path);
00368 const Message *pgetMessage(const Qname& q);
00369 std::string name_, tnsPrefix_, tnsUri_;
00370 std::vector<SchemaParser*> schemaParser_;
00371
00372 typedef struct
00373 {
00374 WsdlExtension *we;
00375 SchemaParser *spe;
00376 } ExtensionInfo;
00377 std::list < const Message *> messages_;
00378 std::vector<ExtensionInfo> wsdlExtensions_;
00379 std::list < PortType *>porttypes_;
00380 std::list < Binding *>bindings_;
00381 std::list < Service*> services_;
00382
00383 class Imports
00384 {
00385 public:
00386 Imports(std::string,std::string);
00387 std::string ns, loc;
00388 };
00389 std::vector<Imports> imports_;
00390 std::list < std::string *> docs_list_;
00391 std::ostream & ostr;
00392 std::istream & istr;
00393 int state_;
00394 int element_;
00395 std::string* Doc_;
00396 XmlPullParser * xParser_;
00397 std::ifstream xmlStream;
00398 std::string wsdlFileName;
00399 Soap * soap_;
00400 const int MAX_EXT_XML;
00401 std::string schemaPath_;
00402 std::string uri_;
00403 };
00404
00405
00406 inline
00407 WsdlParser::Imports::Imports(std::string nameSpace,std::string location)
00408 :ns(nameSpace),
00409 loc(location)
00410 {
00411 }
00412
00413
00414 inline
00415 std::string
00416 WsdlParser::getNamespace(std::string prefix)
00417 {
00418 return xParser_->getNamespace(prefix);
00419 }
00420
00421
00422
00423 inline
00424 int
00425 WsdlParser::getNextElement()
00426 {
00427 next();
00428 return element_;
00429 }
00430
00431 inline
00432 const std::string*
00433 WsdlParser::getDocumentation()
00434 {
00435 return (const std::string*) Doc_;
00436 }
00437
00438 inline
00439 std::string
00440 WsdlParser::getNamespace(void)
00441 {
00442 return tnsUri_;
00443 }
00444
00445 inline
00446 std::string
00447 WsdlParser::getName()
00448 {
00449 return name_;
00450 }
00451
00452
00453
00454 inline
00455 int
00456 WsdlParser::getEventType()
00457 {
00458 return element_;
00459 }
00460
00461
00462 inline
00463 std::list < const Message *>&
00464 WsdlParser::getMessages()
00465 {
00466 return messages_;
00467 }
00468
00469
00470
00471
00472
00473 inline
00474 const SchemaParser *
00475 WsdlParser::getSchemaParser(int schemaId) const
00476 {
00477 return (const SchemaParser *) schemaParser_[schemaId];
00478 }
00479
00480 inline
00481 std::string
00482 WsdlParser::wsdlPath()const
00483 {
00484 return wsdlFileName ;
00485 }
00486 inline
00487 bool
00488 WsdlParser::status()const
00489 {
00490 return !errorOccured_;
00491 }
00492
00493 inline
00494 std::ostream&
00495 WsdlParser::logger()
00496 {
00497 return ostr;
00498 }
00499 }
00500
00501 #endif