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