deployutils.cpp 137 KB

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