deployutils.cpp 137 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. // DeployUtils.cpp : Defines the exported functions for the DLL application.
  14. //
  15. #include "deployutils.hpp"
  16. #include "XMLTags.h"
  17. #include "jliball.hpp"
  18. #include "buildset.hpp"
  19. #include "computerpicker.hpp"
  20. #include "configenvhelper.hpp"
  21. #include "configengcallback.hpp"
  22. #include "xslprocessor.hpp"
  23. #include "jwrapper.hpp"
  24. #include "wizardInputs.hpp"
  25. #include "build-config.h"
  26. #define TRACE_SCHEMA_NODE(msg, schemaNode)
  27. #define CONFIGMGR_JSPATH "./"
  28. #define STANDARD_COMPFILESDIR INSTALL_DIR
  29. #define STANDARD_CONFIGXMLDIR COMPONENTFILES_DIR"/configxml"
  30. static bool schemaNodeHasAttributes(IPropertyTree* pNode)
  31. {
  32. //skip over xs:complexType, if any
  33. IPropertyTree* pTemp = pNode->queryPropTree(XSD_TAG_COMPLEX_TYPE);
  34. if (pTemp)
  35. pNode = pTemp;
  36. Owned<IPropertyTreeIterator> itAttr = pNode->getElements(XSD_TAG_ATTRIBUTE);
  37. return itAttr ->first() && itAttr ->isValid();
  38. }
  39. static bool schemaNodeHasAttributeGroups(IPropertyTree* pNode)
  40. {
  41. //skip over xs:complexType, if any
  42. IPropertyTree* pTemp = pNode->queryPropTree(XSD_TAG_COMPLEX_TYPE);
  43. if (pTemp)
  44. pNode = pTemp;
  45. Owned<IPropertyTreeIterator> itAttrGr = pNode->getElements(XSD_TAG_ATTRIBUTE_GROUP);
  46. return itAttrGr->first() && itAttrGr->isValid();
  47. }
  48. bool writeToFile(const char* fileName, StringBuffer sb)
  49. {
  50. StringBuffer jsName(fileName);
  51. recursiveCreateDirectoryForFile(fileName);
  52. Owned<IFile> pFile = createIFile(jsName);
  53. Owned<IFileIO> pFileIO = pFile->open(IFOcreaterw);
  54. pFileIO->write(0, sb.length(), sb.str());
  55. return true;
  56. }
  57. //check if this has any child elements - returns first element
  58. IPropertyTree* schemaNodeHasElements(IPropertyTree* pNode)
  59. {
  60. //skip over xs:complexType, if any
  61. IPropertyTree* pTemp = pNode->queryPropTree(XSD_TAG_COMPLEX_TYPE);
  62. if (pTemp)
  63. pNode = pTemp;
  64. //skip over xs:sequence, if any
  65. pTemp = pNode->queryPropTree(XSD_TAG_SEQUENCE);
  66. if (pTemp)
  67. pNode = pTemp;
  68. else
  69. {
  70. pTemp = pNode->queryPropTree(XSD_TAG_CHOICE);
  71. if (pTemp)
  72. pNode = pTemp;
  73. }
  74. Owned<IPropertyTreeIterator> it = pNode->getElements(XSD_TAG_ELEMENT);
  75. if (it->first() && it->isValid())
  76. pTemp = &it->query();
  77. else
  78. pTemp = NULL;
  79. return pTemp;
  80. }
  81. const char* getRealTabName(const char* tabName)
  82. {
  83. if (!strcmp(tabName, XML_TAG_INSTANCE))
  84. return XML_TAG_INSTANCES;
  85. else if (!strcmp(tabName, XML_TAG_DOMAIN))
  86. return "Domains";
  87. else if (!strcmp(tabName, TAG_COMPUTERTYPE))
  88. return "Type";
  89. else if (!strcmp(tabName, XML_TAG_COMPUTERTYPE))
  90. return "Computer Types";
  91. else if (!strcmp(tabName, XML_TAG_COMPUTER))
  92. return "Computers";
  93. else if (!strcmp(tabName, XML_TAG_SWITCH))
  94. return "Switches";
  95. else
  96. return tabName;
  97. }
  98. //Gets the list of installed components by looking at the directories
  99. void getInstalledComponents(const char* pszInstallDir, StringBuffer& sbOutComps, StringBuffer& sbOutEspServices, StringBuffer& sbOutPlugins, const IPropertyTree* pEnv)
  100. {
  101. StringBuffer sbDir;
  102. sbOutComps.clear();
  103. sbOutEspServices.clear();
  104. sbOutPlugins.clear();
  105. if (pszInstallDir && *pszInstallDir)
  106. sbDir.append(pszInstallDir);
  107. else
  108. sbDir.append(COMPONENTFILES_DIR"/configxml");
  109. bool getFromDirs = false;
  110. if (getFromDirs)
  111. {
  112. Owned<IFile> inFiles = NULL;
  113. try
  114. {
  115. inFiles.setown(createIFile(sbDir.str()));
  116. if(!inFiles->exists())
  117. {
  118. printf("Input directory %s does not exist", sbDir.str());
  119. return;
  120. }
  121. }
  122. catch(IException* e)
  123. {
  124. StringBuffer errmsg;
  125. e->errorMessage(errmsg);
  126. printf("Error when trying to access source directory.Error: %s ", errmsg.str());
  127. e->Release();
  128. return;
  129. }
  130. if(inFiles.get() != NULL && inFiles->isDirectory())
  131. {
  132. Owned<IDirectoryIterator> di = inFiles->directoryFiles(NULL, 0, true);
  133. bool bCompFound = false;
  134. StringBuffer dirName, compName, fileName;
  135. if(di.get())
  136. {
  137. ForEach(*di)
  138. {
  139. IFile &file = di->query();
  140. if (!file.isFile())
  141. {
  142. dirName.clear();
  143. di->getName(dirName);
  144. compName.clear().append(dirName);
  145. Owned<IFile> dirFiles = NULL;
  146. dirName.clear().append(sbDir);
  147. if(dirName.charAt(dirName.length() - 1) != PATHSEPCHAR)
  148. dirName.append(PATHSEPCHAR);
  149. dirName.append(compName);
  150. fileName.clear().append(dirName).append(PATHSEPCHAR).append("deploy_map.xml");
  151. Owned<IFile> depfile(createIFile(fileName));
  152. if(depfile->exists())
  153. {
  154. Owned<IPropertyTree> pInstallSet = createPTreeFromXMLFile(fileName);
  155. const char* szDeployable = pInstallSet->queryProp("@deployable");
  156. const char* szProcessName = pInstallSet->queryProp("@processName");
  157. if (!szDeployable || strcmp(szDeployable, "no"))
  158. {
  159. const char* szOveride = pInstallSet->queryProp("@overide");
  160. if(!szOveride || strcmp(szOveride, "no") !=0 )
  161. {
  162. if (sbOutComps.length())
  163. sbOutComps.append(",");
  164. sbOutComps.append("'").append(compName).append("'");
  165. }
  166. }
  167. else if (!strcmp(szProcessName, XML_TAG_ESPSERVICE))
  168. {
  169. if (sbOutEspServices.length())
  170. sbOutEspServices.append(",");
  171. sbOutEspServices.append("'").append(compName).append("'");
  172. }
  173. else if (!strcmp(szProcessName, XML_TAG_PLUGINPROCESS))
  174. {
  175. if (sbOutPlugins.length())
  176. sbOutPlugins.append(",");
  177. sbOutPlugins.append("'").append(compName).append("'");
  178. }
  179. }
  180. else
  181. {
  182. if (!strcmp(compName.str(), "plugins"))
  183. {
  184. StringBuffer sb;
  185. getInstalledComponents(dirName.str(), sb, sb, sbOutPlugins, pEnv);
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. else
  194. {
  195. Owned<IPropertyTreeIterator> iter = pEnv->getElements("Programs/Build[1]/*");
  196. ForEach(*iter)
  197. {
  198. IPropertyTree* pBuildSet = &iter->query();
  199. const char* szName = pBuildSet->queryProp(XML_ATTR_NAME);
  200. const char* szProcessName = pBuildSet->queryProp(XML_ATTR_PROCESS_NAME);
  201. if (szProcessName && !strcmp(szProcessName, XML_TAG_ESPSERVICE))
  202. {
  203. if (sbOutEspServices.length())
  204. sbOutEspServices.append(",");
  205. sbOutEspServices.append("'").append(szName).append("'");
  206. }
  207. else if (szProcessName && !strcmp(szProcessName, XML_TAG_PLUGINPROCESS))
  208. {
  209. if (sbOutPlugins.length())
  210. sbOutPlugins.append(",");
  211. sbOutPlugins.append("'").append(szName).append("'");
  212. }
  213. else
  214. {
  215. if (!szName && !*szName)
  216. continue;
  217. const char* szOveride = pBuildSet->queryProp("@overide");
  218. if(!szOveride || strcmp(szOveride, "no") !=0 )
  219. {
  220. if (sbOutComps.length())
  221. sbOutComps.append(",");
  222. sbOutComps.append("'").append(szName).append("'");
  223. }
  224. }
  225. }
  226. }
  227. }
  228. void LoadComboBox(const char* szPath, bool bAddBlank, const IPropertyTree* pNode, const IPropertyTree* pParentNode, StringBuffer& sbComboBox, bool appendParentName = false, bool addDeclStart = true, bool addDeclEnd = true)
  229. {
  230. if (addDeclStart)
  231. sbComboBox.append("new Array(");
  232. if (bAddBlank)
  233. sbComboBox.append("''");
  234. const char* buildSet = NULL;
  235. if (!strncmp(szPath, "$process", 8))
  236. {
  237. szPath += strlen("$process");
  238. if (*szPath == '\0')
  239. {
  240. const char* szName = pNode->queryProp(XML_ATTR_NAME);
  241. if (szName && *szName)
  242. {
  243. if (bAddBlank)
  244. sbComboBox.append(",");
  245. sbComboBox.appendf("'%s'", szName);
  246. }
  247. return;
  248. }
  249. szPath++; //skip over '/'
  250. }
  251. else
  252. {
  253. if (pParentNode && !strcmp(szPath, "Programs/Build"))
  254. buildSet = pParentNode->queryProp(XML_ATTR_BUILDSET);
  255. }
  256. Owned<IPropertyTreeIterator> iter = pNode->getElements(szPath);
  257. ForEach(*iter)
  258. {
  259. IPropertyTree* pChildNode = &iter->query();
  260. const char* szName = pChildNode->queryProp(XML_ATTR_NAME);
  261. if (szName)
  262. {
  263. bool bAdd;
  264. if (buildSet)
  265. {
  266. StringBuffer xpath;
  267. xpath.appendf("BuildSet[@name='%s']", buildSet);
  268. bAdd = pChildNode->queryPropTree(xpath.str()) != NULL;
  269. }
  270. else
  271. bAdd = true;
  272. if (bAdd)
  273. {
  274. if (sbComboBox.length() > 10)
  275. sbComboBox.append(",");
  276. if (!appendParentName)
  277. sbComboBox.appendf("'%s'", szName);
  278. else
  279. sbComboBox.appendf("'%s/%s'", pParentNode->queryProp(XML_ATTR_NAME), szName);
  280. }
  281. }
  282. }
  283. if (addDeclEnd)
  284. sbComboBox.append(")");
  285. }
  286. void addItem(StringBuffer& jsStrBuf,
  287. const IPropertyTree* pEnv,
  288. const char* tabName,
  289. const char* attrName,
  290. const char* tip,
  291. bool hidden,
  292. bool required,
  293. const char* extra,
  294. short ctrlType)
  295. {
  296. StringBuffer sbAttr("Attributes");
  297. jsStrBuf.appendf("var attr%s%s = {};", attrName, tabName);
  298. jsStrBuf.appendf("attr%s%s.tab = '%s';", attrName, tabName, *tabName ? getRealTabName(tabName): sbAttr.str());
  299. jsStrBuf.appendf("attr%s%s.tip = '%s';", attrName, tabName, tip);
  300. jsStrBuf.appendf("attr%s%s.hidden = %d;", attrName, tabName, hidden);
  301. jsStrBuf.appendf("attr%s%s.required = 1;", attrName, tabName);
  302. jsStrBuf.appendf("attr%s%s.ctrlType = %d;", attrName, tabName, ctrlType);
  303. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", attrName, tabName, attrName, tabName);
  304. StringBuffer sb;
  305. if (ctrlType == 4)
  306. {
  307. if (extra[0] != '|')
  308. LoadComboBox(extra, false, pEnv, pEnv, sb);
  309. else
  310. sb.append(++extra);
  311. jsStrBuf.appendf("attr%s%s.extra = %s;", attrName, tabName, sb.str());
  312. }
  313. }
  314. void addTopologyType(StringBuffer& jsStrBuf, const IPropertyTree* pEnv, const char* tabName, const char* attrName, const char* tip, bool hidden, bool required, const char* extra, short ctrlType)
  315. {
  316. jsStrBuf.appendf("var attr%s%s = {};", attrName, tabName);
  317. jsStrBuf.appendf("attr%s%s.tab = '%s';", attrName, tabName, "Topology");
  318. jsStrBuf.appendf("attr%s%s.tip = '%s';", attrName, tabName, tip);
  319. jsStrBuf.appendf("attr%s%s.hidden = %d;", attrName, tabName, hidden);
  320. jsStrBuf.appendf("attr%s%s.required = 1;", attrName, tabName);
  321. jsStrBuf.appendf("attr%s%s.ctrlType = %d;", attrName, tabName, ctrlType);
  322. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", attrName, tabName, attrName, tabName);
  323. StringBuffer sb;
  324. if (!strcmp(attrName, TAG_BUILD))
  325. {
  326. sb.append("new Array(");
  327. Owned<IPropertyTreeIterator> iBuild = pEnv->getElements("Programs/Build[@name]");
  328. ForEach (*iBuild)
  329. {
  330. IPropertyTree* pBuild = &iBuild->query();
  331. if (pBuild->queryPropTree("BuildSet[@name='topology']"))
  332. {
  333. const char* szName = pBuild->queryProp(XML_ATTR_NAME);
  334. if (szName && *szName)
  335. {
  336. if (sb.length() > 10)
  337. sb.append(",");
  338. sb.appendf("'%s'", szName);
  339. }
  340. }
  341. }
  342. sb.append(")");
  343. jsStrBuf.appendf("attr%s%s.extra = %s;", attrName, tabName, sb.str());
  344. }
  345. else if (ctrlType == 4)
  346. {
  347. if (extra[0] != '|')
  348. LoadComboBox(extra, false, pEnv, pEnv, sb);
  349. else
  350. sb.append(++extra);
  351. jsStrBuf.appendf("attr%s%s.extra = %s;", attrName, tabName, sb.str());
  352. }
  353. }
  354. const char* GetDisplayProcessName(const char* processName, char* buf)
  355. {
  356. //produces "LDAPServerProcess" as "LDAP Server" and "EspService" as "Esp Service", etc.
  357. const char* begin = buf;
  358. const char* end = strstr(processName, "Process");
  359. if (!end)
  360. end = processName + strlen(processName);
  361. *buf++ = *processName++;
  362. bool bLower = false;
  363. while (processName < end)
  364. {
  365. char ch = *processName;
  366. if (isupper(ch))
  367. {
  368. if (bLower || //last char was uppercase or the following character is lowercase?
  369. ((processName+1 < end) && islower(*(processName+1))))
  370. {
  371. *buf++ = ' ';
  372. }
  373. bLower = false;
  374. }
  375. else
  376. bLower = true;
  377. *buf++ = *processName++;
  378. }
  379. *buf = '\0';
  380. return begin;
  381. }
  382. void GetDisplayName(IPropertyTree* pNode, StringBuffer& sb, bool bAppendProcessName)
  383. {
  384. // Get the display name for the node
  385. // Use szBuf because CString was too slow when loading a large tree
  386. static char szBuf[128];
  387. size32_t cnt = sizeof(szBuf);
  388. GetDisplayProcessName(pNode->queryName(), szBuf);
  389. const char* szName = pNode->queryProp(XML_ATTR_NAME);
  390. if (!szName || !*szName)
  391. szName = pNode->queryProp(XML_ATTR_PROCESS);
  392. if (bAppendProcessName)
  393. {
  394. if (szName && *szName)
  395. {
  396. cnt -= strlen(szName);
  397. strncat(szBuf, " - ", cnt);
  398. strncat(szBuf, szName, cnt - 3);
  399. }
  400. sb.clear().append(szBuf);
  401. }
  402. else
  403. sb.clear().append(szName);
  404. }
  405. class CGenerateJSFromXSD
  406. {
  407. public:
  408. CGenerateJSFromXSD(const IPropertyTree* pEnv, const char* xsdName, const char* jsName):
  409. m_xsdName(xsdName), m_jsName(jsName), m_pCompTree(NULL), m_pSchemaRoot(NULL),m_pDefTree(NULL),m_numAttrs(0),m_allSubTypes(true),m_genOptional(true)
  410. {
  411. m_pEnv.set(pEnv);
  412. m_colIndex.append("var colIndex = new Array();");
  413. m_columns.append("var tabCols = new Array();");
  414. }
  415. CGenerateJSFromXSD(const IPropertyTree* pEnv, IPropertyTree* pSchemaRoot, const char* jsName, const char* compName):
  416. m_pSchemaRoot(pSchemaRoot), m_jsName(jsName), m_compName(compName),m_pCompTree(NULL), m_pDefTree(NULL),m_numAttrs(0),m_allSubTypes(true),m_wizFlag(false),m_wizard(NULL),m_genOptional(true)
  417. {
  418. m_pEnv.set(pEnv);
  419. m_colIndex.append("var colIndex = new Array();");
  420. m_columns.append("var tabCols = new Array();");
  421. }
  422. void setNameInCompTabArray(const char* tabName, const char* nodeName)
  423. {
  424. if (m_tabNameArray.find(tabName) == NotFound)
  425. {
  426. m_tabNameArray.append(tabName);
  427. m_jsStrBuf.appendf("compTabs['%s'][compTabs['%s'].length]= '%s';", m_compName.str(), m_compName.str(), tabName);
  428. if (nodeName && *nodeName)
  429. m_jsStrBuf.appendf("compTabToNode['%s'] = '%s';", tabName, nodeName);
  430. m_columns.appendf("tabCols['%s'] = new Array();", tabName);
  431. }
  432. }
  433. void setNameInHiddenTabArray(const char* tabName)
  434. {
  435. if (m_hiddenTabNameArray.find(tabName) == NotFound)
  436. {
  437. m_hiddenTabNameArray.append(tabName);
  438. m_jsStrBuf.appendf("hiddenTabs['%s'][hiddenTabs['%s'].length]= '%s';", m_compName.str(), m_compName.str(), tabName);
  439. }
  440. }
  441. void addRoxieMisc(StringBuffer& jsStrBuf)
  442. {
  443. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_SERVER, TAG_COMPUTER, "", 0, 1, "", 0);
  444. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_SERVER, TAG_PROCESS, "", 0, 1, "", 0);
  445. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_NAME, "", 0, 1, "", 0);
  446. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_PROCESS, "", 0, 1, "", 0);
  447. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_LISTENQUEUE, "", 0, 1, "", 1);
  448. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_NUMTHREADS, "", 0, 1, "", 1);
  449. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_PORT, "", 0, 1, "", 1);
  450. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, TAG_REQARRAYTHREADS, "", 0, 1, "", 1);
  451. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_FARM, "aclName", "", 0, 1, "|'#$process/ACL'", 4);
  452. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_ONLY_SLAVE, TAG_NAME, "", 0, 1, "", 0);
  453. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_ONLY_SLAVE, TAG_COMPUTER, "", 0, 1, "", 0);
  454. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_ONLY_SLAVE, TAG_NETADDRESS, "", 0, 1, "", 0);
  455. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_ONLY_SLAVE, TAG_ITEMTYPE, "", 0, 1, "", 0);
  456. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_NAME, "", 0, 1, "", 0);
  457. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_ITEMTYPE, "", 0, 1, "", 0);
  458. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_COMPUTER, "", 0, 1, "", 0);
  459. addItem(jsStrBuf, m_pEnv.get(), XML_TAG_ROXIE_CHANNEL, TAG_NUMBER, "", 0, 1, "", 0);
  460. }
  461. void addMisc()
  462. {
  463. if (!strcmp(m_compName.str(), "RoxieCluster"))
  464. {
  465. addRoxieMisc(m_jsStrBuf);
  466. const char* serverStr = "Servers";
  467. short index = 0;
  468. m_colIndex.appendf("colIndex['computer%s']=%d;", serverStr, index++);
  469. m_colIndex.appendf("colIndex['process%s']=%d;", serverStr, index++);
  470. m_colIndex.appendf("colIndex['netAddress%s']=%d;", serverStr, index++);
  471. m_colIndex.appendf("colIndex['port%s']=%d;", serverStr, index++);
  472. m_colIndex.appendf("colIndex['listenQueue%s']=%d;", serverStr, index++);
  473. m_colIndex.appendf("colIndex['numThreads%s']=%d;", serverStr, index++);
  474. m_colIndex.appendf("colIndex['requestArrayThreads%s']=%d;", serverStr, index++);
  475. m_colIndex.appendf("colIndex['aclName%s']=%d;", serverStr, index++);
  476. index = 0;
  477. const char* agentStr = "Agents";
  478. m_colIndex.appendf("colIndex['computer%s']=%d;", agentStr, index++);
  479. m_colIndex.appendf("colIndex['netAddress%s']=%d;", agentStr, index++);
  480. }
  481. else if (!strcmp(m_compName.str(), XML_TAG_THORCLUSTER))
  482. {
  483. short index = 0;
  484. m_jsStrBuf.append("compTabs['ThorCluster'][compTabs['ThorCluster'].length]= 'Topology';");
  485. m_colIndex.appendf("colIndex['nameTopology']=%d;", index++);
  486. m_colIndex.appendf("colIndex['processTopology']=%d;", index++);
  487. m_colIndex.appendf("colIndex['netAddressTopology']=%d;", index++);
  488. m_jsStrBuf.append("compTabToNode['Topology']= 'Topology';");
  489. }
  490. }
  491. void CreateAttributeFromSchema(IPropertyTree& attr, StringBuffer compName, const char* tabName, const char* childElementName)
  492. {
  493. StringBuffer attrname;
  494. StringBuffer combovalues;
  495. StringBuffer strBuf;
  496. StringBuffer aName;
  497. StringBuffer value, tempPath, wizDefVal;
  498. attrname.append(attr.queryProp(XML_ATTR_NAME));
  499. const char *use = attr.queryProp("@use");
  500. if (!m_genOptional && use && *use && !strcmp(use, "optional"))
  501. {
  502. if(childElementName)
  503. {
  504. StringBuffer xpath;
  505. xpath.clear().append(childElementName);
  506. IPropertyTree* pChild = m_pCompTree->queryPropTree(xpath.str());
  507. if(!pChild)
  508. pChild = m_pCompTree->addPropTree(childElementName, createPTree());
  509. }
  510. return;
  511. }
  512. if(m_wizFlag)
  513. {
  514. if(attr.hasProp("./xs:annotation/xs:appinfo/autogenforwizard"))
  515. {
  516. value.clear().append(attr.queryProp("./xs:annotation/xs:appinfo/autogenforwizard"));
  517. if(!strcmp(value.str(),"1"))
  518. {
  519. getValueForTypeInXSD(attr, compName, wizDefVal);
  520. }
  521. }
  522. else
  523. return ;
  524. }
  525. if (childElementName)
  526. attrname.append(childElementName);
  527. aName.appendf("a%d", m_numAttrs++);
  528. m_jsStrBuf.appendf("var %s = {};", aName.str());
  529. m_jsStrBuf.appendf("%s.tab = '%s';", aName.str(), getRealTabName(tabName));
  530. setNameInCompTabArray(getRealTabName(tabName), childElementName);
  531. IPropertyTree* pField = NULL;
  532. if (m_pDefTree)
  533. {
  534. IPropertyTree* pProcess = m_pDefTree->queryPropTree(compName.str());
  535. if (!pProcess)
  536. pProcess = m_pDefTree->addPropTree(compName, createPTree());
  537. IPropertyTree* pTab = m_pDefTree->queryPropTree(getRealTabName(tabName));
  538. if (!pTab)
  539. pTab = pProcess->addPropTree(getRealTabName(tabName), createPTree());
  540. pField = pTab->addPropTree("Field", createPTree());
  541. }
  542. const char *defaultValue = attr.queryProp("@default");
  543. StringBuffer sbdefaultValue;
  544. if (defaultValue)
  545. {
  546. sbdefaultValue.clear().append(defaultValue);
  547. sbdefaultValue.replaceString("\\", "\\\\");
  548. m_jsStrBuf.appendf("%s.defaultValue = '%s';", aName.str(), sbdefaultValue.str());
  549. if (pField)
  550. pField->addProp(UI_FIELD_ATTR_DEFAULTVALUE, sbdefaultValue.str());
  551. }
  552. if(wizDefVal.length() > 0)
  553. {
  554. sbdefaultValue.clear().append(wizDefVal);
  555. if (pField)
  556. pField->addProp(UI_FIELD_ATTR_DEFAULTVALUE, sbdefaultValue.str());
  557. }
  558. if (m_pCompTree)
  559. {
  560. StringBuffer xpath;
  561. if(!childElementName)
  562. {
  563. xpath.clear().append("@").append(attrname);
  564. m_pCompTree->addProp(xpath, sbdefaultValue.str());
  565. }
  566. else
  567. {
  568. xpath.clear().append(childElementName);
  569. IPropertyTree* pChild = m_pCompTree->queryPropTree(xpath.str());
  570. if(!pChild)
  571. pChild = m_pCompTree->addPropTree(childElementName, createPTree());
  572. xpath.clear().append("@").append(attr.queryProp(XML_ATTR_NAME));
  573. pChild->addProp(xpath, sbdefaultValue.str());
  574. }
  575. }
  576. IPropertyTree* pAppInfo = attr.queryPropTree("xs:annotation/xs:appinfo");
  577. const char *viewtype;
  578. const char *displayMode = NULL;
  579. if (pAppInfo)
  580. {
  581. const char* caption = pAppInfo->queryProp("title");
  582. if (caption)
  583. m_jsStrBuf.appendf("%s.caption = '%s';", aName.str(), caption);
  584. const char* tip = pAppInfo->queryProp("tooltip");
  585. if (tip)
  586. {
  587. StringBuffer sbtip(tip);
  588. sbtip.replaceString("\"", "\\\"");
  589. sbtip.replaceString("\'", "\\\'");
  590. m_jsStrBuf.appendf("%s.tip = '%s';", aName.str(), sbtip.str());
  591. }
  592. m_jsStrBuf.appendf("%s.width = %d;", aName.str(), pAppInfo->getPropInt("width", 90));
  593. viewtype = pAppInfo->queryProp("viewType");
  594. m_jsStrBuf.appendf("%s.hidden = %d;", aName.str(), viewtype && !strcmp(viewtype, "hidden"));
  595. displayMode = pAppInfo->queryProp("displayMode");
  596. m_jsStrBuf.appendf("%s.displayMode = %d;", aName.str(), displayMode && !strcmp(displayMode, "simple"));
  597. const char* colIndex = pAppInfo->queryProp("colIndex");
  598. if (colIndex && *colIndex)
  599. {
  600. int i = atoi(colIndex);
  601. m_colIndex.appendf("colIndex['%s%s'] = %d;", attr.queryProp(XML_ATTR_NAME),getRealTabName(tabName), i - 1);
  602. if (!viewtype || (viewtype && strcmp(viewtype, "hidden")))
  603. {
  604. m_columns.appendf("tabCols['%s'][%d] = '%s';", getRealTabName(tabName), i - 1, caption? caption:attr.queryProp(XML_ATTR_NAME));
  605. if (childElementName && i == 1 && m_splitterTabName.length())
  606. {
  607. setNameInCompTabArray(m_splitterTabName, compName.str());
  608. m_columns.appendf("tabCols['%s'][%d] = '_%s';", m_splitterTabName.str(), m_numAttrs, tabName);
  609. }
  610. }
  611. }
  612. else if (childElementName && m_splitterTabName.length())
  613. {
  614. m_colIndex.appendf("colIndex['%s%s'] = %d;", attr.queryProp(XML_ATTR_NAME),getRealTabName(tabName), 0);
  615. if (!viewtype || (viewtype && strcmp(viewtype, "hidden")))
  616. {
  617. m_columns.appendf("tabCols['%s'][%d] = '%s';", getRealTabName(tabName), 0, caption? caption:attr.queryProp(XML_ATTR_NAME));
  618. setNameInCompTabArray(m_splitterTabName, compName.str());
  619. m_columns.appendf("tabCols['%s'][%d] = '_%s';", m_splitterTabName.str(), m_numAttrs, tabName);
  620. }
  621. }
  622. IPropertyTree* onChangeNode = pAppInfo->queryPropTree("onchange");
  623. if (onChangeNode)
  624. {
  625. const char* msg = onChangeNode->queryProp("message");
  626. if (msg && *msg)
  627. {
  628. StringBuffer sbmsg(msg);
  629. sbmsg.replace('\n',' ');
  630. sbmsg.replaceString(" ", " ");
  631. m_jsStrBuf.appendf("%s.onChange = 1;", aName.str());
  632. m_jsStrBuf.appendf("%s.onChangeMsg = '%s';", aName.str(), sbmsg.str());
  633. }
  634. const char* onChangeXslt = onChangeNode->queryProp("xslt");
  635. if (onChangeXslt)
  636. m_jsStrBuf.appendf("%s.onChange = 2;", aName.str());
  637. }
  638. else
  639. m_jsStrBuf.appendf("%s.onChange = %d;", aName.str(), onChangeNode != NULL);
  640. }
  641. else
  642. {
  643. viewtype = NULL;
  644. }
  645. StringBuffer xpath(m_xpathDefn);
  646. xpath.appendf("[@%s]", attr.queryProp(XML_ATTR_NAME));
  647. if (viewtype)
  648. {
  649. if (pField)
  650. {
  651. pField->addProp(attr.queryProp(XML_ATTR_NAME), m_pEnv->queryProp(xpath.str()));
  652. }
  653. }
  654. else
  655. {
  656. if (pField)
  657. {
  658. pField->addProp(UI_FIELD_ATTR_NAME, attr.queryProp(XML_ATTR_NAME));
  659. pField->addProp(UI_FIELD_ATTR_NAME"Type", "0");
  660. pField->addProp(UI_FIELD_ATTR_VALUE, m_pEnv->queryProp(xpath.str()));
  661. }
  662. }
  663. m_jsStrBuf.appendf("%s.required = %d;", aName.str(), (use && strcmp(use, "required")==0) || (pAppInfo && pAppInfo->getPropBool("required")));
  664. m_jsStrBuf.appendf("%s.loadRoot = %d;", aName.str(),1);
  665. const char *type = attr.queryProp("@type");
  666. const char *extraInfo = NULL;
  667. bool bAddBlank = false;
  668. StringBuffer typeNameSpace;
  669. StringBuffer typeName;
  670. int nCtrlType = 1;//LVC_EDIT;
  671. if (viewtype && !strcmp(viewtype, "readonly"))
  672. nCtrlType = 0;//LVC_NONE;
  673. else if (viewtype && !strcmp(viewtype, TAG_PASSWORD))
  674. nCtrlType = 5;//LVC_EDITPASSWORD;
  675. else if (type)
  676. {
  677. while (*type && *type!=':')
  678. typeNameSpace.append(*type++);
  679. if (*type)
  680. {
  681. type++;
  682. while (*type)
  683. typeName.append(*type++);
  684. }
  685. else
  686. {
  687. typeName.append(typeNameSpace);
  688. typeNameSpace.clear();
  689. }
  690. type = typeName.str();
  691. if (strcmp(typeNameSpace.str(),"xs")==0)
  692. {
  693. if (strcmp(type, "string")==0)
  694. nCtrlType = 1;//LVC_EDIT;
  695. else if (strcmp(type, "boolean")==0)
  696. {
  697. nCtrlType = 4;//ret->m_bRequired ? LVC_TRUEFALSE : LVC_TRUEFALSE2;
  698. strBuf.clear().append("new Array('false','true');");
  699. extraInfo = strBuf.str();
  700. }
  701. }
  702. else if (strcmp(typeNameSpace.str(),"seisint")==0 || typeNameSpace.length()==0)
  703. {
  704. bAddBlank = !((use && strcmp(use, "required")==0) || (pAppInfo && pAppInfo->getPropBool("required")));
  705. if (strcmp(type, "commonDirsCompType")==0)
  706. {
  707. nCtrlType = 4;//LVC_COMBO;
  708. StringBuffer compList, espServiceList, pluginsList;
  709. getInstalledComponents(NULL, compList, espServiceList, pluginsList, m_pEnv.get());
  710. strBuf.clear().append("new Array(").append(compList).append(");");
  711. extraInfo = strBuf.str();
  712. }
  713. else if (strcmp(type, "commonDirsInstType")==0)
  714. {
  715. nCtrlType = 4;//LVC_COMBO;
  716. strBuf.clear().append("new Array('');");
  717. extraInfo = strBuf.str();
  718. }
  719. else if (strcmp(type, "daliServersType")==0)
  720. {
  721. nCtrlType = 4;//LVC_COMBO;
  722. LoadComboBox("Software/DaliServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  723. extraInfo = strBuf.str();
  724. }
  725. else if (strcmp(type, "dataBuildType")==0)
  726. {
  727. nCtrlType = 4;//LVC_COMBO;
  728. LoadComboBox("Data/Build", bAddBlank, m_pEnv, m_pEnv, strBuf);
  729. extraInfo = strBuf.str();
  730. }
  731. else if (strcmp(type, "dataModelType")==0)
  732. {
  733. nCtrlType = 4;//LVC_COMBO;
  734. LoadComboBox("Data/Model", bAddBlank, m_pEnv, m_pEnv, strBuf);
  735. extraInfo = strBuf.str();
  736. }
  737. else if (strcmp(type, "dataThorTableType")==0)
  738. {
  739. nCtrlType = 4;//LVC_COMBO;
  740. LoadComboBox("Data/$model/ThorTable", bAddBlank, m_pEnv, m_pEnv, strBuf);
  741. extraInfo = strBuf.str();
  742. }
  743. else if (strcmp(type, "dataTableType")==0)
  744. {
  745. nCtrlType = 4;//LVC_COMBO;
  746. LoadComboBox("Data/$parentmodel/*", bAddBlank, m_pEnv, m_pEnv, strBuf);
  747. extraInfo = strBuf.str();
  748. }
  749. else if (strcmp(type, "sybaseType")==0)
  750. {
  751. nCtrlType = 4;//LVC_COMBO;
  752. bAddBlank = true;
  753. LoadComboBox("Software/SybaseProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  754. extraInfo = strBuf.str();
  755. //ret->m_bAddEmpty = true;
  756. }
  757. else if (strcmp(type, "mysqlType")==0)
  758. {
  759. nCtrlType = 4;//LVC_COMBO;
  760. bAddBlank = true;
  761. LoadComboBox("Software/MySQLProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  762. extraInfo = strBuf.str();
  763. //ret->m_bAddEmpty = true;
  764. }
  765. else if (strcmp(type, "ldapServerType")==0)
  766. {
  767. nCtrlType = 4;//LVC_COMBO;
  768. LoadComboBox("Software/LDAPServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  769. extraInfo = strBuf.str();
  770. }
  771. else if (strcmp(type, "sashaServerType")==0)
  772. {
  773. nCtrlType = 4;//LVC_COMBO;
  774. LoadComboBox("Software/SashaServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  775. extraInfo = strBuf.str();
  776. }
  777. else if (strcmp(type, "accurintServerType")==0)
  778. {
  779. nCtrlType = 4;//LVC_COMBO;
  780. LoadComboBox("Software/AccurintServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  781. extraInfo = strBuf.str();
  782. }
  783. else if (strcmp(type, "buildSetType")==0)
  784. {
  785. nCtrlType = 4;//LVC_COMBO;
  786. extraInfo = "Programs/Build[@name=$build]/BuildSet";
  787. }
  788. else if (strcmp(type, "buildType")==0)
  789. {
  790. nCtrlType = 4;//LVC_COMBO;
  791. LoadComboBox("Programs/Build", bAddBlank, m_pEnv, m_pEnv, strBuf);
  792. extraInfo = strBuf.str();//"Programs/Build";
  793. }
  794. else if (strcmp(type, TAG_COMPUTERTYPE)==0)
  795. {
  796. nCtrlType = 4;//LVC_COMBO;
  797. LoadComboBox("Hardware/Computer", bAddBlank, m_pEnv, m_pEnv, strBuf);
  798. extraInfo = strBuf.str();
  799. }
  800. else if (strcmp(type, "dataBuildType")==0)
  801. {
  802. nCtrlType = 4;//LVC_COMBO;
  803. LoadComboBox("Data/Build", bAddBlank, m_pEnv, m_pEnv, strBuf);
  804. extraInfo = strBuf.str();
  805. }
  806. else if (strcmp(type, "dataModelType")==0)
  807. {
  808. nCtrlType = 4;//LVC_COMBO;
  809. LoadComboBox("Data/Model", bAddBlank, m_pEnv, m_pEnv, strBuf);
  810. extraInfo = strBuf.str();
  811. }
  812. else if (strcmp(type, "espServiceType")==0)
  813. {
  814. nCtrlType = 4;//LVC_COMBO;
  815. LoadComboBox("Software/EspService", bAddBlank, m_pEnv, m_pEnv, strBuf);
  816. extraInfo = strBuf.str();
  817. }
  818. else if (strcmp(type, "espProcessType")==0)
  819. {
  820. nCtrlType = 4;//LVC_COMBO;
  821. LoadComboBox("Software/EspProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  822. extraInfo = strBuf.str();
  823. }
  824. else if (strcmp(type, "roxieClusterType")==0)
  825. {
  826. nCtrlType = 4;//LVC_COMBO;
  827. LoadComboBox("Software/RoxieCluster", bAddBlank, m_pEnv, m_pEnv, strBuf);
  828. extraInfo = strBuf.str();
  829. }
  830. else if (strcmp(type, "eclServerType")==0)
  831. {
  832. // MORE - attribute servers would be ok here too
  833. nCtrlType = 4;//LVC_COMBO;
  834. LoadComboBox("Software/EclServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  835. extraInfo = strBuf.str();
  836. }
  837. else if (strcmp(type, "eclCCServerType")==0)
  838. {
  839. nCtrlType = 4;//LVC_COMBO;
  840. LoadComboBox("Software/EclCCServerProcess", bAddBlank, m_pEnv, m_pEnv, strBuf);
  841. extraInfo = strBuf.str();
  842. }
  843. else if (strcmp(type, "wsLogListenerType")==0)
  844. {
  845. nCtrlType = 4;//LVC_COMBO;
  846. LoadComboBox("Software/WsLogListener", bAddBlank, m_pEnv, m_pEnv, strBuf);
  847. extraInfo = strBuf.str();
  848. }
  849. else if (strcmp(type, "processType")==0)
  850. {
  851. nCtrlType = 4;//LVC_COMBO;
  852. LoadComboBox(pAppInfo->queryProp(TAG_NAME), bAddBlank, m_pEnv, m_pEnv, strBuf);
  853. extraInfo = strBuf.str();
  854. }
  855. else if (strcmp(type, "topologyClusterType")==0)
  856. {
  857. nCtrlType = 4;//LVC_COMBO;
  858. LoadComboBox("Software/Topology/Cluster", bAddBlank, m_pEnv, m_pEnv, strBuf);
  859. extraInfo = strBuf.str();
  860. }
  861. else if (strcmp(type, "xpathType")==0)
  862. {
  863. const char* xpath1 = pAppInfo->queryProp("xpath");
  864. const char* xpath2;
  865. if (xpath1 && *xpath1)
  866. {
  867. nCtrlType = 4;//LVC_COMBO;
  868. const char* prefix = "/Environment/";
  869. const int len = strlen(prefix);
  870. if (!strncmp(xpath1, prefix, len)) //xpath is absolute
  871. xpath2 = xpath1 + len; //IPropertyTree root does not take absolute paths
  872. else
  873. xpath2 = xpath1;
  874. if (!strstr(xpath2, "$"))
  875. LoadComboBox(xpath2, bAddBlank, m_pEnv, m_pEnv, strBuf);
  876. else
  877. strBuf.append("#").append(xpath2);
  878. extraInfo = strBuf.str();
  879. }
  880. }
  881. else if (strcmp(type, "espBindingType")==0)
  882. {
  883. nCtrlType = 4;//LVC_COMBO;
  884. m_jsStrBuf.appendf("%s.custom = %d;", aName.str(), 1);
  885. const char* serviceType = NULL;
  886. if (pAppInfo)
  887. {
  888. serviceType = pAppInfo->queryProp("serviceType");
  889. if (serviceType)
  890. xpath.clear().append("Software/EspService");
  891. }
  892. else
  893. xpath.clear().appendf("Software/*[@buildSet='%s']", type);
  894. strBuf.clear();
  895. Owned<IPropertyTreeIterator> iterEspServices = m_pEnv->getElements(xpath);
  896. short blank = 0;
  897. ForEach (*iterEspServices)
  898. {
  899. IPropertyTree* pEspService = &iterEspServices->query();
  900. if (serviceType)
  901. {
  902. xpath.clear().appendf("Properties[@type='%s']", serviceType);
  903. if (pEspService->queryPropTree(xpath.str()) == NULL)
  904. continue;
  905. }
  906. Owned<IPropertyTreeIterator> iter = m_pEnv->getElements("Software/EspProcess");
  907. ForEach (*iter)
  908. {
  909. IPropertyTree* pEspProcess = &iter->query();
  910. xpath.clear().appendf("EspBinding[@service='%s']", pEspService->queryProp(XML_ATTR_NAME));
  911. if (pEspProcess->queryPropTree(xpath.str()) != NULL)
  912. LoadComboBox(xpath.str(), (blank == 0), pEspProcess, pEspProcess, strBuf, true, (blank == 0), false);
  913. blank++;
  914. }
  915. }
  916. strBuf.append(")");
  917. extraInfo = strBuf.str();
  918. }
  919. else if (strcmp(type, "AutoTimeStampType")==0 ||
  920. strcmp(type, "AutoComputerType")==0 ||
  921. strcmp(type, "AutoUseridType")==0)
  922. {
  923. if (nCtrlType != 0/*LVC_NONE*/)//is not read only
  924. nCtrlType = 1;//LVC_EDIT;
  925. m_jsStrBuf.appendf("%s.custom = %d;", aName.str(), 1);
  926. m_jsStrBuf.appendf("%s.extra = '%s';", aName.str(), type);
  927. }
  928. else if (strcmp(type, "absolutePath")==0 || strcmp(type, "relativePath")==0)
  929. {
  930. nCtrlType = 1;//LVC_EDIT;
  931. extraInfo = type;
  932. }
  933. else if (strcmp(type, "YesNo")==0)
  934. {
  935. nCtrlType = 4;//ret->m_bRequired ? LVC_YESNO : LVC_YESNO_OPTIONAL;
  936. strBuf.clear().append("new Array('No','Yes');");
  937. extraInfo = strBuf.str();
  938. }
  939. }
  940. else if (strcmp(typeNameSpace.str(),TAG_PROCESS)==0) //for backwards compatibility only - use xpathType instead
  941. {
  942. nCtrlType = 4;//LVC_COMBO;
  943. m_jsStrBuf.appendf("%s.extra = '%s%s';", aName.str(), "Software/", typeName.str());
  944. }
  945. // MORE - type could be a reference to a simpletype defined elsewhere....
  946. }
  947. else if (attr.hasProp("xs:simpleType/xs:restriction/xs:enumeration"))
  948. {
  949. Owned<IPropertyTreeIterator> values = attr.getElements("xs:simpleType/xs:restriction/xs:enumeration");
  950. combovalues.append("new Array(");
  951. ForEach(*values)
  952. {
  953. IPropertyTree &value = values->query();
  954. if (combovalues.length() > 10)
  955. combovalues.append(",");
  956. combovalues.append("'").append(value.queryProp("@value")).append("'");
  957. }
  958. combovalues.append(")");
  959. nCtrlType = 4;//LVC_COMBO;
  960. extraInfo = combovalues.str();
  961. }
  962. if (extraInfo)
  963. {
  964. if (!strncmp(extraInfo, "new Array", 9))
  965. {
  966. m_jsStrBuf.appendf("%s.extra = %s;", aName.str(), extraInfo);
  967. if (pField)
  968. {
  969. //["Alabama","Alaska","Arizona","Arkansas"]
  970. StringBuffer sb(extraInfo);
  971. sb.replaceString("new Array(", "[");
  972. sb.replaceString(");", "]");
  973. StringBuffer sbAttr("@");
  974. sbAttr.append(attr.queryProp(XML_ATTR_NAME));
  975. if (viewtype)
  976. pField->addProp(sbAttr.append("_extraInfo"), sb.str());
  977. else
  978. pField->addProp(UI_FIELD_ATTR_VALUE"_extra", sb.str());
  979. }
  980. }
  981. else
  982. m_jsStrBuf.appendf("%s.extra = '%s';", aName.str(), extraInfo);
  983. }
  984. m_jsStrBuf.appendf("%s.ctrlType = %d;", aName.str(), nCtrlType);
  985. m_jsStrBuf.appendf("cS['%s']=%s;", attrname.str(), aName.str());
  986. }
  987. void AddAttributeFromSchema(IPropertyTree& schemaNode,
  988. StringBuffer elemName,
  989. StringBuffer& compName,
  990. const char* tabName,
  991. const char* childElementName)
  992. {
  993. CreateAttributeFromSchema(schemaNode, compName, tabName, childElementName);
  994. }
  995. void AddAttributesFromSchema(IPropertyTree* pSchema,
  996. StringBuffer& compName,
  997. const char* tabName,
  998. const char* childElementName)
  999. {
  1000. if (pSchema)
  1001. {
  1002. //add attributes defined for this element
  1003. Owned<IPropertyTreeIterator> attrIter = pSchema->getElements("xs:complexType/xs:attribute");
  1004. ForEach(*attrIter)
  1005. {
  1006. AddAttributeFromSchema(attrIter->query(), "", compName, tabName, childElementName);
  1007. }
  1008. if (childElementName && !strcmp(childElementName, XML_TAG_INSTANCE))
  1009. {
  1010. const char* pszNameAttr = "<xs:attribute name='name' type='xs:string' use='optional'><xs:annotation><xs:appinfo><viewType>hidden</viewType></xs:appinfo></xs:annotation></xs:attribute>";
  1011. Owned<IPropertyTree> pSchemaAttrNode = createPTreeFromXMLString(pszNameAttr);
  1012. AddAttributeFromSchema(*pSchemaAttrNode, "", compName, tabName, childElementName);
  1013. }
  1014. // or if it's an attribute group, then try this variety...
  1015. attrIter.setown(pSchema->getElements("xs:attribute"));
  1016. ForEach(*attrIter)
  1017. {
  1018. AddAttributeFromSchema(attrIter->query(), "", compName, tabName, childElementName);
  1019. }
  1020. Owned<IPropertyTreeIterator> simple = pSchema->getElements("*");
  1021. ForEach(*simple)
  1022. {
  1023. IPropertyTree &element = simple->query();
  1024. const char* pszElementName = element.queryName();
  1025. if (!strcmp(pszElementName, "xs:complexContent"))
  1026. AddAttributesFromSchema(&element, compName, tabName, NULL);
  1027. }
  1028. }
  1029. }
  1030. void ProcessElementSchemaNode(IPropertyTree* pElement,
  1031. IPropertyTree* pParentElement,
  1032. StringBuffer& sbCompName)
  1033. {
  1034. bool bOptSubType = false;
  1035. if (pElement)
  1036. {
  1037. TRACE_SCHEMA_NODE("ProcessElementSchemaNode", pElement);
  1038. const char* szParentElementName = pParentElement->queryProp(XML_ATTR_NAME);
  1039. const char* szElementName = pElement->queryProp(XML_ATTR_NAME);
  1040. const char* szCaption = szElementName;
  1041. const char* tabName = pElement->queryProp("xs:annotation/xs:appinfo/title");
  1042. if (tabName)
  1043. szCaption = tabName;
  1044. IPropertyTree* pViewSchemaNode = pElement; //default for child view
  1045. IPropertyTree* pInstanceNode = pParentElement;//default for child view
  1046. bool bInstanceView = false;
  1047. bool bViewChildNodes = true;
  1048. if (pElement->hasProp("xs:annotation/xs:appinfo/viewType"))
  1049. {
  1050. const char* viewType = pElement->queryProp("xs:annotation/xs:appinfo/viewType");
  1051. const char* viewChildNodes = pElement->queryProp("xs:annotation/xs:appinfo/viewChildNodes");
  1052. bViewChildNodes = viewChildNodes && !stricmp(viewChildNodes, "true");
  1053. bool needParent = true;
  1054. //select first parent node that matches schema
  1055. if (pInstanceNode && needParent)
  1056. {
  1057. Owned<IPropertyTreeIterator> it = pInstanceNode->getElements(szElementName);
  1058. if (it->first() && it->isValid())
  1059. pInstanceNode = &it->query();
  1060. }
  1061. if (!strcmp(viewType, "list"))
  1062. {
  1063. const char* title = pElement->queryProp("xs:annotation/xs:appinfo/title");
  1064. setNameInHiddenTabArray(title? title : szElementName);
  1065. bOptSubType = true;
  1066. }
  1067. if (!strcmp(viewType, "Instance") || !strcmp(viewType, "instance") ||
  1068. !strcmp(viewType, "RoxiePorts") || !strcmp(viewType, "RoxieSlaves"))
  1069. bOptSubType = true;
  1070. }
  1071. bool bHasElements = schemaNodeHasElements(pElement) != NULL;
  1072. if (bViewChildNodes)
  1073. {
  1074. bool bHasAttribs = schemaNodeHasAttributes(pElement);
  1075. bool bHasAttribGroups = schemaNodeHasAttributeGroups(pElement);
  1076. bool bMaxOccursOnce = !pElement->hasProp(XML_ATTR_MAXOCCURS) || !strcmp(pElement->queryProp(XML_ATTR_MAXOCCURS), "1");
  1077. bOptSubType = !bMaxOccursOnce;
  1078. //figure out the type of child view to create
  1079. if (bHasElements)
  1080. {
  1081. // MORE - this assumes there is only one nested element type and that it is repeated....
  1082. StringBuffer sbElemName(szElementName);
  1083. if (bHasAttribs) //has child elements and attributes
  1084. {
  1085. Owned<IPropertyTreeIterator> iter = pElement->getElements("*");
  1086. ForEach(*iter)
  1087. {
  1088. IPropertyTree &subSchemaElement = iter->query();
  1089. const char* szSubElementName = subSchemaElement.queryName();
  1090. StringBuffer sbSubElemName(szSubElementName);
  1091. TRACE_SCHEMA_NODE("ProcessSchemaElement", &subSchemaElement);
  1092. m_splitterTabName.clear().append(getRealTabName(szCaption));
  1093. if (m_allSubTypes || !bOptSubType)
  1094. ProcessComplexTypeSchemaNode(&subSchemaElement, m_pSchemaRoot, sbElemName);
  1095. m_splitterTabName.clear();
  1096. }
  1097. }
  1098. else
  1099. {
  1100. //no attributes
  1101. if (bMaxOccursOnce)
  1102. {
  1103. //has child elements but no attribs and only occurs once
  1104. //so skip this element and create node list view for its children
  1105. pViewSchemaNode = schemaNodeHasElements(pElement);
  1106. if (pInstanceNode)
  1107. {
  1108. IPropertyTree* pNewInstanceNode = pInstanceNode->queryPropTree(szElementName);
  1109. if (!pNewInstanceNode)
  1110. pNewInstanceNode = pInstanceNode->addPropTree(szElementName, createPTree());
  1111. pInstanceNode = pNewInstanceNode;
  1112. }
  1113. szElementName = pViewSchemaNode->queryProp(XML_ATTR_NAME);
  1114. }
  1115. }
  1116. }
  1117. else
  1118. {
  1119. //no child elements
  1120. if (bHasAttribs)
  1121. {
  1122. if (!bMaxOccursOnce) //occurs multiple times
  1123. {
  1124. //select first parent node that matches schema
  1125. if (pInstanceNode)
  1126. {
  1127. Owned<IPropertyTreeIterator> it = pInstanceNode->getElements(szParentElementName);
  1128. if (it->first() && it->isValid())
  1129. pInstanceNode = &it->query();
  1130. }
  1131. }
  1132. }
  1133. else
  1134. {
  1135. const char* type = pElement->queryProp("@type");
  1136. if (type && !strcmp(type, "xs:string"))
  1137. {
  1138. m_jsStrBuf.appendf("var attr%s%s = {};", szElementName, sbCompName.str());
  1139. m_jsStrBuf.appendf("attr%s%s.tab = '%s';", szElementName, sbCompName.str(), getRealTabName(szElementName));
  1140. m_jsStrBuf.appendf("attr%s%s.hidden = 0;", szElementName, sbCompName.str());
  1141. m_jsStrBuf.appendf("attr%s%s.required = 1;", szElementName, sbCompName.str());
  1142. m_jsStrBuf.appendf("attr%s%s.ctrlType = %d;", szElementName, sbCompName.str(), 6);
  1143. m_jsStrBuf.appendf("cS['%s%s']=attr%s%s;", szElementName, sbCompName.str(), szElementName, sbCompName.str());
  1144. //add additional entry for this special case where element value is shown as a column
  1145. m_jsStrBuf.appendf("cS['%s%s']=attr%s%s;", szElementName, szElementName, szElementName, sbCompName.str());
  1146. setNameInCompTabArray(m_splitterTabName, sbCompName.str());
  1147. m_columns.appendf("tabCols['%s'][%d] = '_%s';", m_splitterTabName.str(), m_numAttrs++, szElementName);
  1148. setNameInCompTabArray(szElementName, szElementName);
  1149. setNameInHiddenTabArray(szElementName);
  1150. m_columns.appendf("tabCols['%s'][%d] = '%s';", szElementName, 0, szElementName);
  1151. if (m_pCompTree)
  1152. {
  1153. StringBuffer sb(sbCompName);
  1154. if (!m_pCompTree->queryPropTree(sbCompName.str()))
  1155. m_pCompTree->addPropTree(sbCompName.str(), createPTree());
  1156. sb.append("/").append(szElementName);
  1157. m_pCompTree->addPropTree(sb.str()/*szElementName*/, createPTree());
  1158. }
  1159. }
  1160. }
  1161. }
  1162. }
  1163. if (m_allSubTypes || !bOptSubType)
  1164. AddAttributesFromSchema(pViewSchemaNode, sbCompName, szCaption, szElementName);
  1165. if (bOptSubType && m_viewChildNodes.get() && m_multiRowNodes.get())
  1166. {
  1167. if (bHasElements)
  1168. m_viewChildNodes->addProp("Node", szElementName);
  1169. else
  1170. m_multiRowNodes->addProp("Node", szElementName);
  1171. }
  1172. if (pInstanceNode)
  1173. {
  1174. //select first child node for which we are creating view
  1175. Owned<IPropertyTreeIterator> it = pInstanceNode->getElements(pElement->queryProp(XML_ATTR_NAME));
  1176. pInstanceNode = (it->first() && it->isValid()) ? &it->query() : NULL;
  1177. }
  1178. }
  1179. }
  1180. void ProcessComplexTypeSchemaNode(IPropertyTree* schemaNode,
  1181. IPropertyTree* pParentElement,
  1182. StringBuffer& sbCompName)
  1183. {
  1184. if (schemaNode)
  1185. {
  1186. TRACE_SCHEMA_NODE("ProcessComplexTypeSchemaNode", schemaNode);
  1187. const char* szParentElementName = pParentElement->queryProp(XML_ATTR_NAME);
  1188. //now process the rest...
  1189. Owned<IPropertyTreeIterator> iter = schemaNode->getElements(XSD_TAG_ATTRIBUTE_GROUP);
  1190. ForEach(*iter)
  1191. {
  1192. IPropertyTree &schemaElement = iter->query();
  1193. const char* name = schemaElement.queryProp("@ref");
  1194. StringBuffer xPath;
  1195. xPath.append("//xs:attributeGroup[@name='").append(name).append("']");
  1196. Owned<IPropertyTreeIterator> iter2 = m_pSchemaRoot->getElements(xPath.str());
  1197. ForEach(*iter2)
  1198. {
  1199. IPropertyTree &agDef = iter2->query();
  1200. if (agDef.hasProp("xs:annotation/xs:appinfo/title"))
  1201. name = agDef.queryProp("xs:annotation/xs:appinfo/title");
  1202. AddAttributesFromSchema(&agDef, sbCompName, name, NULL);
  1203. break; // should be exactly one!
  1204. // MORE - this will not get scoping correct. Do I care?
  1205. }
  1206. }
  1207. iter.setown(schemaNode->getElements("*"));
  1208. ForEach(*iter)
  1209. {
  1210. IPropertyTree &schemaElement = iter->query();
  1211. const char* szSchemaElementName = schemaElement.queryName();
  1212. if (!strcmp(szSchemaElementName, XSD_TAG_SEQUENCE) || !strcmp(szSchemaElementName, XSD_TAG_CHOICE))
  1213. {
  1214. Owned<IPropertyTreeIterator> iter2 = schemaElement.getElements(XSD_TAG_ELEMENT);
  1215. ForEach(*iter2)
  1216. {
  1217. IPropertyTree* pElement = &iter2->query();
  1218. ProcessElementSchemaNode(pElement, pParentElement, sbCompName);
  1219. }
  1220. }
  1221. }
  1222. }
  1223. }
  1224. bool generateHeaders()
  1225. {
  1226. StringBuffer sbTabName;
  1227. StringBuffer sbPropName;
  1228. if (!m_pSchemaRoot)
  1229. m_pSchemaRoot.setown(createPTreeFromXMLFile(m_xsdName));
  1230. IPropertyTree *schemaNode = m_pSchemaRoot->queryPropTree("xs:element");
  1231. if (m_compName.length() == 0)
  1232. m_compName.append(schemaNode->queryProp(XML_ATTR_NAME));
  1233. if (!strcmp(m_compName.str(), "Eclserver"))
  1234. m_compName.clear().append(XML_TAG_ECLSERVERPROCESS);
  1235. m_jsStrBuf.append("var compTabs = new Array();\n ");
  1236. m_jsStrBuf.appendf("compTabs['%s'] = new Array();\n", m_compName.str());
  1237. m_jsStrBuf.append("var hiddenTabs = new Array();\n ");
  1238. m_jsStrBuf.appendf("hiddenTabs['%s'] = new Array();\n", m_compName.str());
  1239. m_jsStrBuf.append("var compTabToNode = new Array();\n");
  1240. m_jsStrBuf.append("var cS = new Array();\n");
  1241. Owned<IPropertyTreeIterator> iter = schemaNode->getElements("*");
  1242. ForEach(*iter)
  1243. {
  1244. IPropertyTree &schemaElement = iter->query();
  1245. const char* szElementName = schemaElement.queryName();
  1246. TRACE_SCHEMA_NODE("ProcessSchemaElement", &schemaElement);
  1247. //if node is xs:complexType and xs:complexContent then process children
  1248. if (!strcmp(szElementName, XSD_TAG_COMPLEX_TYPE) ||
  1249. !strcmp(szElementName, XSD_TAG_COMPLEX_CONTENT))
  1250. {
  1251. //if this schema node has any attributes then add an attribute tab
  1252. //
  1253. bool bHasAttribs = schemaNodeHasAttributes(&schemaElement);
  1254. if (bHasAttribs)
  1255. {
  1256. AddAttributesFromSchema(schemaNode, m_compName, "Attributes", NULL);
  1257. }
  1258. }
  1259. ProcessComplexTypeSchemaNode(&schemaElement, m_pSchemaRoot, m_compName);
  1260. }
  1261. addMisc();
  1262. if (m_jsName.length())
  1263. writeToFile(m_jsName, m_jsStrBuf);
  1264. return true;
  1265. }
  1266. void setCompTree(IPropertyTree* pTree, bool allSubTypes)
  1267. {
  1268. m_pCompTree = pTree;
  1269. m_allSubTypes = allSubTypes;
  1270. }
  1271. void getTabNameArray(StringArray& tabNameArray)
  1272. {
  1273. CloneArray(tabNameArray, m_tabNameArray);
  1274. }
  1275. void getDefnPropTree(IPropertyTree* pTree, StringBuffer xpathDefn)
  1276. {
  1277. m_pDefTree = pTree;
  1278. m_xpathDefn.clear().append(xpathDefn);
  1279. generateHeaders();
  1280. }
  1281. void getDefnString(StringBuffer& compDefn, StringBuffer& viewChildNodes, StringBuffer& multiRowNodes)
  1282. {
  1283. m_viewChildNodes.clear();
  1284. m_viewChildNodes.setown(createPTree("viewChildNodes"));
  1285. m_multiRowNodes.clear();
  1286. m_multiRowNodes.setown(createPTree("multiRowNodes"));
  1287. generateHeaders();
  1288. compDefn.clear().append(m_jsStrBuf);
  1289. if (m_colIndex.length() > 27)
  1290. compDefn.append(m_colIndex);
  1291. if (m_columns.length() > 26)
  1292. compDefn.append(m_columns);
  1293. toXML(m_viewChildNodes, viewChildNodes);
  1294. toXML(m_multiRowNodes, multiRowNodes);
  1295. }
  1296. void setWizardFlag(bool flag)
  1297. {
  1298. m_wizFlag = flag;
  1299. }
  1300. void setGenerateOptional(bool flag)
  1301. {
  1302. m_genOptional = flag;
  1303. }
  1304. void setWizard(CWizardInputs* ptr)
  1305. {
  1306. m_wizard.set(ptr);
  1307. }
  1308. void getValueForTypeInXSD(IPropertyTree& attr, StringBuffer compName, StringBuffer& wizDefVal)
  1309. {
  1310. StringBuffer tempPath;
  1311. const char* type = attr.queryProp("@type");
  1312. const char* name = attr.queryProp("@name");
  1313. //first check for all the tags autogen then proceed with type checking.
  1314. if(attr.hasProp("./xs:annotation/xs:appinfo/autogendefaultvalue"))
  1315. {
  1316. tempPath.clear().append("./xs:annotation/xs:appinfo/autogendefaultvalue");
  1317. if(!strcmp(attr.queryProp(tempPath.str()), "$defaultenvfile"))
  1318. {
  1319. tempPath.clear().appendf("Software/EspProcess/EspService[@name='%s']/LocalEnvConfFile", (m_wizard->getService()).str());
  1320. IPropertyTree* pCfg = m_wizard->getConfig();
  1321. const char* pConfFile = pCfg->queryProp(tempPath.str());
  1322. if(pConfFile && *pConfFile)
  1323. {
  1324. Owned<IProperties> pParams = createProperties(pConfFile);
  1325. wizDefVal.clear().append(pParams->queryProp("configs")).append("/environment.xml");
  1326. }
  1327. }
  1328. else if(!strcmp(attr.queryProp(tempPath.str()), "$componentfilesdir"))
  1329. {
  1330. tempPath.clear().append("EnvSettings/path");
  1331. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1332. if(!wizDefVal.length())
  1333. wizDefVal.append(STANDARD_COMPFILESDIR);
  1334. wizDefVal.append(PATHSEPSTR"componentfiles");
  1335. }
  1336. else if(!strcmp(attr.queryProp(tempPath.str()), "$processname"))
  1337. {
  1338. tempPath.clear().appendf("Software/%s[1]/@name",compName.str());
  1339. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1340. }
  1341. else if(!strcmp(attr.queryProp(tempPath.str()), "$hthorcluster"))
  1342. {
  1343. tempPath.clear().append(XML_TAG_SOFTWARE"/"XML_TAG_TOPOLOGY"/"XML_TAG_CLUSTER);
  1344. Owned<IPropertyTreeIterator> iterClusters = m_pEnv->getElements(tempPath.str());
  1345. ForEach (*iterClusters)
  1346. {
  1347. IPropertyTree* pCluster = &iterClusters->query();
  1348. if (pCluster->queryPropTree(XML_TAG_ROXIECLUSTER) ||
  1349. pCluster->queryPropTree(XML_TAG_THORCLUSTER))
  1350. continue;
  1351. else
  1352. {
  1353. wizDefVal.clear().append(pCluster->queryProp(XML_ATTR_NAME));
  1354. break;
  1355. }
  1356. }
  1357. }
  1358. else
  1359. {
  1360. wizDefVal.clear().append(attr.queryProp(tempPath.str()));
  1361. tempPath.clear().appendf("Software/%s[1]/@buildSet", compName.str());
  1362. if(m_pEnv->queryProp(tempPath.str()))
  1363. {
  1364. if(m_wizard->getNumOfNodes(m_pEnv->queryProp(tempPath.str())) > 1)
  1365. {
  1366. tempPath.clear().append("./xs:annotation/xs:appinfo/autogendefaultformultinode");
  1367. if(attr.hasProp(tempPath.str()))
  1368. wizDefVal.clear().append(attr.queryProp(tempPath.str()));
  1369. }
  1370. }
  1371. }
  1372. }
  1373. else if(attr.hasProp("./xs:annotation/xs:appinfo/autogenprefix") || attr.hasProp("./xs:annotation/xs:appinfo/autogensuffix"))
  1374. {
  1375. StringBuffer sb;
  1376. StringBuffer nameOfComp;
  1377. tempPath.clear().appendf("./Software/%s[1]/@name",m_compName.str());
  1378. nameOfComp.clear().append(m_pEnv->queryProp(tempPath.str()));
  1379. tempPath.clear().append("./xs:annotation/xs:appinfo/autogenprefix");
  1380. if(attr.hasProp(tempPath.str()))
  1381. sb.clear().append(attr.queryProp(tempPath.str())).append(nameOfComp);
  1382. tempPath.clear().append("./xs:annotation/xs:appinfo/autogensuffix");
  1383. if(attr.hasProp(tempPath.str()))
  1384. {
  1385. if (sb.length())
  1386. sb.append(attr.queryProp(tempPath.str()));
  1387. else
  1388. sb.append(nameOfComp).append(attr.queryProp(tempPath.str()));
  1389. }
  1390. wizDefVal.clear().append(sb);
  1391. }
  1392. else if(!strcmp(type,"computerType"))
  1393. {
  1394. if(m_wizard)
  1395. {
  1396. StringBuffer buildSetName, ipAddr;
  1397. tempPath.clear().appendf("./Programs/Build/BuildSet[%s=\"%s\"]",XML_ATTR_PROCESS_NAME,m_compName.str());
  1398. IPropertyTree* pCompTree = m_pEnv->queryPropTree(tempPath.str());
  1399. if(pCompTree)
  1400. {
  1401. buildSetName.append(pCompTree->queryProp(XML_ATTR_NAME));
  1402. CInstDetails* pInst = m_wizard->getServerIPMap(compName, buildSetName,m_pEnv);
  1403. if( pInst )
  1404. {
  1405. StringArray& ipArray = pInst->getIpAssigned();
  1406. ForEachItemIn(x, ipArray)
  1407. {
  1408. if(ipArray.ordinality() == 1)
  1409. ipAddr.append(ipArray.item(x));
  1410. else
  1411. ipAddr.append(ipArray.item(x)).append(",");
  1412. tempPath.clear().appendf("./Hardware/Computer[@netAddress=\"%s\"]",ipAddr.str());
  1413. IPropertyTree* pHard = m_pEnv->queryPropTree(tempPath.str());
  1414. if(pHard)
  1415. {
  1416. tempPath.clear().append("@name");
  1417. wizDefVal.clear().append(pHard->queryProp(tempPath.str()));
  1418. }
  1419. }
  1420. }
  1421. }
  1422. }
  1423. }
  1424. else if(!strcmp(type,"xs:string"))
  1425. {
  1426. StringBuffer nameOfComp;
  1427. tempPath.clear().appendf("./Software/%s[1]/@name",m_compName.str());
  1428. nameOfComp.clear().append(m_pEnv->queryProp(tempPath.str()));
  1429. if(!strcmp(name, "dbUser"))
  1430. {
  1431. wizDefVal.clear().append(m_wizard->getDbUser());
  1432. }
  1433. else if(!strcmp(name, "dbPassword"))
  1434. {
  1435. wizDefVal.clear().append(m_wizard->getDbPassword());
  1436. }
  1437. }
  1438. else if(!strcmp(type,"mysqlType"))
  1439. {
  1440. tempPath.clear().append("./Software/MySQLProcess[1]/@name");
  1441. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1442. }
  1443. else if(!strcmp(type,"daliServersType"))
  1444. {
  1445. tempPath.clear().append("./Software/DaliServerProcess[1]/@name");
  1446. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1447. }
  1448. else if(!strcmp(type,"ldapServerType"))
  1449. {
  1450. tempPath.clear().append("./Software/LdapServerProcess[1]/@name");
  1451. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1452. }
  1453. else if(!strcmp(type, "roxieClusterType"))
  1454. {
  1455. tempPath.clear().append("./Software/RoxieCluster[1]/@name");
  1456. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1457. }
  1458. else if(!strcmp(type, "eclServerType"))
  1459. {
  1460. tempPath.clear().append("./Software/EclServerProcess[1]/@name");
  1461. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1462. }
  1463. else if(!strcmp(type, "eclCCServerType"))
  1464. {
  1465. tempPath.clear().append("./Software/EclCCServerProcess[1]/@name");
  1466. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1467. }
  1468. else if(!strcmp(type, "espProcessType"))
  1469. {
  1470. tempPath.clear().append("./Software/EspProcess[1]/@name");
  1471. wizDefVal.clear().append(m_pEnv->queryProp(tempPath.str()));
  1472. }
  1473. else if(!strcmp(type, "espBindingType"))
  1474. {
  1475. IPropertyTree* pAppInfo = attr.queryPropTree("xs:annotation/xs:appinfo");
  1476. StringBuffer xpath;
  1477. const char* serviceType = NULL;
  1478. if (pAppInfo)
  1479. {
  1480. serviceType = pAppInfo->queryProp("serviceType");
  1481. if (serviceType)
  1482. xpath.clear().append("Software/EspService");
  1483. }
  1484. else
  1485. xpath.clear().appendf("Software/*[@buildSet='%s']", type);
  1486. wizDefVal.clear();
  1487. Owned<IPropertyTreeIterator> iterEspServices = m_pEnv->getElements(xpath);
  1488. short blank = 0;
  1489. ForEach (*iterEspServices)
  1490. {
  1491. IPropertyTree* pEspService = &iterEspServices->query();
  1492. if(serviceType)
  1493. {
  1494. xpath.clear().appendf("Properties[@type='%s']", serviceType);
  1495. if (pEspService->queryPropTree(xpath.str()) == NULL)
  1496. continue;
  1497. }
  1498. Owned<IPropertyTreeIterator> iter = m_pEnv->getElements("Software/EspProcess[1]");
  1499. ForEach (*iter)
  1500. {
  1501. IPropertyTree* pEspProcess = &iter->query();
  1502. xpath.clear().appendf("EspBinding[@service='%s']", pEspService->queryProp(XML_ATTR_NAME));
  1503. if(pEspProcess->queryPropTree(xpath.str()) != NULL)
  1504. wizDefVal.append(pEspProcess->queryProp(XML_ATTR_NAME)).append("/").append(pEspService->queryProp(XML_ATTR_NAME));
  1505. }
  1506. }
  1507. }
  1508. else if(!strcmp(type, "ipAddressAndPort"))
  1509. {
  1510. StringBuffer defaultPort;
  1511. tempPath.clear().append("./xs:annotation/xs:appinfo/defaultPort");
  1512. defaultPort.append(attr.queryProp(tempPath.str()));
  1513. tempPath.clear().append("./xs:annotation/xs:appinfo/autogenxpath");
  1514. if(attr.hasProp(tempPath.str()))
  1515. {
  1516. StringBuffer computerName;
  1517. computerName.append(m_pEnv->queryProp(attr.queryProp(tempPath.str())));
  1518. tempPath.clear().appendf("./Hardware/Computer[@name=\"%s\"]",computerName.str());
  1519. if(m_pEnv->hasProp(tempPath.str()))
  1520. {
  1521. IPropertyTree* pHard = m_pEnv->queryPropTree(tempPath.str());
  1522. if(pHard)
  1523. wizDefVal.clear().append(pHard->queryProp("./"XML_ATTR_NETADDRESS)).append(":").append(defaultPort);
  1524. }
  1525. }
  1526. }
  1527. }
  1528. private:
  1529. Linked<const IPropertyTree> m_pEnv;
  1530. Linked<IPropertyTree> m_pSchemaRoot;
  1531. IPropertyTree* m_pCompTree;
  1532. IPropertyTree* m_pDefTree;
  1533. Owned<IPropertyTree> m_viewChildNodes;
  1534. Owned<IPropertyTree> m_multiRowNodes;
  1535. StringBuffer m_jsStrBuf;
  1536. StringBuffer m_colIndex;
  1537. StringBuffer m_columns;
  1538. StringBuffer m_xsdName;
  1539. StringBuffer m_jsName;
  1540. StringBuffer m_compName;
  1541. StringBuffer m_xpathDefn;
  1542. StringBuffer m_splitterTabName;
  1543. StringArray m_tabNameArray;
  1544. StringArray m_hiddenTabNameArray;
  1545. short m_numAttrs;
  1546. bool m_allSubTypes;
  1547. bool m_wizFlag;
  1548. bool m_genOptional;
  1549. Linked<CWizardInputs> m_wizard;
  1550. };
  1551. short treeHasMultipleCompsOfSameType(Linked<IPropertyTree> compTypeTree, const char* xpath)
  1552. {
  1553. Owned<IPropertyTreeIterator> iter = compTypeTree->getElements(xpath);
  1554. IPropertyTree *element = NULL;
  1555. short count = 0;
  1556. if (iter)
  1557. if (iter->first())
  1558. {
  1559. if (iter->isValid())
  1560. {
  1561. element = &iter->query();
  1562. if (iter->next())
  1563. {
  1564. Owned<IPropertyTreeIterator> iterDup = compTypeTree->getElements(xpath);
  1565. ForEach(*iterDup) count++;
  1566. }
  1567. else
  1568. count = 1;
  1569. }
  1570. }
  1571. return count;
  1572. }
  1573. bool generateHeadersFromXsd(IPropertyTree* pEnv, const char* xsdName, const char* jsName)
  1574. {
  1575. CGenerateJSFromXSD obj(pEnv, xsdName, jsName);
  1576. return obj.generateHeaders();
  1577. }
  1578. IPropertyTree* generateTreeFromXsd(const IPropertyTree* pEnv, IPropertyTree* pSchema,
  1579. const char* compName, const char* buildSetName,
  1580. const IPropertyTree* pCfg, const char* servicename,
  1581. bool allSubTypes, bool wizFlag, CWizardInputs* pWInputs,
  1582. bool forceOptional)
  1583. {
  1584. bool flag = true;
  1585. if (!forceOptional)
  1586. {
  1587. StringBuffer xpath, genEnvConf, prop;
  1588. Owned<IProperties> algProp;
  1589. xpath.clear().appendf("Software/EspProcess/EspService[@name='%s']/LocalConfFile", servicename);
  1590. const char* pConfFile = pCfg->queryProp(xpath.str());
  1591. xpath.clear().appendf("Software/EspProcess/EspService[@name='%s']/LocalEnvConfFile", servicename);
  1592. const char* pEnvConfFile = pCfg->queryProp(xpath.str());
  1593. if (pConfFile && *pConfFile && pEnvConfFile && *pEnvConfFile)
  1594. {
  1595. Owned<IProperties> pParams = createProperties(pConfFile);
  1596. Owned<IProperties> pEnvParams = createProperties(pEnvConfFile);
  1597. const char* genenv = pParams->queryProp("wizardalgorithm");
  1598. if (!genenv || !*genenv)
  1599. genenv = "genenvrules.conf";
  1600. const char* cfgpath = pEnvParams->queryProp("configs");
  1601. if (!cfgpath || !*cfgpath)
  1602. cfgpath = CONFIG_DIR;
  1603. genEnvConf.clear().append(cfgpath);
  1604. if (genEnvConf.charAt(genEnvConf.length() - 1) != PATHSEPCHAR)
  1605. genEnvConf.append(PATHSEPCHAR);
  1606. genEnvConf.append(genenv);
  1607. }
  1608. if (genEnvConf.length() && checkFileExists(genEnvConf.str()))
  1609. algProp.setown(createProperties(genEnvConf.str()));
  1610. enum GenOptional {GENOPTIONAL_ALL, GENOPTIONAL_NONE, GENOPTIONAL_COMPS};
  1611. GenOptional genOpt = GENOPTIONAL_COMPS;
  1612. algProp->getProp("do_not_gen_optional", prop);
  1613. StringArray doNotGenOpt;
  1614. doNotGenOpt.appendList(prop.str(), ",");
  1615. if (doNotGenOpt.length() == 0)
  1616. genOpt = GENOPTIONAL_ALL;
  1617. else if (doNotGenOpt.length() == 1 && !strcmp(doNotGenOpt.item(0), "all"))
  1618. genOpt = GENOPTIONAL_NONE;
  1619. if (genOpt == GENOPTIONAL_ALL || (genOpt == GENOPTIONAL_COMPS && doNotGenOpt.find(buildSetName) == NotFound ))
  1620. flag = true;
  1621. else if (genOpt == GENOPTIONAL_NONE || (genOpt == GENOPTIONAL_COMPS && doNotGenOpt.find(buildSetName) != NotFound ))
  1622. flag = false;
  1623. }
  1624. Owned<IPropertyTree> pCompTree(createPTree(compName));
  1625. CGenerateJSFromXSD obj(pEnv, pSchema, "", compName);
  1626. obj.setCompTree(pCompTree, allSubTypes);
  1627. obj.setWizardFlag(wizFlag);
  1628. obj.setGenerateOptional(flag);
  1629. obj.setWizard(pWInputs);
  1630. obj.generateHeaders();
  1631. return pCompTree.getLink();
  1632. }
  1633. bool generateHardwareHeaders(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut, IPropertyTree* pCompTree, bool bIncludeNAS)
  1634. {
  1635. if (pCompTree)
  1636. {
  1637. StringBuffer xpath,sbdefaultValue("");
  1638. IPropertyTree* pComputerType = pCompTree->addPropTree(XML_TAG_COMPUTERTYPE, createPTree());
  1639. xpath.clear().append(XML_ATTR_NAME);
  1640. pComputerType->addProp(xpath, sbdefaultValue.str());
  1641. xpath.clear().append(XML_ATTR_MANUFACTURER);
  1642. pComputerType->addProp(xpath, sbdefaultValue.str());
  1643. xpath.clear().append(XML_ATTR_COMPUTERTYPE);
  1644. pComputerType->addProp(xpath, sbdefaultValue.str());
  1645. xpath.clear().append(XML_ATTR_OPSYS);
  1646. pComputerType->addProp(xpath, sbdefaultValue.str());
  1647. xpath.clear().append(XML_ATTR_MEMORY);
  1648. pComputerType->addProp(xpath, sbdefaultValue.str());
  1649. xpath.clear().append(XML_ATTR_NICSPEED);
  1650. pComputerType->addProp(xpath, sbdefaultValue.str());
  1651. IPropertyTree* pComputer = pCompTree->addPropTree(XML_TAG_COMPUTER, createPTree());
  1652. xpath.clear().append(XML_ATTR_NAME);
  1653. pComputer->addProp(xpath, sbdefaultValue.str());
  1654. xpath.clear().append(XML_ATTR_NETADDRESS);
  1655. pComputer->addProp(xpath, sbdefaultValue.str());
  1656. xpath.clear().append(XML_ATTR_DOMAIN);
  1657. pComputer->addProp(xpath, sbdefaultValue.str());
  1658. xpath.clear().append(XML_ATTR_COMPUTERTYPE);
  1659. pComputer->addProp(xpath, sbdefaultValue.str());
  1660. IPropertyTree* pSwitch = pCompTree->addPropTree(XML_TAG_SWITCH, createPTree());
  1661. xpath.clear().append(XML_ATTR_NAME);
  1662. IPropertyTree* pDomain = pCompTree->addPropTree(XML_TAG_DOMAIN, createPTree());
  1663. xpath.clear().append(XML_ATTR_NAME);
  1664. pDomain->addProp(xpath, sbdefaultValue.str());
  1665. xpath.clear().append(XML_ATTR_USERNAME);
  1666. pDomain->addProp(xpath, sbdefaultValue.str());
  1667. xpath.clear().append(XML_ATTR_PASSWORD);
  1668. pDomain->addProp(xpath, sbdefaultValue.str());
  1669. xpath.clear().append("@snmpSecurityString");
  1670. pDomain->addProp(xpath, sbdefaultValue.str());
  1671. if (bIncludeNAS == true)
  1672. {
  1673. IPropertyTree* pNAS = pCompTree->addPropTree(XML_TAG_NAS, createPTree());
  1674. xpath.clear().append(XML_ATTR_NAME);
  1675. pNAS->addProp(xpath, sbdefaultValue.str());
  1676. xpath.clear().append(XML_ATTR_MASK);
  1677. pNAS->addProp(xpath, "255.255.255.255");
  1678. xpath.clear().append(XML_ATTR_SUBNET);
  1679. pNAS->addProp(xpath, "0.0.0.0");
  1680. xpath.clear().append(XML_ATTR_DIRECTORY);
  1681. pNAS->addProp(xpath, sbdefaultValue.str());
  1682. xpath.clear().append(XML_ATTR_TRACE);
  1683. pNAS->addProp(xpath, sbdefaultValue.str());
  1684. }
  1685. }
  1686. else
  1687. {
  1688. StringBuffer jsStrBuf("var compTabs = new Array();");
  1689. jsStrBuf.append("compTabs['Hardware'] = new Array();");
  1690. jsStrBuf.append("var compTabToNode = new Array();");
  1691. jsStrBuf.append("var cS = new Array();");
  1692. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_NAME, "", 0, 1, "", 1);
  1693. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_MANUFACTURER, "", 0, 1, "", 1);
  1694. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_COMPUTERTYPE, "", 0, 1, "", 1);
  1695. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_OPSYS, "", 0, 1, "|new Array('W2K','solaris','linux')", 4);
  1696. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_MEMORY, "", 0, 1, "", 1);
  1697. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTERTYPE, TAG_NICSPEED, "", 0, 1, "", 1);
  1698. addItem(jsStrBuf, pEnv, XML_TAG_SWITCH, TAG_NAME, "", 0, 1, "", 1);
  1699. addItem(jsStrBuf, pEnv, XML_TAG_DOMAIN, TAG_NAME, "", 0, 1, "", 1);
  1700. addItem(jsStrBuf, pEnv, XML_TAG_DOMAIN, TAG_USERNAME, "", 0, 1, "", 1);
  1701. addItem(jsStrBuf, pEnv, XML_TAG_DOMAIN, TAG_PASSWORD, "", 0, 1, "", 5);
  1702. addItem(jsStrBuf, pEnv, XML_TAG_DOMAIN, TAG_SNMPSECSTRING, "", 0, 1, "", 5);
  1703. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTER, TAG_NAME, "", 0, 1, "", 1);
  1704. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTER, TAG_NETADDRESS, "", 0, 1, "", 1);
  1705. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTER, TAG_DOMAIN, "", 0, 1, XML_TAG_HARDWARE"/"XML_TAG_DOMAIN, 4);
  1706. addItem(jsStrBuf, pEnv, XML_TAG_COMPUTER, TAG_COMPUTERTYPE, "", 0, 1, XML_TAG_HARDWARE"/"XML_TAG_COMPUTERTYPE, 4);
  1707. addItem(jsStrBuf, pEnv, XML_TAG_NAS, TAG_NAME, "", 0, 1, "", 1);
  1708. addItem(jsStrBuf, pEnv, XML_TAG_NAS, TAG_SUBNET, "", 0, 1, "", 1);
  1709. addItem(jsStrBuf, pEnv, XML_TAG_NAS, TAG_DIRECTORY, "", 0, 1, "", 1);
  1710. addItem(jsStrBuf, pEnv, XML_TAG_NAS, TAG_MASK, "", 0, 1, "", 1);
  1711. addItem(jsStrBuf, pEnv, XML_TAG_NAS, TAG_TRACE, "", 0, 1, "", 1);
  1712. jsStrBuf.append("compTabs['Hardware'][compTabs['Hardware'].length]= 'Computer Types';");
  1713. jsStrBuf.append("compTabs['Hardware'][compTabs['Hardware'].length]= 'Switches';");
  1714. jsStrBuf.append("compTabs['Hardware'][compTabs['Hardware'].length]= 'Domains';");
  1715. jsStrBuf.append("compTabs['Hardware'][compTabs['Hardware'].length]= 'Computers';");
  1716. jsStrBuf.append("compTabs['Hardware'][compTabs['Hardware'].length]= 'NAS';");
  1717. jsStrBuf.append("compTabToNode['Computer Types']= 'ComputerType';");
  1718. jsStrBuf.append("compTabToNode['Switches']= 'Switch';");
  1719. jsStrBuf.append("compTabToNode['Domains']= 'Domain';");
  1720. jsStrBuf.append("compTabToNode['Computers']= 'Computer';");
  1721. jsStrBuf.append("compTabToNode['NAS']= 'NAS';");
  1722. int index = 0;
  1723. jsStrBuf.append("var colIndex = new Array();");
  1724. jsStrBuf.appendf("colIndex['nameComputer Types']=%d;", index++);
  1725. jsStrBuf.appendf("colIndex['manufacturerComputer Types']=%d;", index++);
  1726. jsStrBuf.appendf("colIndex['computerTypeComputer Types']=%d;", index++);
  1727. jsStrBuf.appendf("colIndex['opSysComputer Types']=%d;", index++);
  1728. jsStrBuf.appendf("colIndex['nameSwitches']=%d;", 0);
  1729. index=0;
  1730. jsStrBuf.appendf("colIndex['nameDomains']=%d;", index++);
  1731. jsStrBuf.appendf("colIndex['usernameDomains']=%d;", index++);
  1732. jsStrBuf.appendf("colIndex['passwordDomains']=%d;", index++);
  1733. index=0;
  1734. jsStrBuf.appendf("colIndex['nameComputers']=%d;", index++);
  1735. jsStrBuf.appendf("colIndex['netAddressComputers']=%d;", index++);
  1736. jsStrBuf.appendf("colIndex['domainComputers']=%d;", index++);
  1737. jsStrBuf.appendf("colIndex['computerTypeComputers']=%d;", index++);
  1738. index=0;
  1739. jsStrBuf.appendf("colIndex['nameNAS']=%d;", index++);
  1740. jsStrBuf.appendf("colIndex['maskNAS']=%d;", index++);
  1741. jsStrBuf.appendf("colIndex['subnetNAS']=%d;", index++);
  1742. jsStrBuf.appendf("colIndex['directoryNAS']=%d;", index++);
  1743. jsStrBuf.appendf("colIndex['traceNAS']=%d;", index++);
  1744. sbDefn.clear().append(jsStrBuf);
  1745. if (writeOut)
  1746. writeToFile(CONFIGMGR_JSPATH"hardware.js", jsStrBuf);
  1747. }
  1748. return true;
  1749. }
  1750. bool generateHeadersForEnvSettings(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut)
  1751. {
  1752. StringBuffer jsStrBuf("var compTabs = new Array();");
  1753. jsStrBuf.append("compTabs['EnvSettings'] = new Array();");
  1754. jsStrBuf.append("var compTabToNode = new Array();");
  1755. jsStrBuf.append("var cS = new Array();");
  1756. addItem(jsStrBuf, pEnv, "", TAG_SRCPATH, "", 0, 1, "", 0);
  1757. addItem(jsStrBuf, pEnv, "", TAG_LOCK, "", 0, 1, "", 0);
  1758. addItem(jsStrBuf, pEnv, "", TAG_CONFIGS, "", 0, 1, "", 0);
  1759. addItem(jsStrBuf, pEnv, "", TAG_PATH, "", 0, 1, "", 0);
  1760. addItem(jsStrBuf, pEnv, "", TAG_RUNTIME, "", 0, 1, "", 0);
  1761. jsStrBuf.append("compTabs['EnvSettings'][compTabs['EnvSettings'].length]= 'Attributes';");
  1762. sbDefn.clear().append(jsStrBuf);
  1763. if (writeOut)
  1764. writeToFile(CONFIGMGR_JSPATH"EnvSettings.js", jsStrBuf);
  1765. return true;
  1766. }
  1767. bool generateHeadersForEnvXmlView(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut)
  1768. {
  1769. StringBuffer jsStrBuf("var compTabs = new Array();");
  1770. jsStrBuf.append("compTabs['Environment'] = new Array();");
  1771. jsStrBuf.append("var compTabToNode = new Array();");
  1772. jsStrBuf.append("var cS = new Array();");
  1773. jsStrBuf.append("var colIndex = new Array();");
  1774. int index = 0;
  1775. jsStrBuf.appendf("colIndex['nameEnvironment']=%d;", index++);
  1776. jsStrBuf.appendf("colIndex['valueEnvironment']=%d;", index++);
  1777. jsStrBuf.appendf("var attr%s%s = {};", TAG_NAME, TAG_ATTRIBUTE);
  1778. jsStrBuf.appendf("attr%s%s.tab = 'Environment';", TAG_NAME, TAG_ATTRIBUTE);
  1779. jsStrBuf.appendf("attr%s%s.tip = '';", TAG_NAME, TAG_ATTRIBUTE);
  1780. jsStrBuf.appendf("attr%s%s.hidden = 0;", TAG_NAME, TAG_ATTRIBUTE);
  1781. jsStrBuf.appendf("attr%s%s.required = 1;", TAG_NAME, TAG_ATTRIBUTE);
  1782. jsStrBuf.appendf("attr%s%s.ctrlType = 1;", TAG_NAME, TAG_ATTRIBUTE);
  1783. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", TAG_NAME, TAG_ATTRIBUTE, TAG_NAME, TAG_ATTRIBUTE);
  1784. jsStrBuf.appendf("var attr%s%s = {};", TAG_VALUE, TAG_ATTRIBUTE);
  1785. jsStrBuf.appendf("attr%s%s.tab = 'Environment';", TAG_VALUE, TAG_ATTRIBUTE);
  1786. jsStrBuf.appendf("attr%s%s.tip = '';", TAG_VALUE, TAG_ATTRIBUTE);
  1787. jsStrBuf.appendf("attr%s%s.hidden = 0;", TAG_VALUE, TAG_ATTRIBUTE);
  1788. jsStrBuf.appendf("attr%s%s.required = 1;", TAG_VALUE, TAG_ATTRIBUTE);
  1789. jsStrBuf.appendf("attr%s%s.ctrlType = 1;", TAG_VALUE, TAG_ATTRIBUTE);
  1790. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", TAG_VALUE, TAG_ATTRIBUTE, TAG_VALUE, TAG_ATTRIBUTE);
  1791. jsStrBuf.appendf("var attr%s%s = {};", TAG_NAME, TAG_ELEMENT);
  1792. jsStrBuf.appendf("attr%s%s.tab = 'Environment';", TAG_NAME, TAG_ELEMENT);
  1793. jsStrBuf.appendf("attr%s%s.tip = '';", TAG_NAME, TAG_ELEMENT);
  1794. jsStrBuf.appendf("attr%s%s.hidden = 0;", TAG_NAME, TAG_ELEMENT);
  1795. jsStrBuf.appendf("attr%s%s.required = 1;", TAG_NAME, TAG_ELEMENT);
  1796. jsStrBuf.appendf("attr%s%s.ctrlType = 1;", TAG_NAME, TAG_ELEMENT);
  1797. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", TAG_NAME, TAG_ELEMENT, TAG_NAME, TAG_ELEMENT);
  1798. jsStrBuf.appendf("var attr%s%s = {};", TAG_VALUE, TAG_ELEMENT);
  1799. jsStrBuf.appendf("attr%s%s.tab = 'Environment';", TAG_VALUE, TAG_ELEMENT);
  1800. jsStrBuf.appendf("attr%s%s.tip = '';", TAG_VALUE, TAG_ELEMENT);
  1801. jsStrBuf.appendf("attr%s%s.hidden = 0;", TAG_VALUE, TAG_ELEMENT);
  1802. jsStrBuf.appendf("attr%s%s.required = 1;", TAG_VALUE, TAG_ELEMENT);
  1803. jsStrBuf.appendf("attr%s%s.ctrlType = 1;", TAG_VALUE, TAG_ELEMENT);
  1804. jsStrBuf.appendf("cS['%s%s']=attr%s%s;", TAG_VALUE, TAG_ELEMENT, TAG_VALUE, TAG_ELEMENT);
  1805. jsStrBuf.append("compTabs['Environment'][compTabs['Environment'].length]= 'Environment';");
  1806. sbDefn.clear().append(jsStrBuf);
  1807. if (writeOut)
  1808. writeToFile(CONFIGMGR_JSPATH"Environment.js", jsStrBuf);
  1809. return true;
  1810. }
  1811. bool generateHeaderForDeployableComps(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut)
  1812. {
  1813. short index = 0;
  1814. StringBuffer jsStrBuf("var compTabs = new Array();");
  1815. jsStrBuf.append("compTabs['Deploy'] = new Array();");
  1816. jsStrBuf.append("var compTabToNode = new Array();");
  1817. jsStrBuf.append("var cS = new Array();");
  1818. jsStrBuf.append("var colIndex = new Array();");
  1819. addItem(jsStrBuf, pEnv, XML_TAG_COMPONENT, TAG_BUILD, "", 0, 1, "", 0);
  1820. addItem(jsStrBuf, pEnv, XML_TAG_COMPONENT, TAG_BUILDSET, "", 0, 1, "", 0);
  1821. addItem(jsStrBuf, pEnv, XML_TAG_COMPONENT, TAG_NAME, "", 0, 1, "", 0);
  1822. addItem(jsStrBuf, pEnv, XML_TAG_INSTANCES, TAG_BUILDSET, "", 0, 1, "", 0);
  1823. addItem(jsStrBuf, pEnv, XML_TAG_INSTANCES, TAG_DIRECTORY, "", 0, 1, "", 0);
  1824. addItem(jsStrBuf, pEnv, XML_TAG_INSTANCES, TAG_NODENAME, "", 0, 1, "", 0);
  1825. jsStrBuf.append("compTabs['Deploy'][compTabs['Deploy'].length]= 'Deploy';");
  1826. jsStrBuf.appendf("colIndex['nameDeploy']=%d;", index++);
  1827. jsStrBuf.appendf("colIndex['buildDeploy']=%d;", index++);
  1828. jsStrBuf.appendf("colIndex['buildSetDeploy']=%d;", index++);
  1829. sbDefn.clear().append(jsStrBuf);
  1830. if (writeOut)
  1831. writeToFile(CONFIGMGR_JSPATH"deploy.js", jsStrBuf);
  1832. return true;
  1833. }
  1834. bool generateHeaderForTopology(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut)
  1835. {
  1836. short index = 0;
  1837. StringBuffer jsStrBuf("var compTabs = new Array();");
  1838. jsStrBuf.append("compTabs['Topology'] = new Array();");
  1839. jsStrBuf.append("var compTabToNode = new Array();");
  1840. jsStrBuf.append("var cS = new Array();");
  1841. addTopologyType(jsStrBuf, pEnv, "", TAG_NAME, "", 1, 1, "", 1);
  1842. addTopologyType(jsStrBuf, pEnv, "", TAG_BUILDSET, "", 1, 1, "", 1);
  1843. addTopologyType(jsStrBuf, pEnv, XML_TAG_ECLCCSERVERPROCESS, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/EclCCServerProcess", 4);
  1844. addTopologyType(jsStrBuf, pEnv, XML_TAG_ECLSERVERPROCESS, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/EclServerProcess", 4);
  1845. addTopologyType(jsStrBuf, pEnv, XML_TAG_ECLSCHEDULERPROCESS, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/EclSchedulerProcess", 4);
  1846. addTopologyType(jsStrBuf, pEnv, XML_TAG_ECLAGENTPROCESS, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/EclAgentProcess", 4);
  1847. addTopologyType(jsStrBuf, pEnv, XML_TAG_THORCLUSTER, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/ThorCluster", 4);
  1848. addTopologyType(jsStrBuf, pEnv, XML_TAG_ROXIECLUSTER, TAG_PROCESS, "", 0, 1, XML_TAG_SOFTWARE"/RoxieCluster", 4);
  1849. addTopologyType(jsStrBuf, pEnv, XML_TAG_CLUSTER, TAG_NAME, "", 0, 1, "", 1);
  1850. addTopologyType(jsStrBuf, pEnv, XML_TAG_CLUSTER, TAG_PREFIX, "", 0, 1, "", 1);
  1851. jsStrBuf.append("compTabs['Topology'][compTabs['Topology'].length]= 'Topology';");
  1852. jsStrBuf.append("var colIndex = new Array();");
  1853. jsStrBuf.appendf("colIndex['nameTopology']=%d;", index++);
  1854. jsStrBuf.appendf("colIndex['valueTopology']=%d;", index++);
  1855. sbDefn.append(jsStrBuf);
  1856. if (writeOut)
  1857. writeToFile(CONFIGMGR_JSPATH"Topology.js", jsStrBuf);
  1858. return true;
  1859. }
  1860. bool generateBuildHeaders(const IPropertyTree* pEnv, bool isPrograms, StringBuffer& sbDefn, bool writeOut)
  1861. {
  1862. short index = 0;
  1863. StringBuffer jsStrBuf("var compTabs = new Array();");
  1864. jsStrBuf.append("compTabs['Programs'] = new Array();");
  1865. jsStrBuf.append("var compTabToNode = new Array();");
  1866. jsStrBuf.append("var cS = new Array();");
  1867. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_NAME, "", 0, 1, "", 1);
  1868. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_URL, "", 0, 1, "", 1);
  1869. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_PATH, "", 0, 1, "", 1);
  1870. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_INSTALLSET, "", 0, 1, "", 1);
  1871. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_PROCESSNAME, "", 0, 1, "", 1);
  1872. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_SCHEMA, "", 0, 1, "", 1);
  1873. addItem(jsStrBuf, pEnv, XML_TAG_PROGRAMS, TAG_DEPLOYABLE, "", 0, 1, "", 1);
  1874. jsStrBuf.append("compTabs['Programs'][compTabs['Programs'].length]= 'Programs';");
  1875. jsStrBuf.append("var colIndex = new Array();");
  1876. jsStrBuf.appendf("colIndex['namePrograms']=%d;", index++);
  1877. jsStrBuf.appendf("colIndex['pathPrograms']=%d;", index++);
  1878. jsStrBuf.appendf("colIndex['installSetPrograms']=%d;", index++);
  1879. jsStrBuf.appendf("colIndex['processNamePrograms']=%d;", index++);
  1880. jsStrBuf.appendf("colIndex['schemaPrograms']=%d;", index++);
  1881. jsStrBuf.appendf("colIndex['deployablePrograms']=%d;", index++);
  1882. if (isPrograms)
  1883. sbDefn.clear().append(jsStrBuf);
  1884. if (writeOut)
  1885. writeToFile(CONFIGMGR_JSPATH"programs.js", jsStrBuf);
  1886. jsStrBuf.clear().append("var compTabs = new Array();");
  1887. jsStrBuf.append("compTabs['BuildSet'] = new Array();");
  1888. jsStrBuf.append("var compTabToNode = new Array();");
  1889. jsStrBuf.append("var cS = new Array();");
  1890. addItem(jsStrBuf, pEnv, XML_TAG_BUILDSET, TAG_NAME, "", 0, 1, "", 1);
  1891. addItem(jsStrBuf, pEnv, XML_TAG_BUILDSET, TAG_METHOD, "", 0, 1, "", 1);
  1892. addItem(jsStrBuf, pEnv, XML_TAG_BUILDSET, TAG_SRCPATH, "", 0, 1, "", 1);
  1893. addItem(jsStrBuf, pEnv, XML_TAG_BUILDSET, TAG_DESTPATH, "", 0, 1, "", 1);
  1894. addItem(jsStrBuf, pEnv, XML_TAG_BUILDSET, TAG_DESTNAME, "", 0, 1, "", 1);
  1895. jsStrBuf.append("compTabs['BuildSet'][compTabs['BuildSet'].length]= 'BuildSet';");
  1896. if (!isPrograms)
  1897. sbDefn.clear().append(jsStrBuf);
  1898. if (writeOut)
  1899. writeToFile(CONFIGMGR_JSPATH"buildset.js", jsStrBuf);
  1900. return true;
  1901. }
  1902. bool generateHeadersFromEnv(const IPropertyTree* pEnv, StringBuffer& sbDefn, bool writeOut)
  1903. {
  1904. StringBuffer jsStrBuf(" var nodeFullData = new Array(); \
  1905. var nodeRoot = {}; \
  1906. nodeRoot['Name'] = 'Environment'; \
  1907. nodeRoot['DisplayName'] = 'Environment'; \
  1908. nodeRoot['CompType'] = 'Environment'; \
  1909. nodeRoot['Build'] = ''; \
  1910. nodeRoot['BuildSet'] = ''; \
  1911. nodeRoot['Params'] = ''; \
  1912. nodeRoot['id'] = 0; \
  1913. nodeRoot['parent'] = -1; \
  1914. nodeRoot['depth'] = 0; \
  1915. nodeFullData[0] = nodeRoot; \
  1916. ");
  1917. StringBuffer compList, espServiceList, pluginsList;
  1918. getInstalledComponents(NULL, compList, espServiceList, pluginsList, pEnv);
  1919. jsStrBuf.append("nodeRoot['menuComps'] = new Array(").append(compList).append(");");
  1920. jsStrBuf.append("nodeRoot['menuEspServices'] = new Array(").append(espServiceList).append(");");
  1921. jsStrBuf.append("nodeRoot['menuPlugins'] = new Array(").append(pluginsList).append(");");
  1922. short nodeIndex = 1;
  1923. short index = 1;
  1924. short compTypeIndex = 0;
  1925. short buildSetIndex = 0;
  1926. StringBuffer lastCompAdded;
  1927. StringBuffer xPath;
  1928. xPath.append("*");
  1929. Owned<IPropertyTreeIterator> iter = pEnv->getElements(xPath.str(), iptiter_sort);
  1930. ForEach(*iter)
  1931. {
  1932. IPropertyTree& compTypeTree = iter->query();
  1933. StringBuffer compTypeName;
  1934. compTypeTree.getName(compTypeName);
  1935. if (!stricmp(compTypeName.str(), "Data") || !stricmp(compTypeName.str(), "EnvSettings") || !strcmp(compTypeName.str(), XML_TAG_PROGRAMS))
  1936. continue;
  1937. const char* pszCompTypeName = compTypeName.str();
  1938. jsStrBuf.appendf("var node%s = {};", pszCompTypeName);
  1939. jsStrBuf.appendf("node%s['Name'] = '%s';", pszCompTypeName, pszCompTypeName);
  1940. if (!strcmp(pszCompTypeName, XML_TAG_PROGRAMS))
  1941. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszCompTypeName, "Builds");
  1942. else if (!strcmp(pszCompTypeName, "EnvSettings"))
  1943. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszCompTypeName, "Environment Settings");
  1944. else
  1945. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszCompTypeName, pszCompTypeName);
  1946. jsStrBuf.appendf("node%s['CompType'] = '%s';", pszCompTypeName, pszCompTypeName);
  1947. jsStrBuf.appendf("node%s['Build'] = '%s';", pszCompTypeName, "");
  1948. jsStrBuf.appendf("node%s['BuildSet'] = '%s';", pszCompTypeName, "");
  1949. jsStrBuf.appendf("node%s['menu'] = '%s';", pszCompTypeName, "m4");
  1950. jsStrBuf.appendf("node%s['Params'] = '%s';", pszCompTypeName, "");
  1951. jsStrBuf.appendf("node%s['id'] = %d;", pszCompTypeName, index);
  1952. jsStrBuf.appendf("node%s['parent'] = %d;", pszCompTypeName, 0);
  1953. jsStrBuf.appendf("node%s['depth'] = 1;", pszCompTypeName);
  1954. jsStrBuf.appendf("nodeFullData[%d] = node%s;", nodeIndex++, pszCompTypeName);
  1955. compTypeIndex = index;
  1956. index++;
  1957. Owned<IPropertyTreeIterator> iter2 = compTypeTree.getElements(xPath.str(), iptiter_sort);
  1958. ForEach(*iter2)
  1959. {
  1960. IPropertyTree &compTree = iter2->query();
  1961. StringBuffer compName;
  1962. compTree.getName(compName);
  1963. const char* pszCompName = compName.str();
  1964. StringBuffer build;
  1965. StringBuffer buildset;
  1966. StringBuffer compAttrName;
  1967. build = compTree.queryProp(XML_ATTR_BUILD);
  1968. buildset = compTree.queryProp(XML_ATTR_BUILDSET);
  1969. xPath.clear().appendf("%s", pszCompName);
  1970. short multipleComps = treeHasMultipleCompsOfSameType(&compTypeTree, xPath.str());
  1971. xPath.clear().append("*");
  1972. if (compTree.hasProp(XML_ATTR_BUILD) && compTree.hasProp(XML_ATTR_BUILDSET))
  1973. {
  1974. const char* pszBuildset;
  1975. if (!strcmp(pszCompName, XML_TAG_ESPSERVICE))
  1976. pszBuildset = XML_TAG_ESPSERVICE;
  1977. else if (!strcmp(pszCompName, XML_TAG_PLUGINPROCESS))
  1978. pszBuildset = "Plugin";
  1979. else if(!strcmp(pszCompName, XML_TAG_ECLSERVERPROCESS))
  1980. pszBuildset = "EclServer";
  1981. else
  1982. pszBuildset = buildset.str();
  1983. if ((multipleComps > 1) && (lastCompAdded.length() == 0 || strcmp(lastCompAdded.str(), pszBuildset)))
  1984. {
  1985. char szBuf[200];
  1986. GetDisplayProcessName(compTree.queryName(), szBuf);
  1987. compAttrName.append(szBuf).appendf(" (%d)", multipleComps);
  1988. jsStrBuf.appendf("var node%s = {};", pszBuildset);
  1989. jsStrBuf.appendf("node%s['Name'] = '%s';", pszBuildset, ""/*pszBuildset*/);
  1990. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszBuildset, compAttrName.str());
  1991. jsStrBuf.appendf("node%s['CompType'] = '%s';", pszBuildset, pszBuildset);
  1992. jsStrBuf.appendf("node%s['Build'] = '%s';", pszBuildset, "");
  1993. jsStrBuf.appendf("node%s['BuildSet'] = '%s';", pszBuildset, "");
  1994. jsStrBuf.appendf("node%s['menu'] = '%s';", pszBuildset, "");
  1995. jsStrBuf.appendf("node%s['Params'] = '%s';", pszBuildset, "");
  1996. jsStrBuf.appendf("node%s['id'] = %d;", pszBuildset, index);
  1997. jsStrBuf.appendf("node%s['parent'] = %d;", pszBuildset, compTypeIndex);
  1998. jsStrBuf.appendf("node%s['depth'] = 2;", pszBuildset);
  1999. jsStrBuf.appendf("nodeFullData[%d] = node%s;", nodeIndex++, pszBuildset);
  2000. buildSetIndex = index;
  2001. index++;
  2002. }
  2003. lastCompAdded.clear().append(pszBuildset);
  2004. GetDisplayName(&compTree, compAttrName, (multipleComps <= 1));
  2005. jsStrBuf.appendf("var node%s = {};", pszCompName);
  2006. jsStrBuf.appendf("node%s['Name'] = '%s';", pszCompName, compTree.queryProp(XML_ATTR_NAME));
  2007. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszCompName, compAttrName.str());
  2008. jsStrBuf.appendf("node%s['CompType'] = '%s';", pszCompName, pszCompName);
  2009. jsStrBuf.appendf("node%s['Build'] = '%s';", pszCompName, build.str());
  2010. jsStrBuf.appendf("node%s['BuildSet'] = '%s';", pszCompName, buildset.str());
  2011. jsStrBuf.appendf("node%s['menu'] = '%s';", pszCompName, "");
  2012. jsStrBuf.appendf("node%s['Params'] = '%s';", pszCompName, "");
  2013. jsStrBuf.appendf("node%s['id'] = %d;", pszCompName, index);
  2014. jsStrBuf.appendf("node%s['parent'] = %d;", pszCompName, (multipleComps > 1)?buildSetIndex:compTypeIndex);
  2015. jsStrBuf.appendf("node%s['depth'] = %d;", pszCompName, (multipleComps > 1)?3:2);
  2016. jsStrBuf.appendf("nodeFullData[%d] = node%s;", nodeIndex++, pszCompName);
  2017. index++;
  2018. }
  2019. else if (!strcmp(pszCompName, "Directories"))
  2020. {
  2021. jsStrBuf.appendf("var node%s = {};", pszCompName);
  2022. jsStrBuf.appendf("node%s['Name'] = '%s';", pszCompName, pszCompName);
  2023. jsStrBuf.appendf("node%s['DisplayName'] = '%s';", pszCompName, pszCompName);
  2024. jsStrBuf.appendf("node%s['CompType'] = '%s';", pszCompName, pszCompName);
  2025. jsStrBuf.appendf("node%s['Build'] = '';", pszCompName);
  2026. jsStrBuf.appendf("node%s['BuildSet'] = '';", pszCompName);
  2027. jsStrBuf.appendf("node%s['menu'] = '%s';", pszCompName, "");
  2028. jsStrBuf.appendf("node%s['Params'] = '%s';", pszCompName, "");
  2029. jsStrBuf.appendf("node%s['id'] = %d;", pszCompName, index);
  2030. jsStrBuf.appendf("node%s['parent'] = %d;", pszCompName, compTypeIndex);
  2031. jsStrBuf.appendf("node%s['depth'] = %d;", pszCompName, 2);
  2032. jsStrBuf.appendf("nodeFullData[%d] = node%s;", nodeIndex++, pszCompName);
  2033. index++;
  2034. }
  2035. }
  2036. }
  2037. jsStrBuf.append("function getNavTreeData(){return nodeFullData;}");
  2038. jsStrBuf.append("(function(){navTreeData = nodeFullData;})();");
  2039. sbDefn.clear().append(jsStrBuf);
  2040. if (writeOut)
  2041. {
  2042. StringBuffer jsName(CONFIGMGR_JSPATH);
  2043. jsName.append("navtreedata.js");
  2044. writeToFile(jsName, jsStrBuf);
  2045. }
  2046. return true;
  2047. }
  2048. void generateHeaderForMisc()
  2049. {
  2050. //this file is expected when the environment is updated. so just create an empty file
  2051. StringBuffer jsName(CONFIGMGR_JSPATH);
  2052. jsName.append("refresh.js");
  2053. Owned<IFile> pFile = createIFile(jsName);
  2054. }
  2055. bool generateHeaders(const IPropertyTree* pEnv, IConstEnvironment* pConstEnv)
  2056. {
  2057. StringBuffer sbTemp;
  2058. generateHeadersFromEnv(pEnv, sbTemp, true);
  2059. generateHardwareHeaders(pEnv, sbTemp, true);
  2060. generateBuildHeaders(pEnv, true, sbTemp, true);
  2061. StringBuffer xPath;
  2062. xPath.append("Software/*");
  2063. Owned<IPropertyTreeIterator> iter2 = pEnv->getElements(xPath.str());
  2064. ForEach(*iter2)
  2065. {
  2066. IPropertyTree &agDef = iter2->query();
  2067. if (agDef.hasProp(XML_ATTR_BUILD) && agDef.hasProp(XML_ATTR_BUILDSET))
  2068. {
  2069. StringBuffer build;
  2070. StringBuffer buildset;
  2071. StringBuffer schemaPath;
  2072. StringBuffer jsName;
  2073. StringBuffer compName;
  2074. build = agDef.queryProp(XML_ATTR_BUILD);
  2075. buildset = agDef.queryProp(XML_ATTR_BUILDSET);
  2076. StringBuffer agName;
  2077. agDef.getName(agName);
  2078. if (!strcmp(agName.str(), XML_TAG_ESPSERVICE) || !strcmp(agName.str(), XML_TAG_PLUGINPROCESS))
  2079. compName.append(buildset);
  2080. else
  2081. compName.append(agName);
  2082. jsName.append(CONFIGMGR_JSPATH).append(compName).append(".js");
  2083. StringBuffer s;
  2084. s.append("./Programs/Build[@name='").append(build).append("']");
  2085. IPropertyTree *b = pEnv->queryPropTree(s.str());
  2086. if (b)
  2087. {
  2088. s.clear().append("BuildSet[@name='").append(buildset).append("']");
  2089. IPropertyTree *bs = b->queryPropTree(s.str());
  2090. IPropertyTree * pTree = loadSchema(b, bs, schemaPath, pConstEnv);
  2091. fprintf(stdout, "Loading schema file %s", schemaPath.str());
  2092. try
  2093. {
  2094. CGenerateJSFromXSD obj(pEnv, pTree, jsName, compName);
  2095. obj.generateHeaders();
  2096. }
  2097. catch(IException *E)
  2098. {
  2099. StringBuffer buf;
  2100. (E->errorMessage(buf).str());
  2101. printf("%s", buf.str());
  2102. E->Release();
  2103. }
  2104. }
  2105. }
  2106. }
  2107. generateHeaderForTopology(pEnv, sbTemp, true);
  2108. generateHeaderForDeployableComps(pEnv, sbTemp, true);
  2109. generateHeaderForMisc();
  2110. return true;
  2111. }
  2112. bool getComputersListWithUsage(const IPropertyTree* pEnv, StringBuffer& sbComputers, StringBuffer& sbFilter)
  2113. {
  2114. CComputerPicker cpick;
  2115. cpick.SetRootNode(pEnv);
  2116. sbComputers.clear();
  2117. toXML(cpick.getComputerTree(), sbComputers, false);
  2118. toXML(cpick.getFilterTree(), sbFilter, false);
  2119. return true;
  2120. }
  2121. bool handleRoxieOperation(IPropertyTree* pEnv, const char* cmd, const char* xmlStr)
  2122. {
  2123. CConfigEnvHelper configEnv(pEnv);
  2124. bool result = configEnv.handleRoxieOperation(cmd, xmlStr);
  2125. return result;
  2126. }
  2127. bool handleThorTopologyOp(IPropertyTree* pEnv, const char* cmd, const char* xmlStr, StringBuffer& sMsg)
  2128. {
  2129. CConfigEnvHelper configEnv(pEnv);
  2130. bool result = configEnv.handleThorTopologyOp(cmd, xmlStr, sMsg);
  2131. return result;
  2132. }
  2133. void addComponentToEnv(IPropertyTree* pEnv, const char* buildSet, StringBuffer& sbNewName, IPropertyTree* pCompTree)
  2134. {
  2135. CConfigEnvHelper configEnv(pEnv);
  2136. configEnv.addComponent(buildSet, sbNewName, pCompTree);
  2137. }
  2138. bool generateHeaderForComponent(const IPropertyTree* pEnv, IPropertyTree* pSchema, const char* compName)
  2139. {
  2140. try
  2141. {
  2142. StringBuffer jsName;
  2143. jsName.append(CONFIGMGR_JSPATH).append(compName).append(".js");
  2144. CGenerateJSFromXSD obj(pEnv, pSchema, jsName.str(), compName);
  2145. obj.generateHeaders();
  2146. return true;
  2147. }
  2148. catch(IException *E)
  2149. {
  2150. StringBuffer buf;
  2151. (E->errorMessage(buf).str());
  2152. printf("%s", buf.str());
  2153. E->Release();
  2154. }
  2155. return false;
  2156. }
  2157. void deleteRecursive(const char* path)
  2158. {
  2159. Owned<IFile> pDir = createIFile(path);
  2160. if (pDir->exists())
  2161. {
  2162. if (pDir->isDirectory())
  2163. {
  2164. Owned<IDirectoryIterator> it = pDir->directoryFiles(NULL, false, true);
  2165. ForEach(*it)
  2166. {
  2167. StringBuffer name;
  2168. it->getName(name);
  2169. StringBuffer childPath(path);
  2170. childPath.append(PATHSEPCHAR);
  2171. childPath.append(name);
  2172. deleteRecursive(childPath.str());
  2173. }
  2174. }
  2175. pDir->remove();
  2176. }
  2177. }
  2178. void getTabNameArray(const IPropertyTree* pEnv, IPropertyTree* pSchema, const char* compName, StringArray& strArray)
  2179. {
  2180. try
  2181. {
  2182. CGenerateJSFromXSD obj(pEnv, pSchema, "", compName);
  2183. obj.generateHeaders();
  2184. obj.getTabNameArray(strArray);
  2185. }
  2186. catch(IException *E)
  2187. {
  2188. StringBuffer buf;
  2189. (E->errorMessage(buf).str());
  2190. printf("%s", buf.str());
  2191. E->Release();
  2192. }
  2193. }
  2194. void getDefnPropTree(const IPropertyTree* pEnv, IPropertyTree* pSchema, const char* compName, IPropertyTree* pDefTree, StringBuffer xpathDefn)
  2195. {
  2196. try
  2197. {
  2198. CGenerateJSFromXSD obj(pEnv, pSchema, "", compName);
  2199. obj.getDefnPropTree(pDefTree, xpathDefn);
  2200. }
  2201. catch(IException *E)
  2202. {
  2203. StringBuffer buf;
  2204. (E->errorMessage(buf).str());
  2205. printf("%s", buf.str());
  2206. E->Release();
  2207. }
  2208. }
  2209. void getDefnString(const IPropertyTree* pEnv, IPropertyTree* pSchema, const char* compName, StringBuffer& compDefn, StringBuffer& viewChildNodes, StringBuffer& multiRowNodes)
  2210. {
  2211. try
  2212. {
  2213. CGenerateJSFromXSD obj(pEnv, pSchema, "", compName);
  2214. obj.getDefnString(compDefn, viewChildNodes, multiRowNodes);
  2215. }
  2216. catch(IException *E)
  2217. {
  2218. StringBuffer buf;
  2219. (E->errorMessage(buf).str());
  2220. printf("%s", buf.str());
  2221. E->Release();
  2222. }
  2223. }
  2224. bool checkComponentReferences(const IPropertyTree* pEnv,
  2225. IPropertyTree* pOrigNode,
  2226. const char* szName,
  2227. const char* xpath,
  2228. StringBuffer& sMsg,
  2229. const StringArray& attribArray,
  2230. const char* szNewName/*=NULL*/)
  2231. {
  2232. const IPropertyTree* pSoftware = pEnv->queryPropTree(XML_TAG_SOFTWARE);
  2233. // split xpath into 2 strings: one for component and the other for its childrens' xpath
  2234. // so we can report its name, if needed. For instance, if xpath is
  2235. // "Topology/EclServerProcess/EclAgentProcess" then create 2 separate xpaths:
  2236. // "Topology" and "EclServerProcess/EclAgentProcess" so we can report Topology's name.
  2237. //
  2238. StringBuffer xpath1;//component
  2239. const char* xpath2;//remaining
  2240. const char* pSlash = strchr(xpath, '/');
  2241. if (pSlash)
  2242. {
  2243. String str(xpath);
  2244. String* pStr = str.substring(0, strcspn(xpath, "/"));
  2245. xpath1.append(pStr->toCharArray());
  2246. delete pStr;
  2247. xpath2 = pSlash+1;
  2248. }
  2249. else
  2250. {
  2251. xpath1.append(xpath);
  2252. xpath2 = NULL;
  2253. }
  2254. const bool bEspProcess = !strcmp(pOrigNode->queryName(), XML_TAG_ESPPROCESS);
  2255. int nAttribs = attribArray.length();
  2256. Owned<IPropertyTreeIterator> iComp = pSoftware->getElements(xpath1);
  2257. ForEach(*iComp)
  2258. {
  2259. IPropertyTree* pComp = &iComp->query();
  2260. if (pComp == pOrigNode)//resolve circular dependency - don't check against the original node!
  2261. continue;
  2262. Owned<IPropertyTreeIterator> iter;
  2263. if (xpath2)
  2264. iter.setown(pComp->getElements(xpath2));
  2265. else
  2266. {
  2267. iComp->Link();
  2268. iter.setown(iComp.get());
  2269. }
  2270. ForEach(*iter)
  2271. {
  2272. pComp = &iComp->query(); //inner loop may have changed the component if xpath2 is NULL
  2273. if (pComp == pOrigNode)//resolve circular dependency - don't check against the original node!
  2274. continue;
  2275. IPropertyTree* pNode = &iter->query();
  2276. for (int i=0; i<nAttribs; i++)
  2277. {
  2278. const char* attribName = attribArray.item(i);
  2279. const char* szValue = pNode->queryProp(attribName);
  2280. if (!szValue)
  2281. continue;
  2282. bool bMatch;
  2283. if (bEspProcess)
  2284. {
  2285. const unsigned int len = strlen(szName);
  2286. bMatch = !strncmp(szValue, szName, len) && szValue[len] == '/';
  2287. }
  2288. else
  2289. bMatch = strcmp(szValue, szName)==0;
  2290. if (bMatch)
  2291. {
  2292. if (szNewName==NULL)
  2293. {
  2294. const char* szCompName = pComp->queryProp(XML_ATTR_NAME);
  2295. const char* szElemName = pComp->queryName();
  2296. sMsg.appendf("Component '%s' is referenced by %s %s component", szName, szCompName ? "the":"an instance of", szElemName);
  2297. if (szCompName)
  2298. sMsg.appendf(" '%s'", szCompName);
  2299. sMsg.append(".\nYou must remove all references before it can be deleted.");
  2300. return false;
  2301. }
  2302. else
  2303. {
  2304. if (bEspProcess)
  2305. {
  2306. StringBuffer sNewName(szNewName);
  2307. sNewName.append(szValue).appendf("%d", (int) strlen(szName));
  2308. pNode->setProp(attribName, sNewName);
  2309. }
  2310. else
  2311. pNode->setProp(attribName, szNewName);
  2312. }
  2313. }
  2314. }
  2315. }
  2316. if (xpath2==NULL)
  2317. break;
  2318. }
  2319. return true;
  2320. }
  2321. bool checkComponentReferences(const IPropertyTree* pEnv, IPropertyTree* pNode, const char* szPrevName, StringBuffer& sMsg, const char* szNewName/*=NULL*/)
  2322. {
  2323. const char* szProcess = pNode->queryName();
  2324. // A component may be referenced by other components with any attribute name
  2325. // (and not just @process), for e.g. @eclServer, @mySQL, @MySQL etc. The
  2326. // components are inter-twined with cross links amongst them and there is
  2327. // no way to figure them out dynamically generically based on just the
  2328. // schema etc. (we only load one schema at a time anyway).
  2329. // So we would hard code these rules for dependency checks based on current
  2330. // relationships until we figure out a better way to do the same in future.
  2331. // The drawback is that these rules will have to be kept in sync with the
  2332. // the introduction of newer relationships.
  2333. // We need to check for other components with different xpaths and each
  2334. // with possibly more than one attribute name so define an StringArray
  2335. // to store xpaths and another array of StringArray objects to hold list of
  2336. // attributes corresponding to the xpaths to be validated.
  2337. //
  2338. // This avoids multiple traversals of the xpath for multiple attribute names.
  2339. //
  2340. StringArray xpathArray;
  2341. StringArray attribArray[6];//we don't add attributes for more than 6 xpaths
  2342. //as for EspBinding below
  2343. int numXpaths = 0;
  2344. StringArray& attribs = attribArray[numXpaths++];
  2345. if (!strcmp(szProcess, XML_TAG_DALISERVERPROCESS))
  2346. {
  2347. xpathArray.append("*");
  2348. attribs.append("@daliServer");//EclServerProcess
  2349. attribs.append("@daliServers");
  2350. attribs.append("@daliservers");//DfuProcess
  2351. }
  2352. else if (!strcmp(szProcess, XML_TAG_ECLAGENTPROCESS))
  2353. {
  2354. xpathArray.append("Topology/Cluster/EclAgentProcess");
  2355. attribs.append("@process");
  2356. }
  2357. else if (!strcmp(szProcess, XML_TAG_ECLSERVERPROCESS))
  2358. {
  2359. xpathArray.append("*");
  2360. attribs.append("@eclServer");
  2361. xpathArray.append("Topology/EclServerProcess");
  2362. StringArray& attribs2 = attribArray[numXpaths++];
  2363. attribs2.append("@process");
  2364. }
  2365. else if (!strcmp(szProcess, XML_TAG_ECLCCSERVERPROCESS))
  2366. {
  2367. xpathArray.append("*");
  2368. attribs.append("@eclServer");
  2369. xpathArray.append("Topology/Cluster/EclCCServerProcess");
  2370. StringArray& attribs2 = attribArray[numXpaths++];
  2371. attribs2.append("@process");
  2372. }
  2373. else if (!strcmp(szProcess, XML_TAG_ECLSCHEDULERPROCESS))
  2374. {
  2375. xpathArray.append("*");
  2376. attribs.append("@eclScheduler");
  2377. xpathArray.append("Topology/Cluster/EclSchedulerProcess");
  2378. StringArray& attribs2 = attribArray[numXpaths++];
  2379. attribs2.append("@process");
  2380. }
  2381. else if (!strcmp(szProcess, XML_TAG_ESPSERVICE))
  2382. {
  2383. xpathArray.append("EspProcess/EspBinding");
  2384. attribs.append("@service");
  2385. }
  2386. else if (!strcmp(szProcess, "LDAPServerProcess"))
  2387. {
  2388. xpathArray.append("*");
  2389. attribs.append("@ldapServer");
  2390. attribs.append("ldapSecurity/@server");//under EclServer
  2391. xpathArray.append("EspProcess/Authentication");
  2392. StringArray& attribs2 = attribArray[numXpaths++];
  2393. attribs2.append("@ldapServer");
  2394. }
  2395. else if (!strcmp(szProcess, "MySQLProcess"))
  2396. {
  2397. xpathArray.append("*");
  2398. attribs.append("@mySql");
  2399. attribs.append("@MySql");
  2400. attribs.append("@MySQL");
  2401. attribs.append("@database");
  2402. }
  2403. else if (!strcmp(szProcess, XML_TAG_PLUGINPROCESS))
  2404. {
  2405. xpathArray.append("EclServerProcess/PluginRef");
  2406. attribs.append("@process");
  2407. }
  2408. else if (!strcmp(szProcess, "RoxieCluster"))
  2409. {
  2410. xpathArray.append("Topology/Cluster/RoxieCluster");
  2411. attribs.append("@process");
  2412. }
  2413. else if (!strcmp(szProcess, XML_TAG_THORCLUSTER))
  2414. {
  2415. xpathArray.append("Topology/Cluster/ThorCluster");
  2416. attribs.append("@process");
  2417. }
  2418. else if (!strcmp(szProcess, XML_TAG_ESPBINDING) || !strcmp(szProcess, XML_TAG_ESPPROCESS))
  2419. {
  2420. xpathArray.append(XML_TAG_ESPSERVICE);
  2421. attribs.append("@eclWatch"); //ws_ecl
  2422. attribs.append("@attributeServer");//ws_ecl and ws_roxieconfig
  2423. xpathArray.append("EspService/WsEcl");//ws_facts and ws_distrix
  2424. attribArray[numXpaths++].append("@espBinding");
  2425. xpathArray.append("EspService/SourceAttributeServer");//ws_roxieconfig
  2426. attribArray[numXpaths++].append("@espBinding");
  2427. xpathArray.append(XML_TAG_ECLSERVERPROCESS);
  2428. attribArray[numXpaths++].append("@eclWatch");
  2429. xpathArray.append("DfuplusProcess");
  2430. attribArray[numXpaths++].append("@server");
  2431. xpathArray.append("RegressionSuite");
  2432. StringArray& attribs2 = attribArray[numXpaths++];
  2433. attribs2.append("@server");
  2434. attribs2.append("@roxieconfig");
  2435. }
  2436. else
  2437. {
  2438. xpathArray.append("*");
  2439. attribs.append(XML_ATTR_NAME);
  2440. }
  2441. bool rc = true;
  2442. for (int i=0; i<numXpaths && rc; i++)
  2443. rc = checkComponentReferences(pEnv, pNode, szPrevName, xpathArray.item(i), sMsg, attribArray[i], szNewName);
  2444. return rc;
  2445. }
  2446. const char* getUniqueName(const IPropertyTree* pEnv, StringBuffer& sName, const char* processName, const char* category)
  2447. {
  2448. //if the name ends in _N (where N is a number) then ignore _N to avoid duplicating
  2449. //number suffix as in _N_M
  2450. //
  2451. StringBuffer sPrefix = sName;
  2452. const char* pdx = strrchr(sName.str(), '_');
  2453. if (pdx)
  2454. {
  2455. StringBuffer num(sName);
  2456. char* pszNum = num.detach();
  2457. char *token;
  2458. j_strtok_r(pszNum, "_", &token);
  2459. if (strspn(token, "0123456789") == strlen(token))
  2460. {
  2461. sName.remove(pdx - sName.str(), sName.length() - (pdx - sName.str()));
  2462. sPrefix.clear().append(sName);
  2463. }
  2464. else
  2465. {
  2466. int len = sPrefix.length();
  2467. if (len > 0 && endsWith(sPrefix.str(), "_")) //ends with '_'
  2468. sPrefix = sPrefix.remove(sPrefix.length() - 1, 1); //lose it
  2469. }
  2470. }
  2471. StringBuffer xpath;
  2472. xpath.appendf("./%s/%s[@name='%s']", category, processName, sName.str());
  2473. int iIdx = 2;
  2474. while (pEnv->queryPropTree(xpath))
  2475. {
  2476. sName.clear().appendf("%s_", sPrefix.str()).append(iIdx);
  2477. xpath.clear().appendf("./%s/%s[@name='%s']", category, processName, sName.str());
  2478. iIdx++;
  2479. }
  2480. return sName.str();
  2481. }
  2482. void getCommonDir(const IPropertyTree* pEnv, const char* catType, const char* buildSetName, const char* compName, StringBuffer& sbVal)
  2483. {
  2484. const IPropertyTree* pEnvDirs = pEnv->queryPropTree("Software/Directories");
  2485. const char* commonDirName = pEnvDirs->queryProp(XML_ATTR_NAME);
  2486. StringBuffer xpath;
  2487. xpath.appendf("Category[@name='%s']", catType);
  2488. Owned<IPropertyTreeIterator> iterCats = pEnvDirs->getElements(xpath.str());
  2489. ForEach (*iterCats)
  2490. {
  2491. IPropertyTree* pCat = &iterCats->query();
  2492. StringBuffer sb("Override");
  2493. sb.appendf("[@component='%s'][@instance='%s']",buildSetName, compName);
  2494. IPropertyTree* pCatOver = pCat->queryPropTree(sb.str());
  2495. if (!pCatOver)
  2496. {
  2497. sb.clear().appendf("Override[@instance='%s']", compName);
  2498. Owned<IPropertyTreeIterator> overIter = pCat->getElements(sb.str());
  2499. ForEach(*overIter)
  2500. {
  2501. IPropertyTree* pTmp = &overIter->query();
  2502. if (!pTmp->queryProp("@component"))
  2503. {
  2504. pCatOver = pTmp;
  2505. sbVal.clear().append(pCatOver->queryProp("@dir"));
  2506. break;
  2507. }
  2508. }
  2509. if (!pCatOver)
  2510. sbVal.clear().append(pCat->queryProp("@dir"));
  2511. }
  2512. else
  2513. sbVal.clear().append(pCatOver->queryProp("@dir"));
  2514. sbVal.replaceString("[COMPONENT]",buildSetName);
  2515. sbVal.replaceString("[INST]", compName);
  2516. sbVal.replaceString("[NAME]", commonDirName);
  2517. break;
  2518. }
  2519. }
  2520. IPropertyTree* getNewRange(const IPropertyTree* pEnv, const char* prefix, const char* domain, const char* cType, const char* startIP, const char* endIP)
  2521. {
  2522. StringBuffer sXML;
  2523. int nCount = 0;
  2524. IpAddress start(startIP);
  2525. IpAddress end(endIP);
  2526. unsigned s, e;
  2527. start.getNetAddress(sizeof(s),&s);
  2528. end.getNetAddress(sizeof(e),&e);
  2529. if( s > e)
  2530. {
  2531. s^=e^=s^=e;
  2532. const char* temp = startIP;
  2533. startIP = endIP;
  2534. endIP= temp;
  2535. }
  2536. if (start.isNull())
  2537. throw MakeStringException(-1, "Invalid start ip address: %s", startIP);
  2538. if (end.isNull())
  2539. throw MakeStringException(-1, "Invalid stop ip address: %s", endIP);
  2540. if ((s << 8) != (e << 8))
  2541. throw MakeStringException(-1, "Start and stop IP addresses must be within same subnet");
  2542. // Create string for common attributes
  2543. StringBuffer attr, val, sAttributes;
  2544. attr.appendf(" %s=\"%s\"", &XML_ATTR_DOMAIN[1], domain);
  2545. attr.appendf(" %s=\"%s\"", &XML_ATTR_COMPUTERTYPE[1], cType);
  2546. IpAddress range;
  2547. StringBuffer iprange(startIP);
  2548. String str(startIP);
  2549. iprange.append("-").append(endIP + str.lastIndexOf('.') + 1);
  2550. range.ipsetrange(iprange.str());
  2551. StringBuffer sNode("<"XML_TAG_HARDWARE">"), sName, sIP;
  2552. int count = (e >> 24) - (s >> 24) + 1;
  2553. nCount = count;
  2554. while (count--)
  2555. {
  2556. range.getIpText(sIP.clear());
  2557. unsigned x;
  2558. range.getNetAddress(sizeof(x),&x);
  2559. sName.clear().appendf("%s%03d%03d", prefix, (x >> 16) & 0xFF, (x >> 24) & 0xFF);
  2560. sNode.appendf("<"XML_TAG_COMPUTER" %s=\"%s\" %s=\"%s\" %s/>",
  2561. &XML_ATTR_NAME[1], getUniqueName(pEnv, sName, XML_TAG_COMPUTER, XML_TAG_HARDWARE),
  2562. &XML_ATTR_NETADDRESS[1], sIP.str(),
  2563. attr.str());
  2564. range.ipincrement(1);
  2565. }
  2566. if (sNode.length() > 10)
  2567. {
  2568. sNode.append("</"XML_TAG_HARDWARE">");
  2569. IPropertyTree* pTree = createPTreeFromXMLString(sNode);
  2570. return pTree;
  2571. }
  2572. else
  2573. return NULL;
  2574. }
  2575. bool ensureUniqueName(const IPropertyTree* pEnv, IPropertyTree* pParentNode, const char* sectionName, const char* newName)
  2576. {
  2577. //this function finds out nodes with a given name in a section (Hardware, Software,
  2578. //Programs or Data
  2579. //
  2580. bool bOriginalFound = false;
  2581. bool bDuplicateFound = false;
  2582. StringBuffer xpath(sectionName);
  2583. xpath.append("/").append(pParentNode->queryName());
  2584. Owned<IPropertyTreeIterator> iter = pEnv->getElements(xpath);
  2585. ForEach(*iter)
  2586. {
  2587. IPropertyTree* pNode = &iter->query();
  2588. const char* name = pNode->queryProp("@name");
  2589. if (name)
  2590. {
  2591. if (pNode == pParentNode)
  2592. bOriginalFound = true;
  2593. else
  2594. if (!strcmp(name, newName))
  2595. {
  2596. bDuplicateFound = true;//cannot exit loop prematurely since this
  2597. if (bOriginalFound) //until this is set
  2598. break;
  2599. }
  2600. }
  2601. }
  2602. if (bOriginalFound && bDuplicateFound)
  2603. {
  2604. throw MakeStringException(-1, "Another %s already exists with the same name!\nPlease specify a unique name",
  2605. pParentNode->queryName());
  2606. }
  2607. return true;
  2608. }
  2609. bool ensureUniqueName(const IPropertyTree* pEnv, IPropertyTree* pParentNode, const char* szText)
  2610. {
  2611. if (!strcmp(szText, "Directories"))
  2612. throw MakeStringException(-1, "%s already exists!\nPlease specify a unique name", szText);
  2613. bool rc = ensureUniqueName(pEnv, pParentNode, "Software", szText) &&
  2614. ensureUniqueName(pEnv, pParentNode,"Hardware", szText) &&
  2615. ensureUniqueName(pEnv, pParentNode,"Programs", szText);
  2616. return rc;
  2617. }
  2618. const char* expandXPath(StringBuffer& xpath, IPropertyTree* pNode, IPropertyTree* pParentNode, int position)
  2619. {
  2620. StringBuffer xpathOut;
  2621. StringBuffer subxpath = strpbrk(xpath.str(), "/=");
  2622. if (!strcmp(subxpath.str(), ".."))
  2623. {
  2624. int skip = 2;
  2625. if (xpath.length() > 2 && xpath.charAt(2) == '/')
  2626. skip++;
  2627. subxpath = strpbrk(xpath.str() + skip, "/=]");
  2628. xpathOut.append(expandXPath(subxpath, pParentNode, NULL, -1));
  2629. }
  2630. else
  2631. if (!strcmp(subxpath.str(), "position()"))
  2632. {
  2633. char sPos[32];
  2634. itoa(position, sPos, 10);
  2635. StringBuffer sb(xpathOut.str() + position);
  2636. xpathOut.clear().append(sb);
  2637. }
  2638. else
  2639. if (subxpath.length() && subxpath.charAt(0) == '@')
  2640. xpathOut.append("`").append(pNode->queryProp(subxpath.str())).append("`");
  2641. xpath.clear().append(xpathOut);
  2642. return xpath;
  2643. }
  2644. bool xsltTransform(const StringBuffer& xml, const char* sheet, IProperties *params, StringBuffer& ret)
  2645. {
  2646. if (!checkFileExists(sheet))
  2647. throw MakeStringException(-1, "Could not find stylesheet %s",sheet);
  2648. Owned<IXslProcessor> proc = getXslProcessor();
  2649. Owned<IXslTransform> trans = proc->createXslTransform();
  2650. trans->setXmlSource(xml.str(), xml.length());
  2651. trans->loadXslFromFile(sheet);
  2652. if (params)
  2653. {
  2654. Owned<IPropertyIterator> it = params->getIterator();
  2655. for (it->first(); it->isValid(); it->next())
  2656. {
  2657. const char *key = it->getPropKey();
  2658. //set parameter in the XSL transform skipping over the @ prefix, if any
  2659. const char* paramName = *key == '@' ? key+1 : key;
  2660. trans->setParameter(paramName, StringBuffer().append('\'').append(params->queryProp(key)).append('\'').str());
  2661. }
  2662. }
  2663. trans->transform(ret);
  2664. return true;
  2665. }
  2666. bool onChangeAttribute(const IPropertyTree* pEnv,
  2667. IConstEnvironment* pConstEnv,
  2668. const char* attrName,
  2669. IPropertyTree* pOnChange,
  2670. IPropertyTree*& pNode,
  2671. IPropertyTree* pParentNode,
  2672. int position,
  2673. const char* szNewValue,
  2674. const char* prevValue,
  2675. const char* buildSet)
  2676. {
  2677. bool rc = false;
  2678. StringBuffer sbAttr("@");
  2679. sbAttr.append(attrName);
  2680. try
  2681. {
  2682. IPropertyTree* pComponent = pNode;
  2683. const char* xslt = pOnChange->queryProp("xslt");
  2684. StringBuffer xpath("Programs/Build");
  2685. IPropertyTree *pBuild = pEnv->queryPropTree(xpath.str());
  2686. if (pBuild)
  2687. {
  2688. xpath.clear().append("BuildSet[@name='").append(buildSet).append("']");
  2689. IPropertyTree *pBuildSet = pBuild->queryPropTree(xpath.str());
  2690. StringBuffer sXsltPath;
  2691. if (pBuildSet && connectBuildSet(pBuild, pBuildSet, sXsltPath, pConstEnv))
  2692. {
  2693. sXsltPath.append(xslt);
  2694. Owned<IProperties> params(createProperties());
  2695. params->setProp("@attribName", attrName);
  2696. params->setProp("@oldValue", prevValue);
  2697. params->setProp("@newValue", szNewValue);
  2698. xpath = pOnChange->queryProp("xpath");
  2699. if (xpath.length())
  2700. {
  2701. /* sample xpath is as follows so expand it:
  2702. RemoteNScfg[@espBinding=current()/../@espBinding]/Configuration[current()/position()]
  2703. */
  2704. const char* pos;
  2705. while ((pos=strstr(xpath.str(), "current()/")) != NULL)
  2706. {
  2707. const char* pos2 = pos + sizeof("current()/")-1;
  2708. StringBuffer subxpath(strpbrk(strstr(xpath.str(), pos2), "=]"));
  2709. const int len = subxpath.length();
  2710. //xpath = xpath.Left(pos) + expandXPath(subxpath, pNode, pParentNode, position) + xpath.Mid(pos2+len);
  2711. }
  2712. params->setProp("@xpath", xpath);
  2713. }
  2714. const char* source = pOnChange->queryProp("xml");
  2715. IPropertyTree* pSourceNode = pNode;
  2716. if (source && *source)//default is just the element whose attribute got changed
  2717. {
  2718. if (!stricmp(source, "component"))
  2719. pSourceNode = pComponent;
  2720. else
  2721. throw MakeStringException(0, "Invalid source specified.");
  2722. }
  2723. StringBuffer xml;
  2724. toXML(pSourceNode, xml);
  2725. StringBuffer ret;
  2726. if (xsltTransform(xml, sXsltPath, params, ret))
  2727. {
  2728. Owned<IPropertyTree> result = createPTreeFromXMLString(ret.str());
  2729. Owned<IAttributeIterator> iAttr = result->getAttributes();
  2730. ForEach(*iAttr)
  2731. {
  2732. const char* attrName = iAttr->queryName();
  2733. if (!pSourceNode->hasProp(attrName))
  2734. pSourceNode->addProp(attrName, iAttr->queryValue());
  2735. else
  2736. pSourceNode->setProp(attrName, iAttr->queryValue());
  2737. }
  2738. rc = true;
  2739. }
  2740. }
  2741. }
  2742. }
  2743. catch (IException* e)
  2744. {
  2745. pNode->setProp(sbAttr.str(), prevValue);
  2746. StringBuffer sMsg;
  2747. e->errorMessage(sMsg);
  2748. throw e;
  2749. }
  2750. catch(...)
  2751. {
  2752. pNode->setProp(sbAttr.str(), prevValue);
  2753. throw;
  2754. }
  2755. if (!rc)
  2756. pNode->setProp(sbAttr.str(), prevValue);
  2757. return rc;
  2758. }
  2759. void UpdateRefAttributes(IPropertyTree* pEnv, const char* szPath, const char* szAttr, const char* szOldVal, const char* szNewVal)
  2760. {
  2761. Owned<IPropertyTreeIterator> iter = pEnv->getElements(szPath);
  2762. for (iter->first(); iter->isValid(); iter->next())
  2763. {
  2764. IPropertyTree& node = iter->query();
  2765. const char* szVal = node.queryProp(szAttr);
  2766. if (szVal && strcmp(szVal, szOldVal)==0)
  2767. node.setProp(szAttr, szNewVal);
  2768. }
  2769. }
  2770. void addInstanceToCompTree(const IPropertyTree* pEnvRoot,const IPropertyTree* pInstance,StringBuffer& dups,StringBuffer& resp,IConstEnvironment* pConstEnv)
  2771. {
  2772. StringBuffer buildSetPath, xpath;
  2773. const char* buildSet = pInstance->queryProp(XML_ATTR_BUILDSET);
  2774. const char* compName = pInstance->queryProp("@compName");
  2775. xpath.appendf("./Programs/Build/BuildSet[@name=\"%s\"]", buildSet);
  2776. Owned<IPropertyTreeIterator> buildSetIter = pEnvRoot->getElements(xpath.str());
  2777. buildSetIter->first();
  2778. IPropertyTree* pBuildSet = &buildSetIter->query();
  2779. const char* processName = pBuildSet->queryProp(XML_ATTR_PROCESS_NAME);
  2780. Owned<IPropertyTree> pSchema = loadSchema(pEnvRoot->queryPropTree("./Programs/Build[1]"), pBuildSet, buildSetPath, pConstEnv);
  2781. xpath.clear().appendf("./Software/%s[@name=\"%s\"]", processName, compName);
  2782. IPropertyTree* pCompTree = pEnvRoot->queryPropTree(xpath.str());
  2783. Owned<IPropertyTreeIterator> iterInst = pInstance->getElements("*");
  2784. bool bAdded = false;
  2785. ForEach(*iterInst)
  2786. {
  2787. IPropertyTree& pComputer = iterInst->query();
  2788. xpath.clear().appendf("./Hardware/Computer[@name=\"%s\"]", pComputer.queryProp(XML_ATTR_NAME));
  2789. IPropertyTree* pComputerNode = pEnvRoot->queryPropTree(xpath.str());
  2790. xpath.clear().appendf("Instance[@netAddress=\"%s\"]", pComputerNode->queryProp(XML_ATTR_NETADDRESS));
  2791. if (pCompTree->queryPropTree(xpath.str()))
  2792. {
  2793. dups.appendf("\n%s", pComputerNode->queryProp(XML_ATTR_NETADDRESS));
  2794. continue;
  2795. }
  2796. IPropertyTree* pNode = pCompTree->addPropTree(XML_TAG_INSTANCE, createPTree());
  2797. if (pSchema)
  2798. {
  2799. Owned<IPropertyTreeIterator> iter = pSchema->getElements("xs:element/xs:complexType/xs:sequence/xs:element[@name=\"Instance\"]/xs:complexType/xs:attribute");
  2800. ForEach(*iter)
  2801. {
  2802. IPropertyTree &attr = iter->query();
  2803. StringBuffer attrName("@");
  2804. attrName.append(attr.queryProp(XML_ATTR_NAME));
  2805. // we try to pull @computer and @netAddress from computerNode. Others come from default values in schema (if supplied)
  2806. const char *szAttrib;
  2807. StringBuffer sb;
  2808. if (!strcmp(attrName.str(), XML_ATTR_COMPUTER))
  2809. {
  2810. szAttrib = pComputerNode->queryProp(XML_ATTR_NAME);
  2811. if (!bAdded)
  2812. {
  2813. bAdded = true;
  2814. resp.append(szAttrib);
  2815. }
  2816. }
  2817. else if (!strcmp(attrName.str(), XML_ATTR_NETADDRESS))
  2818. szAttrib = pComputerNode->queryProp(XML_ATTR_NETADDRESS);
  2819. else if (!strcmp(attrName.str(), XML_ATTR_DIRECTORY))
  2820. {
  2821. StringBuffer rundir;
  2822. if (!getConfigurationDirectory(pEnvRoot->queryPropTree("Software/Directories"), "run", processName, compName, rundir))
  2823. sb.clear().appendf(RUNTIME_DIR"/%s", compName);
  2824. else
  2825. sb.clear().append(rundir);
  2826. szAttrib = sb.str();
  2827. }
  2828. else
  2829. szAttrib = attr.queryProp("@default");
  2830. pNode->addProp(attrName.str(), szAttrib);
  2831. }
  2832. }
  2833. }
  2834. int nCount = 1;
  2835. xpath.clear().appendf("Instance");
  2836. Owned<IPropertyTreeIterator> iter = pCompTree->getElements(xpath.str());
  2837. StringBuffer sName;
  2838. ForEach(*iter)
  2839. {
  2840. sName.clear().append("s").append(nCount);
  2841. iter->query().setProp(XML_ATTR_NAME, sName.str());
  2842. nCount++;
  2843. }
  2844. }
  2845. void formIPList(const char* ip, StringArray& formattedIpList)
  2846. {
  2847. StringBuffer ipList(ip);
  2848. if(ipList.length())
  2849. {
  2850. ipList.replace('\n',';');
  2851. if(ipList.charAt(ipList.length()-1) == ';')
  2852. ipList.setCharAt((ipList.length()-1),' ');
  2853. StringArray sArray;
  2854. sArray.appendList(ipList, ";");
  2855. if(sArray.ordinality() > 0 )
  2856. {
  2857. for( unsigned i = 0; i < sArray.ordinality() ; i++)
  2858. {
  2859. const char* ip = sArray.item(i);
  2860. if(ip && *ip)
  2861. {
  2862. if( strchr(ip, '-') != 0 )
  2863. {
  2864. StringArray rangeArr, commIPPart ;
  2865. StringBuffer comip;
  2866. rangeArr.appendList(ip, "-");
  2867. if( rangeArr.ordinality() == 2 )
  2868. {
  2869. unsigned endAddr = atoi(rangeArr.item(1));
  2870. //to get common part of IP
  2871. commIPPart.appendList(rangeArr.item(0),".");
  2872. StringBuffer newip;
  2873. if(commIPPart.ordinality() == 4)
  2874. {
  2875. unsigned startAddr = atoi(commIPPart.item(3));
  2876. comip.clear().append(commIPPart.item(0)).append(".").append(commIPPart.item(1)).append(".").append(commIPPart.item(2)).append(".");
  2877. if( startAddr > endAddr)
  2878. startAddr^=endAddr^=startAddr^=endAddr;
  2879. while(startAddr <= endAddr)
  2880. {
  2881. newip.clear().append(comip).append(startAddr);
  2882. startAddr++;
  2883. formattedIpList.appendUniq(newip);
  2884. }
  2885. }
  2886. }
  2887. }
  2888. else
  2889. {
  2890. formattedIpList.appendUniq(ip);
  2891. }
  2892. }
  2893. }
  2894. }
  2895. }
  2896. else
  2897. throw MakeStringException(-1, "List of IP Addresses cannot be empty");
  2898. }
  2899. void buildEnvFromWizard(const char * wizardXml, const char* service,IPropertyTree* cfg, StringBuffer& envXml, MapStringTo<StringBuffer>* dirMap)
  2900. {
  2901. if(wizardXml && *wizardXml)
  2902. {
  2903. CWizardInputs wizardInputs(wizardXml, service, cfg, dirMap);
  2904. wizardInputs.setEnvironment();
  2905. wizardInputs.generateEnvironment(envXml);
  2906. if(envXml.length() == 0)
  2907. throw MakeStringException(-1, "Failed to generated the environment xml for unknown reason");
  2908. }
  2909. else
  2910. throw MakeStringException(-1, "User inputs are needed to generate the environment");
  2911. }
  2912. void runScript(StringBuffer& output, StringBuffer& errMsg, const char* pathToScript)
  2913. {
  2914. StringBuffer cmdLine;
  2915. if(checkFileExists(pathToScript))
  2916. {
  2917. char buffer[128];
  2918. cmdLine.clear().append(pathToScript);
  2919. #ifdef _WINDOWS
  2920. FILE *fp = _popen(cmdLine.str(), "r");
  2921. #else
  2922. FILE *fp = popen(cmdLine.str(), "r");
  2923. #endif
  2924. if(fp != NULL)
  2925. {
  2926. while ( !feof(fp) )
  2927. {
  2928. if( fgets(buffer, 128, fp))
  2929. {
  2930. output.append(buffer);
  2931. }
  2932. }
  2933. if(ferror(fp))
  2934. errMsg.clear().append("Some file operation error");
  2935. #ifdef _WINDOWS
  2936. _pclose(fp);
  2937. #else
  2938. pclose(fp);
  2939. #endif
  2940. if( output.length() == 0)
  2941. errMsg.clear().append("No IPAddresses found for environment.");
  2942. }
  2943. else
  2944. errMsg.clear().append("Could not open or run autodiscovery script ").append(pathToScript);
  2945. }
  2946. else
  2947. throw MakeStringException(-1,"The Script [%s] for getting IP addresses for environment does not exist", pathToScript);
  2948. }
  2949. bool validateIPS(const char* ipAddressList)
  2950. {
  2951. StringArray ipFormatted ;
  2952. formIPList(ipAddressList,ipFormatted);
  2953. if(ipFormatted.ordinality() > 0)
  2954. {
  2955. for (unsigned i = 0; i < ipFormatted.ordinality(); i++)
  2956. {
  2957. const char* ip = ipFormatted.item(i);
  2958. unsigned x ;
  2959. IpAddress ipaddr(ip);
  2960. ipaddr.getNetAddress(sizeof(x), &x);
  2961. if ( ipaddr.isNull())
  2962. throw MakeStringException(-1, "Invalid ip address: %s", ip);
  2963. }
  2964. }
  2965. else
  2966. throw MakeStringException(-1, "List for IP Addresses cannot be empty");
  2967. return true;
  2968. }
  2969. void getSummary(const IPropertyTree* pEnvRoot, StringBuffer& respXmlStr, bool prepareLink)
  2970. {
  2971. if(pEnvRoot)
  2972. {
  2973. StringBuffer xpath, compName, ipAssigned, computerName, linkString, buildSetName;
  2974. Owned<IPropertyTree> pSummaryTree = createPTree("ComponentList");
  2975. IPropertyTree* pSWCompTree = pEnvRoot->queryPropTree(XML_TAG_SOFTWARE);
  2976. if(pSWCompTree)
  2977. {
  2978. Owned<IPropertyTreeIterator> swCompIter = pSWCompTree->getElements("*");
  2979. StringArray espServiceArr;
  2980. ForEach(*swCompIter)
  2981. {
  2982. bool instanceFound = false;
  2983. IPropertyTree* pCompTree = &swCompIter->query();
  2984. if(pCompTree)
  2985. {
  2986. ipAssigned.clear();
  2987. compName.clear().append(pCompTree->queryProp(XML_ATTR_NAME));
  2988. buildSetName.clear().append(pCompTree->queryProp(XML_ATTR_BUILDSET));
  2989. xpath.clear().append("./Instance");
  2990. Owned<IPropertyTreeIterator> instanceIter = pCompTree->getElements(xpath.str());
  2991. ForEach(*instanceIter)
  2992. {
  2993. instanceFound = true;
  2994. IPropertyTree* pInstance = &instanceIter->query();
  2995. if(pInstance)
  2996. {
  2997. const char* netAddr = pInstance->queryProp(XML_ATTR_NETADDRESS);
  2998. if(netAddr && *netAddr)
  2999. {
  3000. ipAssigned.append(netAddr);
  3001. ipAssigned.append(",");
  3002. }
  3003. }
  3004. }
  3005. if(!strcmp(pCompTree->queryName(), XML_TAG_ESPPROCESS))
  3006. {
  3007. if(ipAssigned.length())
  3008. {
  3009. Owned<IPropertyTreeIterator> espSerIter = pCompTree->getElements("./"XML_TAG_ESPBINDING);
  3010. ForEach(*espSerIter)
  3011. {
  3012. IPropertyTree* pEspBinding = &espSerIter->query();
  3013. const char* serviceName = pEspBinding->queryProp(XML_ATTR_SERVICE);
  3014. const char* port = pEspBinding->queryProp(XML_ATTR_PORT);
  3015. const char* protocol = pEspBinding->queryProp(XML_ATTR_PROTOCOL);
  3016. const char* buildset = NULL;
  3017. xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, XML_TAG_ESPSERVICE, XML_ATTR_NAME, serviceName);
  3018. IPropertyTree* pEspService = pEnvRoot->queryPropTree(xpath.str());
  3019. if(pEspService)
  3020. buildset = pEspService->queryProp(XML_ATTR_BUILDSET);
  3021. if(serviceName && *serviceName && port && *port)
  3022. {
  3023. if(ipAssigned.length() && ipAssigned.charAt(ipAssigned.length()-1) == ',')
  3024. ipAssigned.setCharAt((ipAssigned.length()-1),' ');
  3025. linkString.clear().appendf("%s-%s-", serviceName, (( buildset && *buildset ) ? buildset: ""));
  3026. if(prepareLink)
  3027. linkString.appendf("<a href=\"%s://%s:%s\"/>%s://%s:%s</a>", ( (protocol && *protocol) ? protocol :"http" ), (ipAssigned.trim()).str(), port, ( (protocol && *protocol) ? protocol :"http" ), (ipAssigned.trim()).str(), port );
  3028. else
  3029. linkString.appendf("%s", port);
  3030. espServiceArr.append(linkString);
  3031. }
  3032. }
  3033. }
  3034. }
  3035. if(!instanceFound && (strcmp(pCompTree->queryName(), XML_TAG_ROXIECLUSTER) != 0 && strcmp(pCompTree->queryName(), XML_TAG_THORCLUSTER) != 0))
  3036. {
  3037. if(pCompTree->hasProp(XML_ATTR_COMPUTER))
  3038. {
  3039. xpath.clear().appendf("./Hardware/%s/[%s=\"%s\"]", XML_TAG_COMPUTER, XML_ATTR_NAME, pCompTree->queryProp(XML_ATTR_COMPUTER));
  3040. IPropertyTree* pHardware = pEnvRoot->queryPropTree(xpath.str());
  3041. if(pHardware)
  3042. ipAssigned.clear().append(pHardware->queryProp(XML_ATTR_NETADDRESS));
  3043. }
  3044. }
  3045. else if(!strcmp(pCompTree->queryName(), XML_TAG_ROXIECLUSTER))
  3046. {
  3047. IPropertyTree* pCluster = pEnvRoot->queryPropTree("./Software/RoxieCluster");
  3048. if(pCluster)
  3049. {
  3050. compName.clear().append(pCluster->queryProp("@name"));
  3051. xpath.clear().append("./RoxieServerProcess");
  3052. Owned<IPropertyTreeIterator> serverIter = pCluster->getElements(xpath.str());
  3053. ForEach(*serverIter)
  3054. {
  3055. IPropertyTree* pServer = &serverIter->query();
  3056. const char* netAddr = pServer->queryProp(XML_ATTR_NETADDRESS);
  3057. if(netAddr && *netAddr)
  3058. {
  3059. ipAssigned.append(netAddr).append(",");
  3060. }
  3061. }
  3062. }
  3063. }
  3064. else if(!strcmp(pCompTree->queryName(), XML_TAG_THORCLUSTER))
  3065. {
  3066. IPropertyTree* pCluster = pEnvRoot->queryPropTree("./Software/ThorCluster");
  3067. if(pCluster)
  3068. {
  3069. compName.clear().append(pCluster->queryProp("@name"));
  3070. IPropertyTree* pMaster = pCluster->queryPropTree("./ThorMasterProcess");
  3071. if(pMaster)
  3072. {
  3073. computerName.clear().append(pMaster->queryProp(XML_ATTR_COMPUTER));
  3074. if(computerName.length())
  3075. {
  3076. xpath.clear().appendf("./Hardware/%s/[%s=\"%s\"]", XML_TAG_COMPUTER, XML_ATTR_NAME, computerName.str());
  3077. IPropertyTree* pHardware = pEnvRoot->queryPropTree(xpath.str());
  3078. if(pHardware)
  3079. ipAssigned.clear().append(pHardware->queryProp(XML_ATTR_NETADDRESS)).append(",");
  3080. }
  3081. }
  3082. Owned<IPropertyTreeIterator> serverIter = pCluster->getElements("./ThorSlaveProcess");
  3083. ForEach(*serverIter)
  3084. {
  3085. IPropertyTree* pServer = &serverIter->query();
  3086. computerName.clear().append(pServer->queryProp(XML_ATTR_COMPUTER));
  3087. if(computerName.length())
  3088. {
  3089. xpath.clear().appendf("./Hardware/%s/[%s=\"%s\"]", XML_TAG_COMPUTER, XML_ATTR_NAME, computerName.str());
  3090. IPropertyTree* pHardware = pEnvRoot->queryPropTree(xpath.str());
  3091. if(pHardware)
  3092. ipAssigned.append(pHardware->queryProp(XML_ATTR_NETADDRESS)).append(",");
  3093. }
  3094. }
  3095. }
  3096. }
  3097. if(ipAssigned.length() && ipAssigned.charAt(ipAssigned.length()-1) == ',')
  3098. ipAssigned.setCharAt((ipAssigned.length()-1),' ');
  3099. if(ipAssigned.length() && compName.length())
  3100. {
  3101. IPropertyTree* pComponentType = pSummaryTree->addPropTree("Component", createPTree("Component"));
  3102. pComponentType->addProp("@name", compName.str());
  3103. pComponentType->addProp("@netaddresses", ipAssigned.str());
  3104. pComponentType->addProp("@buildset", ( buildSetName.length() ? buildSetName.str(): ""));
  3105. pComponentType->addProp("@espservice", "false");
  3106. }
  3107. }
  3108. }
  3109. if(espServiceArr.length() > 0)
  3110. {
  3111. ForEachItemIn(x, espServiceArr)
  3112. {
  3113. linkString.clear().append(espServiceArr.item(x));
  3114. StringArray sArray;
  3115. sArray.appendList(linkString.str(), "-");
  3116. if(sArray.ordinality() == 3)
  3117. {
  3118. IPropertyTree* pEspServiceType = pSummaryTree->addPropTree("Component", createPTree("Component"));
  3119. pEspServiceType->addProp("@name", sArray.item(0));
  3120. pEspServiceType->addProp("@buildset", sArray.item(1));
  3121. pEspServiceType->addProp("@netaddresses", sArray.item(2));
  3122. pEspServiceType->addProp("@espservice", "true");
  3123. }
  3124. }
  3125. }
  3126. }
  3127. if(pSummaryTree)
  3128. toXML(pSummaryTree,respXmlStr);
  3129. }
  3130. else
  3131. throw MakeStringException(-1, "Environment does not have any configuration information");
  3132. }
  3133. void mergeAttributes(IPropertyTree* pTo, IPropertyTree* pFrom)
  3134. {
  3135. if (!pFrom)
  3136. return;
  3137. Owned<IAttributeIterator> iAttr = pFrom->getAttributes();
  3138. ForEach(*iAttr)
  3139. {
  3140. const char* attrName = iAttr->queryName();
  3141. if (!pTo->hasProp(attrName))
  3142. pTo->addProp(attrName, iAttr->queryValue());
  3143. }
  3144. }
  3145. void addEspBindingInformation(const char* xmlArg, IPropertyTree* pEnvRoot, StringBuffer& sbNewName, IConstEnvironment* pEnvironment,
  3146. const IPropertyTree* pCfg, const char* serviceName)
  3147. {
  3148. Owned<IPropertyTree> pBindings = createPTreeFromXMLString(xmlArg && *xmlArg ? xmlArg : "<EspServiceBindings/>");
  3149. const char* type = pBindings->queryProp(XML_ATTR_TYPE);
  3150. const char* espName = pBindings->queryProp("@compName");
  3151. StringBuffer xpath;
  3152. xpath.append("./Programs/Build/BuildSet[@processName=\"EspProcess\"]");
  3153. Owned<IPropertyTreeIterator> buildSetIter = pEnvRoot->getElements(xpath.str());
  3154. buildSetIter->first();
  3155. IPropertyTree* pBuildSet = &buildSetIter->query();
  3156. const char* buildSetName = pBuildSet->queryProp(XML_ATTR_NAME);
  3157. const char* processName = pBuildSet->queryProp(XML_ATTR_PROCESS_NAME);
  3158. StringBuffer buildSetPath;
  3159. Owned<IPropertyTree> pSchema = loadSchema(pEnvRoot->queryPropTree("./Programs/Build[1]"), pBuildSet, buildSetPath, pEnvironment);
  3160. xpath.clear().appendf("./Software/%s[@name='%s']", processName, espName);
  3161. Owned<IPropertyTreeIterator> iterItems = pBindings->getElements("Item");
  3162. bool flag = false;
  3163. ForEach (*iterItems)
  3164. {
  3165. flag = true;
  3166. IPropertyTree* pItem = &iterItems->query();
  3167. const char* bindingName = pItem->queryProp(XML_ATTR_NAME);
  3168. const char* params = pItem->queryProp("@params");
  3169. StringBuffer decodedParams(params);
  3170. decodedParams.replaceString("::", "\n");
  3171. Owned<IProperties> pParams = createProperties();
  3172. pParams->loadProps(decodedParams.str());
  3173. const char* pszCompType = pParams->queryProp("pcType");
  3174. const char* pszCompName = pParams->queryProp("pcName");
  3175. const char* pszSubType = pParams->queryProp("subType");
  3176. const char* pszSubTypeKey = pParams->queryProp("subTypeKey");
  3177. if (strcmp(type, XML_TAG_ESPBINDING) && bindingName)
  3178. xpath.appendf("/EspBinding[@name='%s']", bindingName);
  3179. else if (pszSubType && *pszSubType)
  3180. {
  3181. String subType(pszSubType);
  3182. int idx = subType.lastIndexOf('/');
  3183. if (idx > 0)
  3184. {
  3185. String* tmpstr = subType.substring(0, idx);
  3186. xpath.append("/").append(*tmpstr);
  3187. delete tmpstr;
  3188. }
  3189. }
  3190. IPropertyTree* pEspService = pEnvRoot->queryPropTree(xpath.str());
  3191. IPropertyTree* pCompTree = generateTreeFromXsd(pEnvRoot, pSchema, processName, buildSetName, pCfg, serviceName);
  3192. StringBuffer sb(type);
  3193. if (!strncmp(sb.str(), "_", 1))
  3194. sb.remove(0, 1);
  3195. if (!strcmp(type, XML_TAG_ESPBINDING))
  3196. {
  3197. StringBuffer sbNewName(XML_TAG_ESPBINDING);
  3198. xpath.clear().appendf("%s[@name='%s']/EspBinding", processName, espName);
  3199. getUniqueName(pEnvRoot, sbNewName, xpath.str(), XML_TAG_SOFTWARE);
  3200. xpath.clear().append(sb.str()).append("/").append(XML_ATTR_NAME);
  3201. pCompTree->setProp(xpath.str(), sbNewName);
  3202. }
  3203. if (pEspService && pCompTree)
  3204. pEspService->addPropTree(sb.str(), pCompTree->queryPropTree(sb.str()));
  3205. //If we are adding, just consider the first selection.
  3206. break;
  3207. }
  3208. if (!flag)
  3209. {
  3210. IPropertyTree* pEspService = pEnvRoot->queryPropTree(xpath.str());
  3211. IPropertyTree* pCompTree = generateTreeFromXsd(pEnvRoot, pSchema, processName, buildSetName, pCfg, serviceName);
  3212. StringBuffer sbNewName(XML_TAG_ESPBINDING);
  3213. xpath.clear().appendf("%s[@name='%s']/EspBinding", processName, espName);
  3214. getUniqueName(pEnvRoot, sbNewName, xpath.str(), XML_TAG_SOFTWARE);
  3215. xpath.clear().append(XML_TAG_ESPBINDING).append("/").append(XML_ATTR_NAME);
  3216. pCompTree->setProp(xpath.str(), sbNewName);
  3217. if (pEspService && pCompTree)
  3218. pEspService->addPropTree(XML_TAG_ESPBINDING, pCompTree->queryPropTree(XML_TAG_ESPBINDING));
  3219. }
  3220. }
  3221. bool updateDirsWithConfSettings(IPropertyTree* pEnvRoot, IProperties* pParams, bool ovrLog, bool ovrRun)
  3222. {
  3223. bool ret = false;
  3224. const char* rundir = pEnvRoot->queryProp("Software/Directories/Category[@name='run']/@dir");
  3225. StringBuffer sbdir;
  3226. if (rundir && ovrRun)
  3227. {
  3228. sbdir.clear().append(rundir);
  3229. sbdir.replaceString("[NAME]", pParams->queryProp("blockname"));
  3230. String str(sbdir.str());
  3231. if (!str.startsWith(pParams->queryProp("runtime")))
  3232. {
  3233. StringBuffer sb;
  3234. if (str.indexOf('[') > 0)
  3235. sb.append(pParams->queryProp("runtime")).append(PATHSEPCHAR).append(sbdir.str() + str.indexOf('['));
  3236. else
  3237. sb.append(str.toCharArray());
  3238. pEnvRoot->setProp("Software/Directories/Category[@name='run']/@dir", sb.str());
  3239. ret = true;
  3240. }
  3241. }
  3242. const char* logdir = pEnvRoot->queryProp("Software/Directories/Category[@name='log']/@dir");
  3243. if (logdir && ovrLog)
  3244. {
  3245. sbdir.clear().append(logdir);
  3246. sbdir.replaceString("[NAME]", pParams->queryProp("blockname"));
  3247. String str(sbdir.str());
  3248. if (!str.startsWith(pParams->queryProp("log")))
  3249. {
  3250. StringBuffer sb;
  3251. if (str.indexOf('[') > 0)
  3252. sb.append(pParams->queryProp("log")).append(PATHSEPCHAR).append(sbdir.str() + str.indexOf('['));
  3253. else
  3254. sb.append(str.toCharArray());
  3255. pEnvRoot->setProp("Software/Directories/Category[@name='log']/@dir", sb.str());
  3256. ret = true;
  3257. }
  3258. }
  3259. return ret;
  3260. }
  3261. //returns temp path that ends with path sep
  3262. //
  3263. #ifdef _WIN32
  3264. extern DWORD getLastError() { return ::GetLastError(); }
  3265. void getTempPath(char* tempPath, unsigned int bufsize, const char* subdir/*=NULL*/)
  3266. {
  3267. ::GetTempPath(bufsize, tempPath);
  3268. ::GetLongPathName(tempPath, tempPath, bufsize);
  3269. if (subdir && *subdir)
  3270. {
  3271. const int len = strlen(tempPath);
  3272. char* p = tempPath + len;
  3273. strcpy(p, subdir);
  3274. p += strlen(subdir);
  3275. *p++ = '\\';
  3276. *p = '\0';
  3277. }
  3278. }
  3279. #else//Linux specifics follow
  3280. extern DWORD getLastError() { return errno; }
  3281. void getTempPath(char* tempPath, unsigned int bufsize, const char* subdir/*=NULL*/)
  3282. {
  3283. assert(bufsize > 5);
  3284. strcpy(tempPath, "/tmp/");
  3285. if (subdir && *subdir)
  3286. {
  3287. strcat(tempPath, subdir);
  3288. strcat(tempPath, "/");
  3289. }
  3290. }
  3291. #endif
  3292. bool validateEnv(IConstEnvironment* pConstEnv, bool abortOnException)
  3293. {
  3294. char tempdir[_MAX_PATH];
  3295. StringBuffer sb;
  3296. while(true)
  3297. {
  3298. sb.clear().appendf("%d", msTick());
  3299. getTempPath(tempdir, sizeof(tempdir), sb.str());
  3300. if (!checkDirExists(tempdir))
  3301. {
  3302. if (recursiveCreateDirectory(tempdir))
  3303. break;
  3304. }
  3305. }
  3306. try
  3307. {
  3308. CConfigEngCallback callback(false, abortOnException);
  3309. Owned<IEnvDeploymentEngine> configGenMgr;
  3310. Owned<IPropertyTree> pEnvRoot = &pConstEnv->getPTree();
  3311. const char* inDir = pEnvRoot->queryProp(XML_TAG_ENVSETTINGS"/path");
  3312. StringBuffer sb(inDir);
  3313. sb.append("/componentfiles/configxml");
  3314. configGenMgr.setown(createConfigGenMgr(*pConstEnv, callback, NULL, inDir?sb.str():STANDARD_CONFIGXMLDIR, tempdir, NULL, NULL, NULL));
  3315. configGenMgr->deploy(DEFLAGS_CONFIGFILES, DEBACKUP_NONE, false, false);
  3316. deleteRecursive(tempdir);
  3317. const char* msg = callback.getErrorMsg();
  3318. if (msg && *msg)
  3319. {
  3320. StringBuffer sb("Errors or warnings were found when validating the environment.\n\n");
  3321. sb.append(msg).append("\n");
  3322. sb.appendf("Total errors/warnings: %d", callback.getErrorCount() - 1);
  3323. throw MakeStringExceptionDirect(-1, sb.str());
  3324. }
  3325. }
  3326. catch(IException* e)
  3327. {
  3328. deleteRecursive(tempdir);
  3329. throw e;
  3330. }
  3331. return true;
  3332. }