tars2android.cpp 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "tars2android.h"
  17. #include "interface_analysis.h"
  18. #include "tars_filter.h"
  19. #include "util/tc_md5.h"
  20. #include "util/tc_file.h"
  21. #include "util/tc_common.h"
  22. #include <string>
  23. #define TAB g_parse->getTab()
  24. #define INC_TAB g_parse->incTab()
  25. #define DEL_TAB g_parse->delTab()
  26. static string g_default_package = "com.tars";
  27. //////////////////////////////////////////////////////////////////////////////////
  28. //
  29. Tars2Java::Tars2Java()
  30. {
  31. _bForceArray = false;
  32. _bCheckDefault = false;
  33. _bWithJbr = false;
  34. _bWithCompact = false;
  35. s_TARS_PACKAGE = g_default_package + TARS_PACKAGE;
  36. s_PROXY_PACKAGE = g_default_package + PROXY_PACKAGE;
  37. s_WUP_PACKAGE = g_default_package + WUP_PACKAGE;
  38. }
  39. string Tars2Java::writeTo(const TypeIdPtr& pPtr) const
  40. {
  41. ostringstream s;
  42. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  43. {
  44. s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  45. }
  46. else
  47. {
  48. s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  49. }
  50. return s.str();
  51. }
  52. string Tars2Java::readFrom(const TypeIdPtr& pPtr) const
  53. {
  54. ostringstream s;
  55. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  56. {
  57. s << TAB << "_is.read((tars::Int32&)" << pPtr->getId();
  58. }
  59. else
  60. {
  61. s << TAB << "_is.read(" << pPtr->getId();
  62. }
  63. s << ", " << pPtr->getTag() << ", " << (pPtr->isRequire() ? "true" : "false") << ");" << endl;
  64. return s.str();
  65. }
  66. string Tars2Java::display(const TypeIdPtr& pPtr) const
  67. {
  68. ostringstream s;
  69. if (EnumPtr::dynamicCast(pPtr->getTypePtr()))
  70. {
  71. s << TAB << "_ds.display((tars::Int32)" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;;
  72. }
  73. else
  74. {
  75. s << TAB << "_ds.display(" << pPtr->getId() << ",\"" << pPtr->getId() << "\");" << endl;;
  76. }
  77. return s.str();
  78. }
  79. string Tars2Java::toTypeInit(const TypePtr& pPtr) const
  80. {
  81. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  82. if (bPtr)
  83. {
  84. switch (bPtr->kind())
  85. {
  86. case Builtin::KindBool:
  87. return "false;";
  88. case Builtin::KindByte:
  89. return "0;";
  90. case Builtin::KindShort:
  91. return "0;";
  92. case Builtin::KindInt:
  93. return "0;";
  94. case Builtin::KindLong:
  95. return "0L;";
  96. case Builtin::KindFloat:
  97. return "0.0f;";
  98. case Builtin::KindDouble:
  99. return "0.0;";
  100. case Builtin::KindString:
  101. return "\"\";";
  102. default:
  103. return "";
  104. }
  105. }
  106. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  107. if (vPtr)
  108. {
  109. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  110. if (bPtr && bPtr->kind() == Builtin::KindByte)
  111. {
  112. return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + tostr(vPtr->getTypePtr()) + "[1];";
  113. }
  114. if (_bForceArray)
  115. {
  116. string sType;
  117. size_t iPosBegin, iPosEnd;
  118. sType = tostr(vPtr->getTypePtr());
  119. //map<>的数组去掉 '<...>'
  120. if ((iPosBegin = sType.find("<")) != string::npos && (iPosEnd = sType.rfind(">")) != string::npos)
  121. {
  122. sType = sType.substr(0, iPosBegin) + sType.substr(iPosEnd + 1);
  123. }
  124. //[] (数组)的数组变为[1]
  125. sType = tars::TC_Common::replace(sType, "[]", "[1]");
  126. return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + sType + "[1];";;
  127. }
  128. return "new " + tostrVector(vPtr) + "();";
  129. }
  130. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  131. if (mPtr) return "new " + tostrMap(mPtr, true) + "();";
  132. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  133. if (sPtr) return "new " + tostrStruct(sPtr) + "();";
  134. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  135. if (ePtr) return "0;";
  136. return "";
  137. }
  138. string Tars2Java::toObjStr(const TypePtr& pPtr) const
  139. {
  140. string sType = tostr(pPtr);
  141. if (sType == "boolean") return "Boolean";
  142. if (sType == "byte") return "Byte";
  143. if (sType == "short") return "Short";
  144. if (sType == "int") return "Integer";
  145. if (sType == "long") return "Long";
  146. if (sType == "float") return "Float";
  147. if (sType == "double") return "Double";
  148. return sType;
  149. }
  150. bool Tars2Java::isObjType(const TypePtr& pPtr) const
  151. {
  152. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  153. if (ePtr)
  154. {
  155. return false;
  156. }
  157. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  158. if (bPtr)
  159. {
  160. switch (bPtr->kind())
  161. {
  162. case Builtin::KindBool:
  163. return false;
  164. case Builtin::KindByte:
  165. return false;
  166. case Builtin::KindShort:
  167. return false;
  168. case Builtin::KindInt:
  169. return false;
  170. case Builtin::KindLong:
  171. return false;
  172. case Builtin::KindFloat:
  173. return false;
  174. case Builtin::KindDouble:
  175. return false;
  176. default:
  177. return true;
  178. }
  179. }
  180. return true;
  181. }
  182. string Tars2Java::tostr(const TypePtr& pPtr) const
  183. {
  184. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  185. if (bPtr) return tostrBuiltin(bPtr);
  186. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  187. if (vPtr) return tostrVector(vPtr);
  188. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  189. if (mPtr) return tostrMap(mPtr);
  190. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  191. if (sPtr) return tostrStruct(sPtr);
  192. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  193. if (ePtr) return tostrEnum(ePtr);
  194. if (!pPtr) return "void";
  195. assert(false);
  196. return "";
  197. }
  198. /*******************************BuiltinPtr********************************/
  199. string Tars2Java::tostrBuiltin(const BuiltinPtr& pPtr) const
  200. {
  201. string s;
  202. switch (pPtr->kind())
  203. {
  204. case Builtin::KindBool:
  205. s = "boolean";
  206. break;
  207. case Builtin::KindByte:
  208. s = "byte";
  209. break;
  210. case Builtin::KindShort:
  211. s = "short";
  212. break;
  213. case Builtin::KindInt:
  214. s = "int";
  215. break;
  216. case Builtin::KindLong:
  217. s = "long";
  218. break;
  219. case Builtin::KindFloat:
  220. s = "float";
  221. break;
  222. case Builtin::KindDouble:
  223. s = "double";
  224. break;
  225. case Builtin::KindString:
  226. s = "String";
  227. break;
  228. case Builtin::KindVector:
  229. s = "java.util.ArrayList";
  230. break;
  231. case Builtin::KindMap:
  232. s = "java.util.HashMap";
  233. break;
  234. default:
  235. assert(false);
  236. break;
  237. }
  238. return s;
  239. }
  240. /*******************************VectorPtr********************************/
  241. string Tars2Java::tostrVector(const VectorPtr& pPtr) const
  242. {
  243. string s;
  244. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  245. if (bPtr && bPtr->kind() == Builtin::KindByte)
  246. {
  247. s = "byte []";
  248. }
  249. else if (_bForceArray)
  250. {
  251. s = tostr(pPtr->getTypePtr()) + "[]";
  252. }
  253. else
  254. {
  255. s = "java.util.ArrayList" + string("<") + toObjStr(pPtr->getTypePtr()) + ">";
  256. }
  257. return s;
  258. }
  259. /*******************************MapPtr********************************/
  260. string Tars2Java::tostrMap(const MapPtr& pPtr, bool bNew) const
  261. {
  262. string s;
  263. if (!bNew)
  264. {
  265. s = "java.util.Map";
  266. }
  267. else
  268. {
  269. s = "java.util.HashMap";
  270. }
  271. s += string("<") + toObjStr(pPtr->getLeftTypePtr()) + ", " + toObjStr(pPtr->getRightTypePtr()) + ">";
  272. return s;
  273. }
  274. string Tars2Java::tostrStruct(const StructPtr& pPtr) const
  275. {
  276. return _packagePrefix + tars::TC_Common::replace(pPtr->getSid(), "::", ".");
  277. }
  278. string Tars2Java::tostrEnum(const EnumPtr& pPtr) const
  279. {
  280. return "int";
  281. }
  282. /////////////////////////////////////////////////////////////////////
  283. string Tars2Java::MD5(const StructPtr& pPtr) const
  284. {
  285. string s;
  286. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  287. for (size_t j = 0; j < member.size(); j++)
  288. {
  289. s += "_" + tostr(member[j]->getTypePtr());
  290. }
  291. return "\"" + tars::TC_MD5::md5str(s) + "\"";
  292. }
  293. string Tars2Java::generateJava(const ParamDeclPtr& pPtr) const
  294. {
  295. ostringstream s;
  296. TypePtr typePtr = pPtr->getTypeIdPtr()->getTypePtr();
  297. if (!pPtr->isOut())
  298. {
  299. s << tostr(typePtr);
  300. }
  301. s << " " << pPtr->getTypeIdPtr()->getId();
  302. return s.str();
  303. }
  304. struct SortOperation
  305. {
  306. bool operator ()(const OperationPtr& o1, const OperationPtr& o2)
  307. {
  308. return o1->getId() < o2->getId();
  309. }
  310. };
  311. string Tars2Java::generateJava(const InterfacePtr& pPtr, const NamespacePtr& nPtr) const
  312. {
  313. ostringstream s;
  314. generateAndroidStub(pPtr, nPtr);
  315. return s.str();
  316. }
  317. string Tars2Java::generateDefautElem(const TypePtr& pPtr, const string& sElemName) const
  318. {
  319. static int iCount = 0;
  320. ostringstream s;
  321. if (sElemName.empty())
  322. {
  323. iCount++;
  324. }
  325. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  326. if (vPtr)
  327. {
  328. int iId = iCount;
  329. string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName;
  330. if (sElemName.empty())
  331. {
  332. s << TAB << toObjStr(vPtr) << " " << sVar
  333. << " = " << toTypeInit(vPtr) << endl;
  334. }
  335. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  336. if (bPtr && bPtr->kind() == Builtin::KindByte)
  337. {
  338. iCount++;
  339. s << TAB << "byte __var_" << tars::TC_Common::tostr(iCount)
  340. << " = 0;" << endl;
  341. s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar
  342. << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl;
  343. }
  344. else if (_bForceArray)
  345. {
  346. s << generateDefautElem(vPtr->getTypePtr(), "");
  347. s << TAB << "((" << tostr(vPtr->getTypePtr()) << "[])" << sVar
  348. << ")[0] = __var_" << tars::TC_Common::tostr(iId + 1) << ";" << endl;
  349. }
  350. else
  351. {
  352. s << generateDefautElem(vPtr->getTypePtr(), "");
  353. s << TAB << "((" << tostr(pPtr) << ")" << sVar << ").add(__var_" << tars::TC_Common::tostr(iId + 1) << ");" << endl;
  354. }
  355. return s.str();
  356. }
  357. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  358. if (mPtr)
  359. {
  360. int iId = iCount;
  361. string sVar = sElemName.empty() ? "__var_" + tars::TC_Common::tostr(iId) : sElemName;
  362. if (sElemName.empty())
  363. {
  364. s << TAB << toObjStr(mPtr) << " " << sVar
  365. << " = " << toTypeInit(mPtr) << endl;
  366. }
  367. s << generateDefautElem(mPtr->getLeftTypePtr(), "");
  368. int iIdRight = iCount + 1;
  369. s << generateDefautElem(mPtr->getRightTypePtr(), "");
  370. s << TAB << sVar << ".put(__var_" << tars::TC_Common::tostr(iId + 1) << ", __var_"
  371. << tars::TC_Common::tostr(iIdRight) << ");" << endl;
  372. return s.str();
  373. }
  374. //首个非map、vector调用,不用生成默认元素
  375. if (!sElemName.empty())
  376. {
  377. return s.str();
  378. }
  379. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  380. if (bPtr)
  381. {
  382. s << TAB << toObjStr(bPtr) << " __var_" << tars::TC_Common::tostr(iCount)
  383. << " = " << toTypeInit(bPtr) << endl;
  384. return s.str();
  385. }
  386. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  387. if (sPtr)
  388. {
  389. s << TAB << toObjStr(sPtr) << " __var_" << tars::TC_Common::tostr(iCount)
  390. << " = " << toTypeInit(sPtr) << endl;
  391. return s.str();
  392. }
  393. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  394. if (ePtr)
  395. {
  396. s << TAB << toObjStr(ePtr) << " __var_" << tars::TC_Common::tostr(iCount)
  397. << " = " << toTypeInit(ePtr) << endl;
  398. return s.str();
  399. }
  400. return s.str();
  401. }
  402. /******************************StructPtr***************************************/
  403. string Tars2Java::generateJava(const StructPtr& pPtr, const NamespacePtr& nPtr) const
  404. {
  405. ostringstream s;
  406. s << g_parse->printHeaderRemark();
  407. vector<string> key = pPtr->getKey();
  408. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  409. s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl;
  410. s << endl;
  411. bool bHasImpPrefix = false;
  412. // if (_bWithWsp)
  413. // {
  414. // s << TAB << "import java.util.HashMap" << ";" << endl;
  415. // s << endl;
  416. //
  417. // s << TAB << "import "<< s_WSP_PACKAGE << ";" << endl;
  418. // s << endl;
  419. // }
  420. // if (_bJson)
  421. // {
  422. // s << TAB << "import com.qq.component.json.JSON;" << endl;
  423. // s << TAB << "import com.qq.component.json.JSONException;" << endl;
  424. // s << endl;
  425. // }
  426. s << TAB << "public final class " << pPtr->getId() << " extends " << s_TARS_PACKAGE << ".TarsStruct";
  427. // if (_bWithWsp)
  428. // {
  429. // s << " implements WspStruct";
  430. // bHasImpPrefix = true;
  431. // }
  432. if (key.size() > 0)
  433. {
  434. if (bHasImpPrefix)
  435. {
  436. s << ", Comparable<" << pPtr->getId() << ">";
  437. }
  438. else
  439. {
  440. s << " implements Comparable<" << pPtr->getId() << ">";
  441. bHasImpPrefix = true;
  442. }
  443. }
  444. if (!_bWithCompact)
  445. {
  446. if (bHasImpPrefix)
  447. {
  448. s << ", java.lang.Cloneable";
  449. }
  450. else
  451. {
  452. s << " implements java.lang.Cloneable";
  453. }
  454. }
  455. s << endl;
  456. s << TAB << "{" << endl;
  457. INC_TAB;
  458. if (!_bWithCompact)
  459. {
  460. //生成结构名称
  461. s << TAB << "public String className()" << endl;
  462. s << TAB << "{" << endl;
  463. INC_TAB;
  464. s << TAB << "return " << "\"" << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl;
  465. DEL_TAB;
  466. s << TAB << "}" << endl;
  467. s << endl;
  468. // 生成带包前缀的结构名
  469. s << TAB << "public String fullClassName()" << endl;
  470. s << TAB << "{" << endl;
  471. INC_TAB;
  472. s << TAB << "return " << "\"" << _packagePrefix << nPtr->getId() << "." << pPtr->getId() << "\"" << ";" << endl;
  473. DEL_TAB;
  474. s << TAB << "}" << endl;
  475. s << endl;
  476. }
  477. // if (_bWithWsp)
  478. // {
  479. // s << TAB <<"private HashMap<String,Object> arr = new HashMap<String,Object>();"<<endl;
  480. // }
  481. //定义成员变量
  482. for (size_t i = 0; i < member.size(); i++)
  483. {
  484. string sDefalut;
  485. if (member[i]->hasDefault())
  486. {
  487. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  488. EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr());
  489. //string转义
  490. if (bPtr && bPtr->kind() == Builtin::KindString)
  491. {
  492. sDefalut = tars::TC_Common::replace(member[i]->def(), "\"", "\\\"");
  493. //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")\"" + sDefalut + "\"";
  494. sDefalut = " = \"" + sDefalut + "\"";
  495. }
  496. else if (ePtr)
  497. {
  498. std::string sdef = member[i]->def();
  499. std::string::size_type pos = sdef.rfind("::");
  500. if (pos != std::string::npos && pos + 2 < sdef.size())
  501. {
  502. sdef = sdef.substr(pos + 2);
  503. }
  504. if (_bEnumCompact)
  505. {
  506. sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "._" + sdef;
  507. }
  508. else
  509. {
  510. sDefalut = " = " + _packagePrefix + tars::TC_Common::replace(ePtr->getSid(), "::", ".") + "." + sdef + ".value()";
  511. }
  512. }
  513. else
  514. {
  515. //sDefalut = " = (" + tostr(member[i]->getTypePtr()) + ")" + member[i]->def();
  516. sDefalut = " = " + member[i]->def();
  517. }
  518. s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << ";" << endl;
  519. }
  520. else
  521. {
  522. sDefalut = " = " + toTypeInit(member[i]->getTypePtr());
  523. //s << TAB << "public " << tostr(member[i]->getTypePtr()) << " "<< member[i]->getId() << sDefalut << endl;
  524. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  525. EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr());
  526. if ((!bPtr && !ePtr) || (bPtr && bPtr->kind() == Builtin::KindString))
  527. {
  528. s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << " = null;" << endl;
  529. }
  530. else
  531. {
  532. s << TAB << "public " << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << sDefalut << endl;
  533. }
  534. }
  535. s << endl;
  536. }
  537. if (!_bWithCompact)
  538. {
  539. //成员变量get/set for java bean
  540. for (size_t i = 0; i < member.size(); i++)
  541. {
  542. string sName = "";
  543. //支持javabean规范,并且第二个字符是大写
  544. if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z')
  545. {
  546. sName = member[i]->getId();
  547. }
  548. else
  549. {
  550. sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1);
  551. }
  552. s << TAB << "public " << tostr(member[i]->getTypePtr()) << " get" << sName
  553. << "()" << endl;
  554. s << TAB << "{" << endl;
  555. INC_TAB;
  556. s << TAB << "return " << member[i]->getId() << ";" << endl;
  557. DEL_TAB;
  558. s << TAB << "}" << endl;
  559. s << endl;
  560. s << TAB << "public void " << " set" << sName << "(" << tostr(member[i]->getTypePtr()) << " " << member[i]->getId() << ")" << endl;
  561. s << TAB << "{" << endl;
  562. INC_TAB;
  563. s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl;
  564. // if (_bWithWsp)
  565. // {
  566. // s << TAB <<"arr.put(\""<<member[i]->getId()<<"\","<< member[i]->getId()<<");"<<endl;
  567. // }
  568. DEL_TAB;
  569. s << TAB << "}" << endl;
  570. s << endl;
  571. }
  572. }
  573. //(constructor)()
  574. s << TAB << "public " << pPtr->getId() << "()" << endl;
  575. s << TAB << "{" << endl;
  576. INC_TAB;
  577. // if (_bWithWsp)
  578. // {
  579. // s << TAB << "buildIndex();" << endl;
  580. // }
  581. // else
  582. {
  583. /*
  584. * 无参的够造函数,不用调用成员设置方法
  585. for (size_t i = 0; i < member.size(); i++)
  586. {
  587. string sName = "";
  588. //支持javabean规范,并且第二个字符是大写
  589. if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' )
  590. {
  591. sName = member[i]->getId();
  592. }
  593. else
  594. {
  595. sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1);
  596. }
  597. s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl;
  598. }
  599. */
  600. }
  601. DEL_TAB;
  602. s << TAB << "}" << endl;
  603. s << endl;
  604. //(constructor)(...)
  605. s << TAB << "public " << pPtr->getId() << "(";
  606. for (size_t i = 0; i < member.size(); i++)
  607. {
  608. s << tostr(member[i]->getTypePtr()) << " " << member[i]->getId()
  609. << ((i < member.size() - 1) ? ", " : "");
  610. }
  611. s << ")" << endl;
  612. s << TAB << "{" << endl;
  613. INC_TAB;
  614. for (size_t i = 0; i < member.size(); i++)
  615. {
  616. s << TAB << "this." << member[i]->getId() << " = " << member[i]->getId() << ";" << endl;
  617. }
  618. DEL_TAB;
  619. s << TAB << "}" << endl;
  620. s << endl;
  621. //compareTo()
  622. if (key.size() > 0)
  623. {
  624. s << TAB << "public int compareTo(" << pPtr->getId() << " o)" << endl;
  625. s << TAB << "{" << endl;
  626. INC_TAB;
  627. s << TAB << "int[] r = " << endl;
  628. s << TAB << "{" << endl;
  629. INC_TAB;
  630. for (size_t i = 0; i < key.size(); i++)
  631. {
  632. s << TAB << s_TARS_PACKAGE << ".TarsUtil.compareTo(" << key[i] << ", o."
  633. << key[i] << ")" << ((i < key.size() - 1) ? ", " : "") << endl;
  634. }
  635. DEL_TAB;
  636. s << TAB << "};" << endl;
  637. s << TAB << "for(int i = 0; i < r.length; ++i)" << endl;
  638. s << TAB << "{" << endl;
  639. INC_TAB;
  640. s << TAB << "if(r[i] != 0) return r[i];" << endl;
  641. DEL_TAB;
  642. s << TAB << "}" << endl;
  643. s << TAB << "return 0;" << endl;
  644. DEL_TAB;
  645. s << TAB << "}" << endl;
  646. s << endl;
  647. }
  648. if (!_bWithCompact)
  649. {
  650. //equals()
  651. s << TAB << "public boolean equals(Object o)" << endl;
  652. s << TAB << "{" << endl;
  653. INC_TAB;
  654. s << TAB << "if(o == null)" << endl;
  655. s << TAB << "{" << endl;
  656. INC_TAB;
  657. s << TAB << "return false;" << endl;
  658. DEL_TAB;
  659. s << TAB << "}" << endl;
  660. s << endl;
  661. s << TAB << pPtr->getId() << " t = (" << pPtr->getId() << ") o;" << endl;
  662. s << TAB << "return (" << endl;
  663. INC_TAB;
  664. //定义了key
  665. if (key.size() > 0)
  666. {
  667. for (size_t i = 0; i < key.size(); i++)
  668. {
  669. s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << key[i] << ", t." << key[i] << ")"
  670. << ((i < key.size() - 1) ? " && " : " );") << endl;
  671. }
  672. }
  673. else
  674. {
  675. //使用所有元素比较
  676. for (size_t i = 0; i < member.size(); i++)
  677. {
  678. s << TAB << s_TARS_PACKAGE << ".TarsUtil.equals(" << member[i]->getId() << ", t." << member[i]->getId() << ")"
  679. << ((i < member.size() - 1) ? " && " : " );") << endl;
  680. }
  681. }
  682. DEL_TAB;
  683. DEL_TAB;
  684. s << TAB << "}" << endl;
  685. s << endl;
  686. }
  687. if (!_bWithCompact)
  688. {
  689. //hashCode()
  690. if (key.size() > 0)
  691. {
  692. s << TAB << "public int hashCode()" << endl;
  693. s << TAB << "{" << endl;
  694. INC_TAB;
  695. s << TAB << "int [] hc = { " << endl;
  696. INC_TAB;
  697. for (size_t i = 0; i < key.size(); i++)
  698. {
  699. s << TAB << s_TARS_PACKAGE << ".TarsUtil.hashCode(" << key[i]
  700. << ")" << ((i < key.size() - 1) ? ", " : "") << endl;
  701. }
  702. DEL_TAB;
  703. s << TAB << "};" << endl;
  704. s << TAB << "return java.util.Arrays.hashCode(hc);" << endl;
  705. DEL_TAB;
  706. s << TAB << "}" << endl;
  707. s << endl;
  708. }
  709. else //生成异常代码
  710. {
  711. s << TAB << "public int hashCode()" << endl;
  712. s << TAB << "{" << endl;
  713. INC_TAB;
  714. s << TAB << "try" << endl;
  715. s << TAB << "{" << endl;
  716. INC_TAB;
  717. s << TAB << "throw new Exception(\"Need define key first!\");" << endl;
  718. DEL_TAB;
  719. s << TAB << "}" << endl;
  720. s << TAB << "catch(Exception ex)" << endl;
  721. s << TAB << "{" << endl;
  722. INC_TAB;
  723. s << TAB << "ex.printStackTrace();" << endl;
  724. DEL_TAB;
  725. s << TAB << "}" << endl;
  726. s << TAB << "return 0;" << endl;
  727. DEL_TAB;
  728. s << TAB << "}" << endl;
  729. }
  730. }
  731. if (!_bWithCompact)
  732. {
  733. //clone()
  734. s << TAB << "public java.lang.Object clone()" << endl;
  735. s << TAB << "{" << endl;
  736. INC_TAB;
  737. s << TAB << "java.lang.Object o = null;" << endl;
  738. s << TAB << "try" << endl;
  739. s << TAB << "{" << endl;
  740. INC_TAB;
  741. s << TAB << "o = super.clone();" << endl;
  742. DEL_TAB;
  743. s << TAB << "}" << endl;
  744. s << TAB << "catch(CloneNotSupportedException ex)" << endl;
  745. s << TAB << "{" << endl;
  746. INC_TAB;
  747. s << TAB << "assert false; // impossible" << endl;
  748. DEL_TAB;
  749. s << TAB << "}" << endl;
  750. s << TAB << "return o;" << endl;
  751. DEL_TAB;
  752. s << TAB << "}" << endl;
  753. s << endl;
  754. }
  755. //writeTo()
  756. s << TAB << "public void writeTo(" << s_TARS_PACKAGE << ".TarsOutputStream _os)" << endl;
  757. s << TAB << "{" << endl;
  758. INC_TAB;
  759. for (size_t i = 0; i < member.size(); i++)
  760. {
  761. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  762. EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr());
  763. if (!member[i]->isRequire() && ((!bPtr && !ePtr) || (bPtr && bPtr->kind() == Builtin::KindString)))
  764. {
  765. s << TAB << "if (null != " << member[i]->getId() << ")" << endl;
  766. s << TAB << "{" << endl;
  767. INC_TAB;
  768. s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl;
  769. DEL_TAB;
  770. s << TAB << "}" << endl;
  771. }
  772. else if (EnumPtr::dynamicCast(member[i]->getTypePtr()))
  773. {
  774. s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl;
  775. }
  776. else
  777. {
  778. //s << TAB << "_os.write(" << pPtr->getId() << ", " << pPtr->getTag() << ");" << endl;
  779. MapPtr mPtr = MapPtr::dynamicCast(member[i]->getTypePtr());
  780. VectorPtr vPtr = VectorPtr::dynamicCast(member[i]->getTypePtr());
  781. if (!_bCheckDefault || member[i]->isRequire() || (!member[i]->hasDefault() && !mPtr && !vPtr))
  782. {
  783. s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl;
  784. }
  785. else
  786. {
  787. string sDefault = member[i]->def();
  788. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  789. if (bPtr && bPtr->kind() == Builtin::KindString)
  790. {
  791. sDefault = "\"" + tars::TC_Common::replace(member[i]->def(), "\"", "\\\"") + "\"";
  792. }
  793. if (mPtr)
  794. {
  795. s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl;
  796. }
  797. else if (vPtr)
  798. {
  799. BuiltinPtr newPtr = BuiltinPtr::dynamicCast(vPtr->getTypePtr());
  800. if (newPtr && newPtr->kind() == Builtin::KindByte)
  801. {
  802. s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl;
  803. }
  804. else if (_bForceArray)
  805. {
  806. s << TAB << "if (" << member[i]->getId() << ".length > 0)" << endl;
  807. }
  808. else
  809. {
  810. s << TAB << "if (" << member[i]->getId() << ".size() > 0)" << endl;
  811. }
  812. }
  813. else if (bPtr && bPtr->kind() == Builtin::KindString)
  814. {
  815. s << TAB << "if (!(" << sDefault << ".equals(" << member[i]->getId() << ")))" << endl;
  816. }
  817. else
  818. {
  819. s << TAB << "if (" << member[i]->getId() << " != " << sDefault << ")" << endl;
  820. }
  821. s << TAB << "{" << endl;
  822. INC_TAB;
  823. s << TAB << "_os.write(" << member[i]->getId() << ", " << member[i]->getTag() << ");" << endl;
  824. DEL_TAB;
  825. s << TAB << "}" << endl;
  826. }
  827. }
  828. }
  829. DEL_TAB;
  830. s << TAB << "}" << endl;
  831. s << endl;
  832. for (size_t i = 0; i < member.size(); i++)
  833. {
  834. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  835. if (!bPtr)
  836. {
  837. string prefix = "cache_";
  838. s << TAB << "static " << tostr(member[i]->getTypePtr()) << " cache_" << member[i]->getId() << ";" << endl;
  839. s << TAB << "static {" << endl;
  840. INC_TAB;
  841. s << TAB << prefix << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl;
  842. s << generateDefautElem(member[i]->getTypePtr(), prefix + member[i]->getId());
  843. DEL_TAB;
  844. s << TAB << "}" << endl;
  845. }
  846. }
  847. s << endl;
  848. //readFrom()
  849. s << TAB << "public void readFrom(" << s_TARS_PACKAGE << ".TarsInputStream _is)" << endl;
  850. s << TAB << "{" << endl;
  851. INC_TAB;
  852. for (size_t i = 0; i < member.size(); i++)
  853. {
  854. string prefix = "";
  855. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[i]->getTypePtr());
  856. EnumPtr ePtr = EnumPtr::dynamicCast(member[i]->getTypePtr());
  857. if (!bPtr && !ePtr)
  858. {
  859. prefix = "cache_";
  860. }
  861. //if (!bPtr && !ePtr)
  862. //{
  863. // prefix = "cache_";
  864. // //放置默认元素用于识别类型
  865. // s << TAB <<"if(null == "<<prefix<<member[i]->getId()<<")"<<endl;
  866. // s << TAB <<"{"<<endl;
  867. // INC_TAB;
  868. // s << TAB <<prefix << member[i]->getId()<<" = " << toTypeInit(member[i]->getTypePtr()) << endl;
  869. // s << generateDefautElem(member[i]->getTypePtr(), prefix+member[i]->getId());
  870. // DEL_TAB;
  871. // s << TAB <<"}"<<endl;
  872. // //
  873. // //s << TAB << member[i]->getId() << " = " << toTypeInit(member[i]->getTypePtr()) << endl;
  874. // //s << generateDefautElem(member[i]->getTypePtr(), member[i]->getId());
  875. //}
  876. //string特殊处理
  877. if (bPtr && bPtr->kind() == Builtin::KindString)
  878. {
  879. s << TAB << "this." << member[i]->getId() << " = "
  880. << " _is.readString(" << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl;
  881. }
  882. else
  883. {
  884. s << TAB << "this." << member[i]->getId() << " = (" + tostr(member[i]->getTypePtr()) + ")"
  885. << " _is.read(" << prefix + member[i]->getId()
  886. << ", " << member[i]->getTag() << ", " << (member[i]->isRequire() ? "true" : "false") << ");" << endl;
  887. }
  888. }
  889. DEL_TAB;
  890. s << TAB << "}" << endl;
  891. s << endl;
  892. // if (_bJson)
  893. // {
  894. // //writeToJsonString
  895. // s << TAB << "public String writeToJsonString() throws JSONException" << endl;
  896. // s << TAB << "{" << endl;
  897. // INC_TAB;
  898. // s << TAB << "return JSON.toJSONString(this);" << endl;
  899. // DEL_TAB;
  900. // s << TAB << "}" << endl;
  901. // s << endl;
  902. //
  903. // //readFromJsonString
  904. // s << TAB << "public void readFromJsonString(String text) throws JSONException" << endl;
  905. // s << TAB << "{" << endl;
  906. // INC_TAB;
  907. // s << TAB << pPtr->getId() << " temp = " << "JSON.parseObject(text, " << pPtr->getId() << ".class);" << endl;
  908. // for (size_t i = 0; i < member.size(); i++)
  909. // {
  910. // s << TAB << "this." << member[i]->getId() << " = temp." << member[i]->getId() << ";" << endl;
  911. // }
  912. // DEL_TAB;
  913. // s << TAB << "}" << endl;
  914. // s << endl;
  915. // }
  916. if (!_bWithCompact)
  917. {
  918. //display()
  919. s << TAB << "public void display(java.lang.StringBuilder _os, int _level)" << endl;
  920. s << TAB << "{" << endl;
  921. INC_TAB;
  922. s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl;
  923. for (size_t i = 0; i < member.size(); i++)
  924. {
  925. s << TAB << "_ds.display(" << member[i]->getId()
  926. << ", \"" << member[i]->getId() << "\");" << endl;
  927. }
  928. DEL_TAB;
  929. s << TAB << "}" << endl;
  930. s << endl;
  931. //displaySimple()
  932. // s << TAB << "public void displaySimple(java.lang.StringBuilder _os, int _level)" << endl;
  933. // s << TAB << "{" << endl;
  934. // INC_TAB;
  935. // s << TAB << s_TARS_PACKAGE << ".TarsDisplayer _ds = new " << s_TARS_PACKAGE << ".TarsDisplayer(_os, _level);" << endl;
  936. // for (size_t i = 0; i < member.size(); i++)
  937. // {
  938. // if(i != member.size() - 1)
  939. // {
  940. // s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", true);" << endl;
  941. // }
  942. // else
  943. // {
  944. // s << TAB << "_ds.displaySimple(" << member[i]->getId() << ", false);" << endl;
  945. // }
  946. // }
  947. // DEL_TAB;
  948. // s << TAB << "}" << endl;
  949. // s << endl;
  950. }
  951. // if (_bWithWsp)
  952. // {
  953. // s << TAB << "public Object getFieldByName(String name)" << endl;
  954. // s << TAB << "{" << endl;
  955. // INC_TAB;
  956. // s << TAB <<"return arr.get(name);"<<endl;
  957. // DEL_TAB;
  958. // s << TAB << "}" << endl;
  959. // s <<endl;
  960. //
  961. //// s << TAB <<"@Override"<<endl;
  962. // s << TAB << "public boolean containField(String name)" << endl;
  963. // s << TAB << "{" << endl;
  964. // INC_TAB;
  965. // s << TAB <<"return arr.containsKey(name);"<<endl;
  966. // DEL_TAB;
  967. // s << TAB << "}" << endl;
  968. // s <<endl;
  969. //
  970. //// s << TAB <<"@Override"<<endl;
  971. // s << TAB << "public void setFieldByName(String name, Object value)" << endl;
  972. // s << TAB << "{" << endl;
  973. // INC_TAB;
  974. // s << TAB <<"throw new RuntimeException(this+\" can not support setFieldByName now\");"<<endl;
  975. // DEL_TAB;
  976. // s << TAB << "}" << endl;
  977. // s <<endl;
  978. //
  979. //// s << TAB <<"@Override"<<endl;
  980. // s << TAB << "public void buildIndex()" << endl;
  981. // s << TAB << "{" << endl;
  982. // INC_TAB;
  983. // for (size_t i = 0; i < member.size(); i++)
  984. // {
  985. // string sName = "";
  986. // //支持javabean规范,并且第二个字符是大写
  987. // if (_bWithJbr && member[i]->getId()[1] >= 'A' && member[i]->getId()[1] <= 'Z' )
  988. // {
  989. // sName = member[i]->getId();
  990. // }
  991. // else
  992. // {
  993. // sName = tars::TC_Common::upper(member[i]->getId().substr(0, 1)) + member[i]->getId().substr(1);
  994. // }
  995. // s << TAB <<"set" << sName << "(" << member[i]->getId() << ");" << endl;
  996. // }
  997. // DEL_TAB;
  998. // s << TAB << "}" << endl;
  999. // }
  1000. DEL_TAB;
  1001. s << TAB << "}" << endl;
  1002. s << endl;
  1003. string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java";
  1004. tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
  1005. tars::TC_File::save2file(fileJava, s.str());
  1006. return s.str();
  1007. }
  1008. /******************************EnumPtr***************************************/
  1009. string Tars2Java::generateJava(const EnumPtr& pPtr, const NamespacePtr& nPtr) const
  1010. {
  1011. ostringstream s;
  1012. s << g_parse->printHeaderRemark();
  1013. s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl;
  1014. s << endl;
  1015. s << TAB << "public final class " << pPtr->getId() << " implements java.io.Serializable" << endl;
  1016. s << TAB << "{" << endl;
  1017. INC_TAB;
  1018. if (_bEnumCompact)
  1019. {
  1020. //成员变量
  1021. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  1022. bool bFlag = false;
  1023. string sValue;
  1024. for (size_t i = 0; i < member.size(); i++)
  1025. {
  1026. s << TAB << "public static final int _" << member[i]->getId() << " = ";
  1027. if (member[i]->hasDefault())
  1028. {
  1029. bFlag = true;
  1030. sValue = member[i]->def();
  1031. s << sValue;
  1032. }
  1033. else
  1034. {
  1035. if (bFlag == true)
  1036. {
  1037. assert(i > 0);
  1038. string stem = tars::TC_Common::tostr(tars::TC_Common::strto<int>(sValue) + 1);
  1039. sValue = stem;
  1040. s << stem;
  1041. }
  1042. else
  1043. {
  1044. s << tars::TC_Common::tostr(i);
  1045. }
  1046. }
  1047. s << ";" << endl;
  1048. }
  1049. }
  1050. else
  1051. {
  1052. //成员变量
  1053. vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
  1054. s << TAB << "private static " << pPtr->getId()
  1055. << "[] __values = new " << pPtr->getId()
  1056. << "[" << tars::TC_Common::tostr(member.size()) << "];" << endl;
  1057. s << TAB << "private int __value;" << endl;
  1058. s << TAB << "private String __T = new String();" << endl;
  1059. s << endl;
  1060. bool bFlag = false;
  1061. string sValue;
  1062. for (size_t i = 0; i < member.size(); i++)
  1063. {
  1064. s << TAB << "public static final int _" << member[i]->getId() << " = ";
  1065. if (member[i]->hasDefault())
  1066. {
  1067. bFlag = true;
  1068. sValue = member[i]->def();
  1069. s << sValue;
  1070. }
  1071. else
  1072. {
  1073. if (bFlag == true)
  1074. {
  1075. assert(i > 0);
  1076. string stem = tars::TC_Common::tostr(tars::TC_Common::strto<int>(sValue) + 1);
  1077. sValue = stem;
  1078. s << stem;
  1079. }
  1080. else
  1081. {
  1082. s << tars::TC_Common::tostr(i);
  1083. }
  1084. }
  1085. s << ";" << endl;
  1086. s << TAB << "public static final " << pPtr->getId() << " "
  1087. << member[i]->getId() << " = new " << pPtr->getId() << "(" << i << ",_"
  1088. << member[i]->getId() << ",\"" << member[i]->getId() << "\");" << endl;
  1089. }
  1090. s << endl;
  1091. //convert(int)
  1092. s << TAB << "public static " << pPtr->getId() << " convert(int val)" << endl;
  1093. s << TAB << "{" << endl;
  1094. INC_TAB;
  1095. s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl;
  1096. s << TAB << "{" << endl;
  1097. INC_TAB;
  1098. s << TAB << "if(__values[__i].value() == val)" << endl;
  1099. s << TAB << "{" << endl;
  1100. INC_TAB;
  1101. s << TAB << "return __values[__i];" << endl;
  1102. DEL_TAB;
  1103. s << TAB << "}" << endl;
  1104. DEL_TAB;
  1105. s << TAB << "}" << endl;
  1106. s << TAB << "assert false;" << endl;
  1107. s << TAB << "return null;" << endl;
  1108. DEL_TAB;
  1109. s << TAB << "}" << endl;
  1110. s << endl;
  1111. //convert(String)
  1112. s << TAB << "public static " << pPtr->getId() << " convert(String val)" << endl;
  1113. s << TAB << "{" << endl;
  1114. INC_TAB;
  1115. s << TAB << "for(int __i = 0; __i < __values.length; ++__i)" << endl;
  1116. s << TAB << "{" << endl;
  1117. INC_TAB;
  1118. s << TAB << "if(__values[__i].toString().equals(val))" << endl;
  1119. s << TAB << "{" << endl;
  1120. INC_TAB;
  1121. s << TAB << "return __values[__i];" << endl;
  1122. DEL_TAB;
  1123. s << TAB << "}" << endl;
  1124. DEL_TAB;
  1125. s << TAB << "}" << endl;
  1126. s << TAB << "assert false;" << endl;
  1127. s << TAB << "return null;" << endl;
  1128. DEL_TAB;
  1129. s << TAB << "}" << endl;
  1130. s << endl;
  1131. //value()
  1132. s << TAB << "public int value()" << endl;
  1133. s << TAB << "{" << endl;
  1134. INC_TAB;
  1135. s << TAB << "return __value;" << endl;
  1136. DEL_TAB;
  1137. s << TAB << "}" << endl;
  1138. s << endl;
  1139. //toString()
  1140. s << TAB << "public String toString()" << endl;
  1141. s << TAB << "{" << endl;
  1142. INC_TAB;
  1143. s << TAB << "return __T;" << endl;
  1144. DEL_TAB;
  1145. s << TAB << "}" << endl;
  1146. s << endl;
  1147. //(constructor)(int)
  1148. s << TAB << "private " << pPtr->getId() << "(int index, int val, String s)" << endl;
  1149. s << TAB << "{" << endl;
  1150. INC_TAB;
  1151. s << TAB << "__T = s;" << endl;
  1152. s << TAB << "__value = val;" << endl;
  1153. s << TAB << "__values[index] = this;" << endl;
  1154. DEL_TAB;
  1155. s << TAB << "}" << endl;
  1156. s << endl;
  1157. }
  1158. DEL_TAB;
  1159. s << TAB << "}" << endl;
  1160. string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java";
  1161. tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
  1162. tars::TC_File::save2file(fileJava, s.str());
  1163. return s.str();
  1164. }
  1165. /******************************ConstPtr***************************************/
  1166. void Tars2Java::generateJava(const ConstPtr& pPtr, const NamespacePtr& nPtr) const
  1167. {
  1168. ostringstream s;
  1169. s << g_parse->printHeaderRemark();
  1170. //const类型的包单独放到一个const目录下面
  1171. s << TAB << "package " << _packagePrefix << nPtr->getId() << ".cnst" << ";" << endl;
  1172. s << endl;
  1173. s << TAB << "public interface " << pPtr->getTypeIdPtr()->getId() << endl;
  1174. s << TAB << "{" << endl;
  1175. INC_TAB;
  1176. //TODO: String转义 / long 识别 / byte 范围
  1177. if (pPtr->getConstGrammarPtr()->t == ConstGrammar::STRING)
  1178. {
  1179. string tmp = tars::TC_Common::replace(pPtr->getConstGrammarPtr()->v, "\"", "\\\"");
  1180. s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = \""
  1181. << tmp << "\";" << endl;
  1182. }
  1183. else if (tostr(pPtr->getTypeIdPtr()->getTypePtr()) == "long")
  1184. {
  1185. s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = "
  1186. << pPtr->getConstGrammarPtr()->v << "L;" << endl;
  1187. }
  1188. else
  1189. {
  1190. s << TAB << tostr(pPtr->getTypeIdPtr()->getTypePtr()) << " value = "
  1191. << pPtr->getConstGrammarPtr()->v << ";" << endl;
  1192. }
  1193. DEL_TAB;
  1194. s << TAB << "}" << endl;
  1195. string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".java";
  1196. tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/"));
  1197. tars::TC_File::save2file(fileJava, s.str());
  1198. return;
  1199. }
  1200. /******************************Tars2Java***************************************/
  1201. void Tars2Java::generateJava(const ContextPtr& pPtr) const
  1202. {
  1203. ostringstream s;
  1204. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  1205. for (size_t i = 0; i < namespaces.size(); i++)
  1206. {
  1207. generateJava(namespaces[i]);
  1208. }
  1209. }
  1210. void Tars2Java::createFile(const string& file)
  1211. {
  1212. std::vector<ContextPtr> contexts = g_parse->getContexts();
  1213. for (size_t i = 0; i < contexts.size(); i++)
  1214. {
  1215. if (file == contexts[i]->getFileName())
  1216. {
  1217. generateJava(contexts[i]);
  1218. }
  1219. }
  1220. }
  1221. void Tars2Java::setBaseDir(const string& dir)
  1222. {
  1223. _baseDir = dir;
  1224. }
  1225. void Tars2Java::setBasePackage(const string& prefix)
  1226. {
  1227. _packagePrefix = prefix;
  1228. if (_packagePrefix.length() != 0
  1229. && _packagePrefix.substr(_packagePrefix.length() - 1, 1) != ".")
  1230. {
  1231. _packagePrefix += ".";
  1232. }
  1233. }
  1234. string Tars2Java::getFilePath(const string& ns) const
  1235. {
  1236. return _baseDir + FILE_SEP + tars::TC_Common::replace(_packagePrefix, ".", FILE_SEP) + FILE_SEP + ns + FILE_SEP;
  1237. }
  1238. // 增加的函数
  1239. static string firstCharUpper(const string& castStr) {
  1240. string resultStr = castStr;
  1241. if (castStr.size() > 0) {
  1242. resultStr[0] = toupper(castStr[0]);
  1243. }
  1244. return resultStr;
  1245. }
  1246. void Tars2Java::generateJava(const NamespacePtr &pPtr) const
  1247. {
  1248. vector<InterfacePtr> &is = pPtr->getAllInterfacePtr();
  1249. vector<StructPtr> &ss = pPtr->getAllStructPtr();
  1250. vector<EnumPtr> &es = pPtr->getAllEnumPtr();
  1251. vector<ConstPtr> &cs = pPtr->getAllConstPtr();
  1252. InterfaceAnalysis interfaceAnalysis;
  1253. if (_bWithGenerateInterfaceDependencies) {
  1254. interfaceAnalysis.analysis(is);
  1255. }
  1256. for (size_t i = 0; i < is.size(); i++)
  1257. {
  1258. generateJava(is[i], pPtr);
  1259. }
  1260. TarsFilter romTarsFilter;
  1261. std::map<std::string, StructPtr> needGenerateStructMap;
  1262. if (_bWithGenerateInterfaceDependencies) {
  1263. if (_bWithFilterRomTars) {
  1264. romTarsFilter.filterStructs(
  1265. interfaceAnalysis.getAllStructs(), needGenerateStructMap);
  1266. } else {
  1267. needGenerateStructMap = interfaceAnalysis.getAllStructs();
  1268. }
  1269. }
  1270. for (size_t i = 0; i < ss.size(); i++)
  1271. {
  1272. generateJava(ss[i], pPtr);
  1273. needGenerateStructMap.erase(ss[i]->getSid());
  1274. }
  1275. for (std::map<std::string, StructPtr>::const_iterator
  1276. it = needGenerateStructMap.begin(); it != needGenerateStructMap.end(); ++it) {
  1277. generateJava(it->second, pPtr);
  1278. }
  1279. std::map<std::string, EnumPtr> needGenerateEnumMap;
  1280. if (_bWithGenerateInterfaceDependencies) {
  1281. if (_bWithFilterRomTars) {
  1282. romTarsFilter.filterEnums(
  1283. interfaceAnalysis.getAllEnums(), needGenerateEnumMap);
  1284. } else {
  1285. needGenerateEnumMap = interfaceAnalysis.getAllEnums();
  1286. }
  1287. }
  1288. for (size_t i = 0; i < es.size(); i++)
  1289. {
  1290. generateJava(es[i], pPtr);
  1291. needGenerateEnumMap.erase(es[i]->getSid());
  1292. }
  1293. for (std::map<std::string, EnumPtr>::const_iterator
  1294. it = needGenerateEnumMap.begin(); it != needGenerateEnumMap.end(); ++it) {
  1295. generateJava(it->second, pPtr);
  1296. }
  1297. for (size_t i = 0; i < cs.size(); i++)
  1298. {
  1299. generateJava(cs[i], pPtr);
  1300. }
  1301. return;
  1302. }
  1303. // 增加的实现
  1304. string Tars2Java::generateConstructor(const TypePtr& vType) const {
  1305. stringstream s;
  1306. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vType);
  1307. if (bPtr) {
  1308. switch (bPtr->kind()) {
  1309. case Builtin::KindBool: {
  1310. s << "Boolean.valueOf(false)";
  1311. } break;
  1312. case Builtin::KindByte: {
  1313. s << "Byte.valueOf((byte)0)";
  1314. } break;
  1315. case Builtin::KindShort: {
  1316. s << "Short.valueOf((short)0)";
  1317. } break;
  1318. case Builtin::KindInt: {
  1319. s << "Integer.valueOf(0)";
  1320. } break;
  1321. case Builtin::KindLong: {
  1322. s << "Long.valueOf(0)";
  1323. } break;
  1324. case Builtin::KindFloat : {
  1325. s << "Float.valueOf((float)0)";
  1326. } break;
  1327. case Builtin::KindDouble : {
  1328. s << "Double.valueOf((double)0)";
  1329. } break;
  1330. default:{
  1331. s << "new " << toObjStr(vType) << "()";
  1332. } break;
  1333. }
  1334. } else {
  1335. s << "new " << toObjStr(vType) << "()";
  1336. }
  1337. return s.str();
  1338. }
  1339. string Tars2Java::generateAndroidJavaParams(
  1340. const vector<ParamDeclPtr>& vParamDecl
  1341. , bool needParamType
  1342. , bool needOutParam) const {
  1343. ostringstream s;
  1344. bool needDot = false;
  1345. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1346. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1347. if (!paramDeclPtr->isOut()) {
  1348. if (!needDot) {
  1349. needDot = true;
  1350. } else {
  1351. s << ", ";
  1352. }
  1353. if (needParamType) {
  1354. s << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " ";
  1355. }
  1356. s << "in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId());
  1357. } else if (needOutParam){
  1358. if (!needDot) {
  1359. needDot = true;
  1360. } else {
  1361. s << ", ";
  1362. }
  1363. if (needParamType) {
  1364. s << "WupOutWrapper<" << toObjStr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << "> ";
  1365. }
  1366. s<< "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId());
  1367. }
  1368. }
  1369. return s.str();
  1370. }
  1371. string Tars2Java::generateAndroidStub(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const {
  1372. ostringstream s;
  1373. s << g_parse->printHeaderRemark();
  1374. s << TAB << "package " << _packagePrefix << nPtr->getId() << ";" << endl;
  1375. s << endl;
  1376. s << TAB << "import java.util.concurrent.Semaphore;" << endl;
  1377. s << TAB << "import com.tars.wupagent.api.WupConstants.WUP_ERROR_CODE;" << endl;
  1378. s << TAB << "import com.tars.wupagent.api.*;" << endl;
  1379. s << TAB << "import com.tars.wup.UniPacket;" << endl;
  1380. s << endl;
  1381. s << TAB << "public class " << firstCharUpper(pPtr->getId()) << "Agent extends WupAgent {" << endl << endl;
  1382. INC_TAB;
  1383. s << TAB << "public " << firstCharUpper(pPtr->getId()) << "Agent(String servantName) {" << endl;
  1384. INC_TAB;
  1385. s << TAB << "super(servantName);" << endl;
  1386. DEL_TAB;
  1387. s << TAB << "}" << endl;
  1388. s << endl;
  1389. string sParams;
  1390. vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  1391. std::sort(vOperation.begin(), vOperation.end(), SortOperation());
  1392. for (size_t i = 0; i < vOperation.size(); i++)
  1393. {
  1394. vector<ParamDeclPtr>& vParamDecl = vOperation[i]->getAllParamDeclPtr();
  1395. TypeIdPtr& returnType = vOperation[i]->getReturnPtr();
  1396. bool isReturnTypeVoid = false;
  1397. if (!returnType->getTypePtr()) {
  1398. isReturnTypeVoid = true;
  1399. }
  1400. // generate Result
  1401. s << TAB << "public static class " << firstCharUpper(vOperation[i]->getId()) << "Result extends WupBaseResult " << "{" << endl;
  1402. INC_TAB;
  1403. s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result() {" << endl;
  1404. s << TAB << "}" << endl << endl;
  1405. s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result(int errorCode, String errorMsg) {" << endl;
  1406. INC_TAB;
  1407. s << TAB << "super(errorCode, errorMsg);" << endl;
  1408. DEL_TAB;
  1409. s << TAB << "}" << endl << endl;
  1410. for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) {
  1411. ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex];
  1412. string inOrOutPrefix = "in";
  1413. if (paramDeclPtr->isOut()) {
  1414. inOrOutPrefix = "out";
  1415. }
  1416. s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " ";
  1417. s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl;
  1418. s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr())
  1419. << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1420. << "() {" << endl;
  1421. INC_TAB;
  1422. s << TAB << "return ";
  1423. s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl;
  1424. DEL_TAB;
  1425. s << TAB << "}" << endl;
  1426. s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result"
  1427. << " set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1428. << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr())
  1429. << " " << paramDeclPtr->getTypeIdPtr()->getId()
  1430. << ") {" << endl;
  1431. INC_TAB;
  1432. s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1433. << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl;
  1434. s << TAB << "return this;" << endl;
  1435. DEL_TAB;
  1436. s << TAB << "}" << endl << endl;
  1437. }
  1438. if (!isReturnTypeVoid) {
  1439. s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl;
  1440. s << TAB << "public " << tostr(returnType->getTypePtr())
  1441. << " getRet() {" << endl;
  1442. INC_TAB;
  1443. s << TAB << " return ret;" << endl;
  1444. DEL_TAB;
  1445. s << TAB << "}" << endl;
  1446. s << TAB << "public " << firstCharUpper(vOperation[i]->getId()) << "Result"
  1447. << " setRet(" << tostr(returnType->getTypePtr()) << " ret) {" << endl;
  1448. INC_TAB;
  1449. s << TAB << "this.ret = ret;" << endl;
  1450. s << TAB << "return this;" << endl;
  1451. DEL_TAB;
  1452. s << TAB << "}" << endl << endl;
  1453. }
  1454. DEL_TAB;
  1455. s << TAB << "}" << endl << endl;
  1456. s << TAB << "public static interface I" << firstCharUpper(vOperation[i]->getId()) << "Callback {" << endl;
  1457. INC_TAB;
  1458. s << TAB << "public void on" << firstCharUpper(vOperation[i]->getId()) << "Callback("
  1459. << firstCharUpper(vOperation[i]->getId()) << "Result result);" << endl;
  1460. DEL_TAB;
  1461. s << TAB << "}" << endl << endl;
  1462. // generate BaseMethod
  1463. s << TAB << "private static abstract class "
  1464. << firstCharUpper(vOperation[i]->getId()) << "BaseMethod extends AsyncWupMethod {" << endl;
  1465. INC_TAB;
  1466. s << TAB << "public " << firstCharUpper(vOperation[i]->getId())
  1467. << "BaseMethod(String servantName, WupOption wupOption) {" << endl;
  1468. INC_TAB;
  1469. s << TAB << "super(servantName, \"" << vOperation[i]->getId() << "\", wupOption);" << endl;
  1470. DEL_TAB;
  1471. s << TAB << "}" << endl << endl;
  1472. for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) {
  1473. ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex];
  1474. string inOrOutPrefix = "in";
  1475. bool generateSet = true;
  1476. if (paramDeclPtr->isOut()) {
  1477. inOrOutPrefix = "out";
  1478. generateSet = false;
  1479. }
  1480. s << TAB << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << " ";
  1481. s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl;
  1482. s << TAB << "public " << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr())
  1483. << " get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1484. << "() {" << endl;
  1485. INC_TAB;
  1486. s << TAB << "return ";
  1487. s << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ";" << endl;
  1488. DEL_TAB;
  1489. s << TAB << "}" << endl;
  1490. if (generateSet) {
  1491. s << TAB << "public void set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1492. << "(" << tostr(paramDeclPtr->getTypeIdPtr()->getTypePtr())
  1493. << " " << paramDeclPtr->getTypeIdPtr()->getId()
  1494. << ") {" << endl;
  1495. INC_TAB;
  1496. s << TAB << "this." << inOrOutPrefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1497. << " = " << paramDeclPtr->getTypeIdPtr()->getId() << ";" << endl;
  1498. DEL_TAB;
  1499. s << TAB << "}" << endl;
  1500. }
  1501. s << endl;
  1502. }
  1503. if (!isReturnTypeVoid) {
  1504. s << TAB << tostr(returnType->getTypePtr()) << " ret;" << endl;
  1505. s << TAB << "public " << tostr(returnType->getTypePtr())
  1506. << " getRet() {" << endl;
  1507. INC_TAB;
  1508. s << TAB << " return ret;" << endl;
  1509. DEL_TAB;
  1510. s << TAB << "}" << endl << endl;
  1511. }
  1512. s << TAB << "@Override" << endl;
  1513. s << TAB << "protected void fillReqUniPacket(UniPacket reqPacket) {" << endl;
  1514. INC_TAB;
  1515. for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) {
  1516. ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex];
  1517. if (!paramDeclPtr->isOut()) {
  1518. s << TAB << "reqPacket.put(\"" << paramDeclPtr->getTypeIdPtr()->getId()
  1519. << "\", in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl;
  1520. }
  1521. }
  1522. DEL_TAB;
  1523. s << TAB << "}" << endl <<endl;
  1524. s << TAB << "@Override" << endl;
  1525. s << TAB << "protected void fillFieldsByUniPacket(UniPacket respPacket) {" << endl;
  1526. INC_TAB;
  1527. if (!isReturnTypeVoid) {
  1528. s << TAB << "ret = respPacket.get(\"\", "
  1529. << generateConstructor(returnType->getTypePtr()) << ");" << endl;
  1530. }
  1531. for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) {
  1532. ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex];
  1533. if (paramDeclPtr->isOut()) {
  1534. s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1535. << " = respPacket.get(\"" << paramDeclPtr->getTypeIdPtr()->getId()
  1536. << "\", " << generateConstructor(paramDeclPtr->getTypeIdPtr()->getTypePtr()) << ");" << endl;
  1537. }
  1538. }
  1539. DEL_TAB;
  1540. s << TAB << "}" << endl <<endl;
  1541. DEL_TAB;
  1542. s << TAB << "}" << endl << endl;
  1543. // generate AsyncMethod
  1544. s << TAB << "private static class Async" << firstCharUpper(vOperation[i]->getId())
  1545. << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl;
  1546. INC_TAB;
  1547. s << TAB << "private I" << firstCharUpper(vOperation[i]->getId())
  1548. << "Callback m" << firstCharUpper(vOperation[i]->getId()) << "Callback;" << endl;
  1549. s << TAB << "public Async" << firstCharUpper(vOperation[i]->getId()) << "Method(String servantName"
  1550. << ", WupOption wupOption"
  1551. << ", I" << firstCharUpper(vOperation[i]->getId())
  1552. << "Callback " << vOperation[i]->getId() << "Callback) {" << endl;
  1553. INC_TAB;
  1554. s << TAB << "super(servantName, wupOption);" << endl;
  1555. s << TAB << "this.m" << firstCharUpper(vOperation[i]->getId()) << "Callback = "
  1556. << vOperation[i]->getId() << "Callback;" << endl;
  1557. DEL_TAB;
  1558. s << TAB << "}" << endl << endl;
  1559. s << TAB << "@Override" << endl;
  1560. s << TAB << "protected void onError(int errorCode, String errorMsg) {" << endl;
  1561. INC_TAB;
  1562. s << TAB << firstCharUpper(vOperation[i]->getId())
  1563. << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result(errorCode, errorMsg);" << endl;
  1564. s << TAB << "result.setRequestId(getRequestId());" << endl;
  1565. s << TAB << "m" << firstCharUpper(vOperation[i]->getId())
  1566. << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl;
  1567. DEL_TAB;
  1568. s << TAB << "}" << endl << endl;
  1569. s << TAB << "@Override" << endl;
  1570. s << TAB << "protected void onFinished() {" << endl;
  1571. INC_TAB;
  1572. s << TAB << firstCharUpper(vOperation[i]->getId())
  1573. << "Result result = new " << firstCharUpper(vOperation[i]->getId()) << "Result();" << endl;
  1574. s << TAB << "result.setRequestId(getRequestId());" << endl;
  1575. for (size_t paramIndex = 0; paramIndex < vParamDecl.size(); paramIndex++) {
  1576. ParamDeclPtr paramDeclPtr = vParamDecl[paramIndex];
  1577. s << TAB << "result.set" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1578. << "(get" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << "());" << endl;
  1579. }
  1580. if (!isReturnTypeVoid) {
  1581. s << TAB << "result.setRet(getRet());" << endl;
  1582. }
  1583. s << TAB << "m" << firstCharUpper(vOperation[i]->getId())
  1584. << "Callback.on" << firstCharUpper(vOperation[i]->getId()) << "Callback(result);" << endl;
  1585. DEL_TAB;
  1586. s << TAB << "}" << endl << endl;
  1587. DEL_TAB;
  1588. s << TAB << "}" << endl << endl;
  1589. // generate AsyncMethod end
  1590. // generate SyncMethod
  1591. s << TAB << "private static class Sync" << firstCharUpper(vOperation[i]->getId())
  1592. << "Method extends " << firstCharUpper(vOperation[i]->getId()) << "BaseMethod {" << endl;
  1593. INC_TAB;
  1594. s << TAB << "private Semaphore mSemaphore;" << endl;
  1595. s << TAB << "private WupException mWupException;" << endl;
  1596. s << TAB << "public Sync" << firstCharUpper(vOperation[i]->getId())
  1597. << "Method(String servantName, WupOption wupOption) {" << endl;
  1598. INC_TAB;
  1599. s << TAB << "super(servantName, wupOption);" << endl;
  1600. s << TAB << "mSemaphore = new Semaphore(0);" << endl;
  1601. DEL_TAB;
  1602. s << TAB << "}" << endl << endl;
  1603. s << TAB << "public void waitResponse() throws InterruptedException {" << endl;
  1604. INC_TAB;
  1605. s << TAB << "mSemaphore.acquire();" << endl;
  1606. DEL_TAB;
  1607. s << TAB << "}" << endl << endl;
  1608. s << TAB << "@Override" << endl;
  1609. s << TAB << "protected void handleFinished() {" << endl;
  1610. INC_TAB;
  1611. s << TAB << "mSemaphore.release();" << endl;
  1612. DEL_TAB;
  1613. s << TAB << "}" << endl << endl;
  1614. s << TAB << "@Override" << endl;
  1615. s << TAB << "protected void handleError(final int errorCode, final String errorMsg) {" << endl;
  1616. INC_TAB;
  1617. s << TAB << "mWupException = new WupException(errorCode, errorMsg);" << endl;
  1618. s << TAB << "mSemaphore.release();" << endl;
  1619. DEL_TAB;
  1620. s << TAB << "}" << endl << endl;
  1621. s << TAB << "public WupException getWupException() {" << endl;
  1622. INC_TAB;
  1623. s << TAB << "return mWupException;" << endl;
  1624. DEL_TAB;
  1625. s << TAB << "}" << endl << endl;
  1626. DEL_TAB;
  1627. s << TAB << "}" << endl << endl;
  1628. // generate SyncMethod end
  1629. // async api
  1630. s << TAB << "public WupHandle async_" << vOperation[i]->getId() << "(";
  1631. if (vParamDecl.size())
  1632. {
  1633. s << generateAndroidJavaParams(vParamDecl, true, false) << ", ";
  1634. }
  1635. s << "I" << firstCharUpper(vOperation[i]->getId()) << "Callback "
  1636. << vOperation[i]->getId() << "Callback) throws WupException { " << endl;
  1637. INC_TAB;
  1638. s << TAB << "if (" << vOperation[i]->getId() << "Callback == null) {" << endl;
  1639. INC_TAB;
  1640. s << TAB << "throw new IllegalArgumentException(\"" << vOperation[i]->getId()
  1641. << "Callback should not be null\");" << endl;
  1642. DEL_TAB;
  1643. s << TAB << "}" << endl;
  1644. s << TAB << "WupOption asyncWupOption = new WupOption(wupOption);" << endl;
  1645. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1646. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1647. if (!paramDeclPtr->isOut() && isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) {
  1648. s << TAB << "if (in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl;
  1649. INC_TAB;
  1650. s << TAB << "throw new IllegalArgumentException(\"in"
  1651. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl;
  1652. DEL_TAB;
  1653. s << TAB << "}" << endl << endl;
  1654. }
  1655. }
  1656. s << TAB << "Async" << firstCharUpper(vOperation[i]->getId()) << "Method "
  1657. << vOperation[i]->getId() << "Method = new Async"
  1658. << firstCharUpper(vOperation[i]->getId())
  1659. << "Method(getServantName(), asyncWupOption, " << vOperation[i]->getId() << "Callback);" << endl;
  1660. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1661. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1662. if (!paramDeclPtr->isOut()) {
  1663. s << TAB << vOperation[i]->getId() << "Method.set"
  1664. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1665. << "(in" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << ");" << endl;
  1666. }
  1667. }
  1668. s << TAB << vOperation[i]->getId() << "Method.start();" << endl;
  1669. s << TAB << "return new WupHandle(" << vOperation[i]->getId() << "Method);" << endl;
  1670. DEL_TAB;
  1671. s << TAB << "}" << endl << endl;
  1672. // async api end
  1673. // sync api
  1674. s << TAB << "public " << tostr(returnType->getTypePtr())
  1675. << " " << vOperation[i]->getId() << "("
  1676. << generateAndroidJavaParams(vParamDecl, true, true)
  1677. << ") throws WupException {" << endl;
  1678. INC_TAB;
  1679. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1680. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1681. string prefix = "in";
  1682. if (paramDeclPtr->isOut()) {
  1683. prefix = "out";
  1684. }
  1685. if (isObjType(paramDeclPtr->getTypeIdPtr()->getTypePtr())) {
  1686. s << TAB << "if (" << prefix << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " == null) {" << endl;
  1687. INC_TAB;
  1688. s << TAB << "throw new IllegalArgumentException(\"" << prefix
  1689. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId()) << " should not be null\");" << endl;
  1690. DEL_TAB;
  1691. s << TAB << "}" << endl << endl;
  1692. }
  1693. }
  1694. s << TAB << "Sync" << firstCharUpper(vOperation[i]->getId())
  1695. << "Method " << "sync" << firstCharUpper(vOperation[i]->getId())
  1696. << "Method = " << "new Sync"
  1697. << firstCharUpper(vOperation[i]->getId())
  1698. << "Method(getServantName(), wupOption);"
  1699. << endl;
  1700. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1701. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1702. if (!paramDeclPtr->isOut()) {
  1703. s << TAB << "sync" << firstCharUpper(vOperation[i]->getId())
  1704. << "Method.set"
  1705. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1706. << "(in"
  1707. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1708. << ");" << endl;
  1709. }
  1710. }
  1711. s << TAB << "sync" << firstCharUpper(vOperation[i]->getId())
  1712. << "Method.start();" << endl << endl;
  1713. s << TAB << "try {" << endl;
  1714. INC_TAB;
  1715. s << TAB << "sync" << firstCharUpper(vOperation[i]->getId())
  1716. << "Method.waitResponse();" << endl;
  1717. DEL_TAB;
  1718. s << TAB << "} catch (InterruptedException e) {" << endl;
  1719. INC_TAB;
  1720. s << TAB << "throw new WupException(WUP_ERROR_CODE.WUP_INNER_ERROR, e.getMessage());"
  1721. << endl;
  1722. DEL_TAB;
  1723. s << TAB << "}" << endl << endl;
  1724. s << TAB << "if (sync" << firstCharUpper(vOperation[i]->getId())
  1725. << "Method.getWupException() != null) {" << endl;
  1726. INC_TAB;
  1727. s << TAB << "throw sync" << firstCharUpper(vOperation[i]->getId())
  1728. << "Method.getWupException();" << endl;
  1729. DEL_TAB;
  1730. s << TAB << "}" << endl << endl;
  1731. for (size_t index = 0; index < vParamDecl.size(); ++index) {
  1732. ParamDeclPtr paramDeclPtr = vParamDecl[index];
  1733. if (paramDeclPtr->isOut()) {
  1734. s << TAB << "out" << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1735. << ".setOut"
  1736. << "(sync" << firstCharUpper(vOperation[i]->getId()) << "Method.get"
  1737. << firstCharUpper(paramDeclPtr->getTypeIdPtr()->getId())
  1738. << "());" << endl;
  1739. }
  1740. }
  1741. if (!isReturnTypeVoid) {
  1742. s << TAB << "return sync" << firstCharUpper(vOperation[i]->getId())
  1743. << "Method.getRet();" << endl;
  1744. }
  1745. DEL_TAB;
  1746. s << TAB << "}" << endl << endl;
  1747. // sync api end
  1748. }
  1749. DEL_TAB;
  1750. s << TAB << "}" << endl << endl;
  1751. string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.java";
  1752. tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
  1753. tars::TC_File::save2file(fileJava, s.str());
  1754. return s.str();
  1755. }