26 logger = Logger::getLogger(
"WsUtil");
33 string WsUtil::generateAllWSDL(vector<string> files,
string resp,map<string,string> &wsmap)
35 string ret,headers=
"#include \"Exception.h\"\n#include \"string\"\n#include <sstream>\n#include \"CastUtil.h\"\n#include \"Element.h\"\ntypedef vector<Element> ElementList;\ntypedef map<string,string> AttributeList;\n";
36 for(
unsigned int var = 0; var < files.size(); ++var)
38 string webdir = resp+
"../web/"+files.at(var);
39 ret += generateWSDL(webdir+
"/config/ws.xml",webdir+
"/include/",resp,headers,wsmap,files.at(var));
41 ret = (headers +
"using namespace std;\n\n" + ret);
45 string WsUtil::generateWSDL(
string file,
string usrinc,
string resp,
string &headers,map<string,string> &wsmap,
string appname)
48 Document doc = parser.getDocument(file);
49 Element root = doc.getRootElement();
50 typedef vector<Element> ElementList;
51 typedef map<string,string> strMap;
52 typedef map<string,strMap> meth_Map;
53 typedef map<string,meth_Map> ws_inp_out_Map;
54 ElementList wsvcs = root.getChildElements();
59 ws_inp_out_Map ws_info;
60 string ws_funcs,obj_mapng,retObj_xml;
61 for(
unsigned int i=0;i<wsvcs.size();i++)
65 string ws_name,reqr_res_bind,wsdl_msgs,wsdl_ops,wsdl_bind,wsdl,wsdl_obj_bind;
67 ws_name = ws.getAttribute(
"class");
68 gcntxt[
"WS_NAME"] = ws_name;
69 wsmap[ws_name] = appname;
70 logger << (
"Web service " + ws_name +
" found for appname " + appname) << endl;
71 strVec info = ref.getAfcObjectData(usrinc+ws.getAttribute(
"class")+
".h",
false);
72 headers.append(
"#include \""+ws.getAttribute(
"class")+
".h\"\n");
74 for(
unsigned int i=0;i<info.size();i++)
79 temp11 = temp.substr(temp.find(
"(")+1);
80 temp = temp.substr(0,temp.find(
"("));
83 StringUtil::replaceAll(temp11,
";",
"");
84 StringUtil::replaceFirst(temp11,
")",
" ");
85 strVec results,results1;
86 StringUtil::split(results, temp, (
" "));
87 StringUtil::split(results1, temp11, (
","));
88 string retType,methName,inp_params;
91 if(results.size()>0 && (results.at(0)==ws.getAttribute(
"class") || temp.find(
"~")!=string::npos))
94 methName = results.at(1);
96 in_out_info[
"RETURN"] = ws.getElementByName(methName).getAttribute(
"outname");
98 in_out_info[
"RETURNTYP"] = results.at(0);
99 if(results.at(0).find(
"vector<")!=string::npos)
101 string vecn = results.at(0);
102 StringUtil::replaceFirst(vecn,
"vector<",
" ");
103 StringUtil::replaceFirst(vecn,
">",
" ");
104 StringUtil::trim(vecn);
105 if(vecn==
"int" || vecn==
"double" || vecn==
"float" || vecn==
"string")
107 retType =
"\n<xsd:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\""+in_out_info[
"RETURN"]+
"\" type=\"xsd:"+vecn+
"\"/>";
111 results1.push_back(vecn);
112 retType =
"\n<xsd:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\""+in_out_info[
"RETURN"]+
"\" type=\"ns0:"+vecn+
"\"/>";
117 if(results.at(0)!=
"void")
119 if(results.at(0)==
"int" || results.at(0)==
"double" || results.at(0)==
"float" || results.at(0)==
"string")
120 retType =
"\n<xsd:element name=\""+in_out_info[
"RETURN"]+
"\" type=\"xsd:"+results.at(0)+
"\"/>";
122 retType =
"\n<xsd:element name=\""+in_out_info[
"RETURN"]+
"\" type=\"ns0:"+results.at(0)+
"\"/>";
125 for(
unsigned int j=0;j<results1.size();j++)
129 StringUtil::split(results2, results1.at(j), (
" "));
130 if(results2.size()<2)
continue;
131 type = results2.at(0);
133 char chr = CastUtil::lexical_cast<
char>(j);
138 if(type==
"int" || type==
"float" || type==
"double")
140 inp_params.append(
"\n<xsd:element name=\""+results2.at(1)+
"\" type=\"xsd:"+type+
"\"/>");
141 in_out_info[chr+results2.at(1)] = type;
143 else if(type==
"string")
145 inp_params.append(
"\n<xsd:element minOccurs=\"0\" name=\""+results2.at(1)+
"\" type=\"xsd:string\"/>");
146 in_out_info[chr+results2.at(1)] = type;
150 if(results2.size()>=2)
151 in_out_info[chr+results2.at(1)] = type;
153 logger << (
"Invalid thing happening " + results1.at(j)) << endl;
155 if(type.find(
"vector<")!=string::npos && results2.size()==2)
158 StringUtil::replaceFirst(vecn,
"vector<",
" ");
159 StringUtil::replaceFirst(vecn,
">",
" ");
160 StringUtil::trim(vecn);
161 headers.append(
"#include \""+vecn+
".h\"\n");
163 inp_params.append(
"\n<xsd:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\""+results2.at(1)+
"\" type=\"ns0:"+type+
"\"/>");
165 else if(results2.size()==2)
167 headers.append(
"#include \""+type+
".h\"\n");
168 inp_params.append(
"\n<xsd:element minOccurs=\"0\" name=\""+results2.at(1)+
"\" type=\"ns0:"+type+
"\"/>");
170 strVec onjinf = ref.getAfcObjectData(usrinc+type+
".h",
false);
171 if(type==
"int" || type==
"float" || type==
"double" || type==
"string")
173 obj_mapng.append(type+
" _getObj"+type+
"(Element ele)\n{\n");
174 obj_mapng.append(type+
" _obj;\n");
175 retObj_xml.append(
"string _getRetXmlFor"+type+
"("+type+
" _obj,string namespce)\n{\n");
176 for(
unsigned int k=0;k<onjinf.size();k++)
178 string temp1,field,type;
179 temp1 = onjinf.at(k);
180 if(temp1.find(
",")!=string::npos)
182 size_t s = temp1.find(
"get");
183 size_t s1 = temp1.find(
"set");
186 size_t e = temp1.find(
"(");
187 field = temp1.substr(s+3,e-s+3);
188 field = AfcUtil::reverseCamelCased(field);
189 field = field.substr(0,field.find(
"("));
193 else if(s1!=string::npos)
195 size_t e = temp1.find(
"(");
196 size_t ed = temp1.find(
")");
197 field = temp1.substr(s1+3,e-s1+3);
198 field = AfcUtil::reverseCamelCased(field);
199 field = field.substr(0,field.find(
"("));
200 type = temp1.substr(e+1,ed-e-1);
202 StringUtil::split(results3, type, (
" "));
203 type = results3.at(0);
206 allfs[field] = field;
210 strMap::iterator iter;
213 retObj_xml.append(
"string _ret;\n");
214 retObj_xml.append(
"string val;\n");
215 retObj_xml.append(
"stringstream ss;\n");
216 for(iter=allfs.begin();iter!=allfs.end();iter++)
222 typ = tyfs[iter->second];
223 if(typ==
"int" || typ==
"float" || typ==
"double")
225 retObj_xml.append(
"ss << _obj.get"+AfcUtil::camelCased(iter->second)+
"();\n");
226 retObj_xml.append(
"ss >> val;\n");
227 obj_binding.append(
"\n<xsd:element name=\""+iter->second+
"\" type=\"xsd:"+typ+
"\"/>");
229 else if(typ==
"string")
231 retObj_xml.append(
"val = _obj.get"+AfcUtil::camelCased(iter->second)+
"();\n");
232 obj_binding.append(
"\n<xsd:element minOccurs=\"0\" name=\""+iter->second+
"\" type=\"xsd:string\"/>");
234 obj_mapng.append(
"_obj.set"+AfcUtil::camelCased(iter->second)+
"(CastUtil::lexical_cast<"+typ+
">(ele.getElementByName(\""+iter->second+
"\").getText()));\n");
235 retObj_xml.append(
"_ret.append(\"<\"+namespce+\":"+iter->second+
">\"+val+\"</\"+namespce+\":"+iter->second+
">\");\n");
238 obj_mapng.append(
"return _obj;\n}\n");
239 retObj_xml.append(
"return _ret;\n}\n");
242 StringContext cntxt1;
243 cntxt1[
"OBJ"] = type;
244 cntxt1[
"OBJ_MEMBERS"] = obj_binding;
245 wsdl_obj_bind.append(templ.evaluate(resp+
"templateObjBin.wsdl",cntxt1));
249 meth_info[methName] = in_out_info;
251 cntxt[
"METH_NAME"] = methName;
252 cntxt[
"RET_TYPE"] = retType;
253 cntxt[
"INP_PARAMS"] = inp_params;
254 reqr_res_bind.append(
"\n"+templ.evaluate(resp+
"templateReqRes.wsdl",cntxt));
255 wsdl_msgs.append(
"\n"+templ.evaluate(resp+
"templateWsdlMsg.wsdl",cntxt));
256 wsdl_ops.append(
"\n"+templ.evaluate(resp+
"templateWsdlOpe.wsdl",cntxt));
257 wsdl_bind.append(
"\n"+templ.evaluate(resp+
"templateWsdlBind.wsdl",cntxt));
259 ws_info[ws_name] = meth_info;
260 gcntxt[
"REQ_RES_BINDING"] = reqr_res_bind;
261 gcntxt[
"WSDL_MESSAGES"] = wsdl_msgs;
262 gcntxt[
"WSDL_OPERATIONS"] = wsdl_ops;
263 gcntxt[
"WSDL_BINDING"] = wsdl_bind;
264 gcntxt[
"OBJ_BINDING"] = wsdl_obj_bind;
265 gcntxt[
"URL"] =
"http://localhost:8080";
266 wsdl = templ.evaluate(resp+
"template.wsdl",gcntxt);
267 AfcUtil::writeTofile(resp+ws_name+
".wsdl",wsdl,
true);
268 ws_funcs.append(obj_mapng);
269 ws_funcs.append(retObj_xml);
270 ws_funcs.append(
"extern \"C\"\n{\n");
271 ws_inp_out_Map::iterator iter;
272 for(iter=ws_info.begin();iter!=ws_info.end();iter++)
274 string ws_n = iter->first;
275 meth_Map meth = iter->second;
276 meth_Map::iterator iter1;
277 for(iter1=meth.begin();iter1!=meth.end();iter1++)
279 string me_n = iter1->first;
280 strMap pars = iter1->second;
281 ws_funcs.append(
"string "+me_n+ws_n+
"(Element _req)\n{\nElement ele;\n");
282 ws_funcs.append(
"string _retStr;\n");
283 ws_funcs.append(
"try{\n");
284 strMap::iterator iter2;
286 unsigned int ter = 1;
288 for(iter2=pars.begin();iter2!=pars.end();iter2++)
290 if(iter2->first!=
"RETURN" && iter2->first!=
"RETURNTYP")
292 string argname = iter2->first.substr(1);
293 if(iter2->second==
"int" || iter2->second==
"double" || iter2->second==
"float" || iter2->second==
"string")
295 ws_funcs.append(
"ele = _req.getElementByName(\""+argname+
"\");\n");
296 ws_funcs.append(iter2->second+
" "+argname+
";\n");
297 ws_funcs.append(
"if(ele.getTagName()!=\"\")");
298 ws_funcs.append(argname+
" = CastUtil::lexical_cast<"+iter2->second+
">(ele.getText());\n");
300 else if(iter2->second.find(
"vector<")!=string::npos)
302 string vecn = iter2->second;
303 StringUtil::replaceFirst(vecn,
"vector<",
" ");
304 StringUtil::replaceFirst(vecn,
">",
" ");
305 StringUtil::trim(vecn);
306 if(vecn==
"int" || vecn==
"double" || vecn==
"float" || vecn==
"string")
308 ws_funcs.append(
"vector<"+vecn+
"> "+argname+
";\n");
309 ws_funcs.append(
"ElementList list = _req.getElementsByName(\""+argname+
"\");\n");
310 ws_funcs.append(
"for(int i=0;i<list.size();i++)");
311 ws_funcs.append(argname+
".push_back(CastUtil::lexical_cast<"+vecn+
">(list.at(i).getText()));\n");
315 ws_funcs.append(
"vector<"+vecn+
"> "+argname+
";\n");
316 ws_funcs.append(
"ElementList list = _req.getElementsByName(\""+argname+
"\");\n");
317 ws_funcs.append(
"for(int i=0;i<list.size();i++)");
318 ws_funcs.append(argname+
".push_back(_getObjTest(list.at(i)));\n");
323 ws_funcs.append(
"ele = _req.getElementByName(\""+argname+
"\");\n");
324 ws_funcs.append(iter2->second+
" "+argname+
";\n");
325 ws_funcs.append(
"if(ele.getTagName()!=\"\")");
326 ws_funcs.append(argname+
" = _getObj"+iter2->second+
"(ele);\n");
328 args.append(argname);
329 if(ter++<pars.size()-2)
333 ws_funcs.append(ws_n+
" _obj;\n");
335 ws_funcs.append(
"AttributeList attl = _req.getAttributes();\n");
336 ws_funcs.append(
"AttributeList::iterator it;\n");
337 ws_funcs.append(
"_retStr = \"<\" + _req.getTagNameSpc() + \"Response\";\n");
338 ws_funcs.append(
"for(it=attl.begin();it!=attl.end();it++)\n");
339 ws_funcs.append(
"_retStr.append(\" \" + it->first + \"=\\\"\" + it->second + \"\\\" \");\n");
340 ws_funcs.append(
"_retStr.append(\">\");\n");
341 if(pars[
"RETURNTYP"]==
"void")
343 ws_funcs.append(
"_obj."+me_n+
"("+args+
");\n");
345 else if(pars[
"RETURNTYP"]==
"int" || pars[
"RETURNTYP"]==
"double" || pars[
"RETURNTYP"]==
"float" || pars[
"RETURNTYP"]==
"string")
347 ws_funcs.append(pars[
"RETURNTYP"]+
" _retval;\n");
348 ws_funcs.append(
"_retval = _obj."+me_n+
"("+args+
");\n");
349 ws_funcs.append(
"_retStr += \"<\" + _req.getNameSpc() +\":"+pars[
"RETURN"]+
">\"+_retval+\"</\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\";\n");
351 else if(pars[
"RETURNTYP"]!=
"")
353 ws_funcs.append(pars[
"RETURNTYP"]+
" _retval;\n");
354 ws_funcs.append(
"_retval = _obj."+me_n+
"("+args+
");\n");
355 if(pars[
"RETURNTYP"].find(
"vector<")!=string::npos)
357 string vecn = pars[
"RETURNTYP"];
358 StringUtil::replaceFirst(vecn,
"vector<",
" ");
359 StringUtil::replaceFirst(vecn,
">",
" ");
360 StringUtil::trim(vecn);
361 if(vecn==
"int" || vecn==
"double" || vecn==
"float" || vecn==
"string")
363 ws_funcs.append(
"for(int i=0;i<_retval.size();i++)");
364 ws_funcs.append(
"_retStr += \"<\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\"+CastUtil::lexical_cast<string>(_retval.at(i))+\"</\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\";\n");
368 ws_funcs.append(
"for(int i=0;i<_retval.size();i++)");
369 ws_funcs.append(
"_retStr += \"<\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\"+_getRetXmlFor"+vecn+
"(_retval.at(i),_req.getNameSpc())+\"</\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\";\n");
373 ws_funcs.append(
"_retStr += \"<\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\"+_getRetXmlFor"+pars[
"RETURNTYP"]+
"(_retval,_req.getNameSpc())+\"</\" + _req.getNameSpc() + \":"+pars[
"RETURN"]+
">\";\n");
375 ws_funcs.append(
"_retStr += \"</\" + _req.getTagNameSpc() + \"Response>\";\n");
376 ws_funcs.append(
"}catch(Exception e){\n");
377 ws_funcs.append(
"return e.getMessage();\n}\n");
378 ws_funcs.append(
"catch(...){\n");
379 ws_funcs.append(
"return \"<soap:Fault><faultcode>soap:Server</faultcode><faultstring>Exception occurred</faultstring></soap:Fault>\";\n}\n");
380 ws_funcs.append(
"return _retStr;\n}\n");
382 ws_funcs.append(
"}\n");