deployutils.cpp 141 KB

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