wsdlpull
1.23
|
00001 /* 00002 * wsdlpull - A C++ parser for WSDL (Web services description language) 00003 * Copyright (C) 2005-2007 Vivek Krishna 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public 00016 * License along with this library; if not, write to the Free 00017 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 * 00019 * 00020 */ 00021 #ifndef _BINDINGH 00022 #define _BINDINGH 00023 00024 #include "wsdlparser/WsdlElement.h" 00025 #include "xmlpull/wsdlpull_export.h" 00026 00027 namespace WsdlPull { 00028 class PortType; 00029 const int MAX_EXT_ELEM=50; 00030 00031 //Wsdl Binding element 00032 class WSDLPULL_EXPORT Binding:public WsdlElement 00033 { 00034 00038 public: 00039 typedef std::list<Binding*>::iterator BindingIterator; 00040 typedef std::list<Binding*>::const_iterator cBindingIterator; 00041 00042 Binding(WsdlParser & w); 00043 ~Binding(); 00044 00052 int getBindingInfo() const; 00057 const PortType *getPortType() const; 00062 int getServiceExtId() const; 00063 00068 int numOps(void) const; 00069 00075 const Operation *getOperation(int index) const; 00082 std::string getBindingMethod()const; 00083 00084 00091 int getOpBinding(int index, const int*& bindings) const; 00092 int getOutputBinding(int index, const int*& bindings) const; 00093 int getInputBinding(int index, const int*& bindings) const; 00094 int getFaultBinding(int index, const int*& bindings) const; 00096 00097 00098 00103 void setPortType(const PortType * pt); 00104 void setBindingInfo(int id); 00105 void setBindingMethod(const std::string & ns); 00106 void addServiceExtId(int id); 00111 int addOperation(const Operation * op); 00112 void addOpBinding(int index, int oBn); 00113 void addOutputBinding(int index, int opBn); 00114 void addInputBinding(int index, int ipBn); 00115 void addFaultBinding(int index, int fBn); 00116 int getOperationIndex(const Qname & name) const; 00117 00119 00120 private: 00121 class OperationBinding 00122 { 00123 public: 00124 OperationBinding(); 00125 const Operation *op; 00126 int opBinding[MAX_EXT_ELEM]; 00127 int nObn; 00128 //additional extensibility elements,example soap:operation element 00129 int inputBinding[MAX_EXT_ELEM]; 00130 int nIpbn; 00131 int outputBinding[MAX_EXT_ELEM]; 00132 int nOpbn; 00133 int faultBinding[MAX_EXT_ELEM]; 00134 int nFbn; 00135 }; 00136 00137 std::vector<OperationBinding> Ops_; 00138 const PortType *portType_; 00139 std::string binding_;//namespace of the binding protocol(SOAP,HTTP etc) 00140 int bindingInfo; //binding information for the whole port type 00141 //this is the id of the element whichgives details about service for this binding 00142 std::list<int> serviceExtIds_; 00143 }; 00144 00145 inline 00146 Binding::OperationBinding::OperationBinding() 00147 :op(0), 00148 nObn(0), 00149 nIpbn (0), 00150 nOpbn(0), 00151 nFbn(0) 00152 { 00153 } 00154 00155 inline 00156 int 00157 Binding::getBindingInfo() const 00158 { 00159 return bindingInfo; 00160 } 00161 00162 inline 00163 const PortType * 00164 Binding::getPortType() const 00165 { 00166 return portType_; 00167 } 00168 00169 inline 00170 int 00171 Binding::getServiceExtId() const 00172 { 00173 if (serviceExtIds_.size() > 0) 00174 return serviceExtIds_.front(); 00175 else 00176 return 0; 00177 } 00178 00179 inline 00180 int 00181 Binding::numOps(void) const 00182 { 00183 return Ops_.size(); 00184 } 00185 00186 inline 00187 const Operation * 00188 Binding::getOperation(int index) const 00189 { 00190 return Ops_[index].op; 00191 } 00192 00193 inline 00194 int 00195 Binding::getOpBinding(int index, const int*& bindings) const 00196 { 00197 bindings = Ops_[index].opBinding; 00198 return Ops_[index].nObn; 00199 } 00200 00201 inline 00202 int 00203 Binding::getOutputBinding(int index, const int*& bindings) const 00204 { 00205 bindings = Ops_[index].outputBinding; 00206 return Ops_[index].nOpbn; 00207 } 00208 00209 inline 00210 int 00211 Binding::getInputBinding(int index, const int*& bindings) const 00212 { 00213 bindings = Ops_[index].inputBinding; 00214 return Ops_[index].nIpbn; 00215 } 00216 00217 inline 00218 int 00219 Binding::getFaultBinding(int index, const int*& bindings) const 00220 { 00221 bindings = Ops_[index].faultBinding; 00222 return Ops_[index].nFbn; 00223 } 00224 00225 inline 00226 void 00227 Binding::setPortType(const PortType * pt) 00228 { 00229 portType_ = pt; 00230 } 00231 00232 inline 00233 void 00234 Binding:: setBindingInfo(int id) 00235 { 00236 bindingInfo = id; 00237 WsdlElement::addExtElement(id); 00238 } 00239 00240 inline 00241 void 00242 Binding::addServiceExtId(int id) 00243 { 00244 serviceExtIds_.push_back(id); 00245 } 00246 00247 inline 00248 int 00249 Binding::addOperation(const Operation * op) 00250 { 00251 OperationBinding ob; 00252 ob.op=op; 00253 Ops_.push_back(ob); 00254 return Ops_.size()-1; 00255 } 00256 00257 inline 00258 void 00259 Binding::addOpBinding(int index, int oBn) 00260 { 00261 Ops_[index].opBinding[Ops_[index].nObn++] = oBn; 00262 } 00263 00264 inline 00265 void 00266 Binding::addOutputBinding(int index, int opBn) 00267 { 00268 Ops_[index].outputBinding[Ops_[index].nOpbn++] = opBn; 00269 } 00270 inline 00271 void 00272 Binding::addInputBinding(int index, int ipBn) 00273 { 00274 Ops_[index].inputBinding[Ops_[index].nIpbn++] = ipBn; 00275 } 00276 00277 inline 00278 void 00279 Binding::addFaultBinding(int index, int fBn) 00280 { 00281 Ops_[index].faultBinding[Ops_[index].nFbn++] = fBn; 00282 } 00283 00284 00285 inline 00286 Binding::Binding(WsdlParser& w) 00287 :WsdlElement(w) 00288 { 00289 portType_ = 0; 00290 Ops_.clear(); 00291 } 00292 00293 inline 00294 Binding::~Binding() 00295 { 00296 } 00297 00298 inline 00299 void 00300 Binding::setBindingMethod(const std::string & ns) 00301 { 00302 binding_=ns; 00303 } 00304 00305 inline 00306 std::string 00307 Binding::getBindingMethod()const 00308 { 00309 return binding_; 00310 } 00311 00312 inline int 00313 Binding::getOperationIndex(const Qname & name) const 00314 { 00315 for (int i=0; i < int(Ops_.size()); i++ ) { 00316 if (Ops_[i].op->getName() == name.getLocalName() ) return i; 00317 } 00318 return -1; 00319 } 00320 00321 00322 } 00323 #endif /* */