deployutils.cpp 144 KB

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