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:
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();
00061
00066 void setSchemaPath(const std::string & schemaPath);
00067
00076 int getNextElement();
00077
00083 int getEventType();
00084
00086
00089
00090
00091
00092
00097 std::string getNamespace(void);
00098
00103 std::string getName();
00104
00110 const std::string* getDocumentation();
00111
00118 const Binding *getBinding();
00119
00126 const Binding *getBinding(const Qname & q);
00127
00133 bool getBindings(Binding::cBindingIterator & begin,
00134 Binding::cBindingIterator & end)const;
00135
00142 const Service *getService();
00143
00150 typedef std::list<Service*>::iterator ServiceIterator;
00151 const Service *getService(const Qname & q);
00152 void getServices(ServiceIterator &from, ServiceIterator &to);
00153
00160 const PortType *getPortType();
00161
00168 const PortType *getPortType(const Qname & q);
00169
00175 bool getPortTypes(PortType::cPortTypeIterator& begin,
00176 PortType::cPortTypeIterator& end)const;
00177
00185 bool getOperations(const Qname & portType,
00186 Operation::cOpIterator begin,
00187 Operation::cOpIterator end);
00188
00196 const Operation *getOperation(const Qname & portType,
00197 const Qname & q);
00198
00205 const Message *getMessage();
00206
00213 const Message *getMessage(const Qname & q);
00214
00220 std::list < const Message *>& getMessages();
00221
00230 void
00231 WsdlParser::getSchemaParsers(std::vector<SchemaParser* >::iterator & from,
00232 std::vector<SchemaParser* >::iterator & to) ;
00233
00239 int getNumSchemas() const;
00240
00247 const SchemaParser *getSchemaParser(std::string targetNamespace) const;
00248
00249
00253 bool status()const;
00254 std::string wsdlPath()const;
00255 std::ostream & logger();
00256 std::string &getWsdlFileName()
00257 {
00258 return wsdlFileName;
00259 }
00261
00262
00271 void addExtensibilityHandler(WsdlExtension * ext);
00278 WsdlExtension * getExtensibilityHandler(const std::string & ns);
00279
00280
00281 WsdlExtension * getExtensibilityHandler(int extId);
00283
00284
00291 bool setFeature (int feature_id);
00293
00294
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
00334 const SchemaParser *getSchemaParser(int schemaId) const;
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 };
00401
00402
00403 inline
00404 WsdlParser::Imports::Imports(std::string nameSpace,std::string location)
00405 :ns(nameSpace),
00406 loc(location)
00407 {
00408 }
00409
00410
00411 inline
00412 std::string
00413 WsdlParser::getNamespace(std::string prefix)
00414 {
00415 return xParser_->getNamespace(prefix);
00416 }
00417
00418
00419
00420 inline
00421 int
00422 WsdlParser::getNextElement()
00423 {
00424 next();
00425 return element_;
00426 }
00427
00428 inline
00429 const std::string*
00430 WsdlParser::getDocumentation()
00431 {
00432 return (const std::string*) Doc_;
00433 }
00434
00435 inline
00436 std::string
00437 WsdlParser::getNamespace(void)
00438 {
00439 return tnsUri_;
00440 }
00441
00442 inline
00443 std::string
00444 WsdlParser::getName()
00445 {
00446 return name_;
00447 }
00448
00449
00450
00451 inline
00452 int
00453 WsdlParser::getEventType()
00454 {
00455 return element_;
00456 }
00457
00458
00459 inline
00460 std::list < const Message *>&
00461 WsdlParser::getMessages()
00462 {
00463 return messages_;
00464 }
00465
00466
00467
00468
00469
00470 inline
00471 const SchemaParser *
00472 WsdlParser::getSchemaParser(int schemaId) const
00473 {
00474 return (const SchemaParser *) schemaParser_[schemaId];
00475 }
00476
00477 inline
00478 std::string
00479 WsdlParser::wsdlPath()const
00480 {
00481 return wsdlFileName ;
00482 }
00483 inline
00484 bool
00485 WsdlParser::status()const
00486 {
00487 return !errorOccured_;
00488 }
00489
00490 inline
00491 std::ostream&
00492 WsdlParser::logger()
00493 {
00494 return ostr;
00495 }
00496 }
00497
00498 #endif