deployutils.cpp 142 KB

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