AtmiBrokerEnvXml.cxx
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:24k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include <sys/stat.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <iostream>
  22. #include <stdexcept>
  23. #include "expat.h"
  24. #include "AtmiBrokerEnv.h"
  25. #include "AtmiBrokerEnvXml.h"
  26. #include "XsdValidator.h"
  27. #include "log4cxx/logger.h"
  28. #include "ace/ACE.h"
  29. #include "ace/OS_NS_stdlib.h"
  30. #include "ace/OS_NS_stdio.h"
  31. #include "ace/OS_NS_string.h"
  32. #include "ace/Default_Constants.h"
  33. log4cxx::LoggerPtr loggerAtmiBrokerEnvXml(log4cxx::Logger::getLogger(
  34. "AtmiBrokerEnvXml"));
  35. xarm_config_t * xarmp = 0;
  36. ServersInfo servers;
  37. ServiceInfo service;
  38. Buffers buffers;
  39. OrbConfig orbConfig;
  40. MqConfig mqConfig;
  41. char domain[30];
  42. char* queue_name;
  43. char* transFactoryId;
  44. static char last_element[50];
  45. static char last_value[1024];
  46. static char element[50];
  47. static char value[1024];
  48. static int depth = 0;
  49. static int envVariableCount = 0;
  50. static bool processingXaResource = false;
  51. static bool processingEnvVariable = false;
  52. static char* configuration = NULL;
  53. static char* currentBufferName = NULL;
  54. static int MEM_CHAR_SIZE = sizeof(char);//1;
  55. static int MEM_LONG_SIZE = sizeof(long);//8;
  56. static int MEM_INT_SIZE = sizeof(int);//4;
  57. static int MEM_SHORT_SIZE = sizeof(short);//2;
  58. static int MEM_FLOAT_SIZE = sizeof(float);//INT_SIZE;
  59. static int MEM_DOUBLE_SIZE = sizeof(double);//LONG_SIZE;
  60. static int WIRE_CHAR_SIZE = 1;
  61. static int WIRE_LONG_SIZE = 8;
  62. static int WIRE_INT_SIZE = 4;
  63. static int WIRE_SHORT_SIZE = 2;
  64. static int WIRE_FLOAT_SIZE = 4;
  65. static int WIRE_DOUBLE_SIZE = 8;
  66. AtmiBrokerEnvXml::AtmiBrokerEnvXml() {
  67. depth = 0;
  68. envVariableCount = 0;
  69. processingXaResource = false;
  70. processingEnvVariable = false;
  71. currentBufferName = NULL;
  72. configuration = NULL;
  73. }
  74. AtmiBrokerEnvXml::~AtmiBrokerEnvXml() {
  75. }
  76. static int warnCnt = 0;
  77. static void warn(const char * reason) {
  78. if (warnCnt++ == 0)
  79. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) reason);
  80. }
  81. /**
  82.  * Duplicate a value. If the value contains an expression of the for ${ENV}
  83.  * then ENV is interpreted as an environment variable and ${ENV} is replaced
  84.  * by its value (if ENV is not set it is replaced by null string).
  85.  *
  86.  * WARNING: only the first such occurence is expanded. TODO generalise the function
  87.  */
  88. static char * XMLCALL copy_value(const char *value) {
  89. char *s = (char *) strchr(value, '$');
  90. char *e;
  91. if (s && *(s + 1) == '{' && (e = (char *) strchr(s, '}'))) {
  92. size_t esz = e - s - 2;
  93. char *en = ACE::strndup(s + 2, esz);
  94. char *ev = ACE_OS::getenv(en); /* ACE_OS::getenv(en);*/
  95. char *pr = ACE::strndup(value, (s - value));
  96. size_t rsz;
  97. char *v;
  98. if (ev == NULL) {
  99. LOG4CXX_WARN(loggerAtmiBrokerEnvXml, (char*) "env variable is unset: " << en);
  100. ev = (char *) "";
  101. }
  102. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char *) "expanding env: "
  103. << (s + 2) << (char *) " and e=" << e << (char *) " and en="
  104. << en << (char *) " and pr=" << pr << (char *) " and ev=" << ev);
  105. e += 1;
  106. rsz = ACE_OS::strlen(pr) + ACE_OS::strlen(e) + ACE_OS::strlen(ev) + 1; /* add 1 for null terminator */
  107. v = (char *) malloc(rsz);
  108. ACE_OS::snprintf(v, rsz, "%s%s%s", pr, ev, e);
  109. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, value << (char*) " -> " << v);
  110. free(en);
  111. free(pr);
  112. return v;
  113. }
  114. return strdup(value);
  115. }
  116. static bool applicable_config(char *config, const char *attribute) {
  117. if (config == NULL || ACE_OS::strlen(config) == 0) {
  118. // see if it is set in the environment
  119. if ((config = ACE_OS::getenv("BLACKTIE_CONFIGURATION")) == 0)
  120. return false;
  121. }
  122. char * conf = copy_value(attribute);
  123. bool rtn = strcmp(conf, config);
  124. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "comparing " << conf
  125. << " with " << config);
  126. free(conf);
  127. return (rtn == 0);
  128. }
  129. static bool checkService(char* serverName, const char* serviceName) {
  130. for(unsigned int i = 0; i < servers.size(); i ++) {
  131. if(ACE_OS::strcmp(serverName, servers[i]->serverName) != 0) {
  132. for(unsigned int j = 0; j < servers[i]->serviceVector.size(); j ++) {
  133. if(ACE_OS::strcmp(serviceName, servers[i]->serviceVector[j].serviceName) == 0)
  134. return true;
  135. }
  136. }
  137. }
  138. return false;
  139. }
  140. static void XMLCALL startElement
  141. (void *userData, const char *name, const char **atts) {
  142. std::vector<envVar_t>* aEnvironmentStructPtr = (std::vector<envVar_t>*) userData;
  143. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "processing element " << name);
  144. if (strcmp(name, "ENVIRONMENT xmnls") == 0 || strcmp(name, "ENVIRONMENT") == 0) {
  145. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "starting to read");
  146. } else if (strcmp(name, "ORB") == 0) {
  147. for(int i = 0; atts[i]; i += 2) {
  148. if(strcmp(atts[i], "OPT") == 0) {
  149. orbConfig.opt = copy_value(atts[i+1]);
  150. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "set opt: " << orbConfig.opt);
  151. } else if(strcmp(atts[i], "TRANS_FACTORY_ID") == 0) {
  152. orbConfig.transactionFactoryName = copy_value(atts[i+1]);
  153. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "set tFN: " << orbConfig.transactionFactoryName);
  154. }
  155. }
  156. } else if (strcmp(name, "MQ") == 0) {
  157. for(int i = 0; atts[i]; i += 2) {
  158. if(strcmp(atts[i], "HOST") == 0) {
  159. mqConfig.host = copy_value(atts[i+1]);
  160. } else if(strcmp(atts[i], "PORT") == 0) {
  161. mqConfig.port = atoi(atts[i+1]);
  162. } else if(strcmp(atts[i], "USER") == 0) {
  163. mqConfig.user = copy_value(atts[i+1]);
  164. } else if(strcmp(atts[i], "PASSWORD") == 0) {
  165. mqConfig.pwd = copy_value(atts[i+1]);
  166. } else if(strcmp(atts[i], "DESTINATION_TIMEOUT") == 0) {
  167. mqConfig.destinationTimeout = atoi(atts[i+1]);
  168. } else if(strcmp(atts[i], "RECEIVE_TIMEOUT") == 0) {
  169. mqConfig.requestTimeout = atoi(atts[i+1]);
  170. } else if(strcmp(atts[i], "TIME_TO_LIVE") == 0) {
  171. mqConfig.timeToLive = atoi(atts[i+1]);
  172. }
  173. }
  174. } else if (strcmp(name, "SERVER") == 0) {
  175. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "processing SERVER");
  176. ServerInfo* server = new ServerInfo;
  177. if(atts != 0) {
  178. if(atts[0] && strcmp(atts[0], "name") == 0) {
  179. server->serverName = copy_value(atts[1]);
  180. } else {
  181. server->serverName = copy_value("default");
  182. }
  183. }
  184. servers.push_back(server);
  185. } else if (strcmp(name, "XA_RESOURCE") == 0) {
  186. if(strcmp(atts[0], "configuration") == 0 && applicable_config(configuration, atts[1])) {
  187. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "processing xaresource");
  188. processingXaResource = true;
  189. xarm_config_t *p;
  190. if ((p = (xarm_config_t *) malloc(sizeof(xarm_config_t))) == 0) {
  191. warnCnt = 0;
  192. warn("out of memory");
  193. } else {
  194. (void *) memset(p, 0, sizeof(xarm_config_t));
  195. if (xarmp == 0) {
  196. p->head = p;
  197. } else {
  198. xarmp->next = p;
  199. p->head = xarmp->head;
  200. }
  201. xarmp = p;
  202. }
  203. } else {
  204. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "CONFIGURATION NOT APPLICABLE FOR XA_RESOURCE: " << atts[1]);
  205. }
  206. } else if (strcmp(name, "ENV_VARIABLE") == 0) {
  207. if(atts != 0 && atts[0] && strcmp(atts[0], "configuration") == 0) {
  208. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "comparing" << atts[1] << " with " << configuration);
  209. if (strcmp(atts[1], configuration) == 0) {
  210. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "processing ENV_VARIABLE");
  211. processingEnvVariable = true;
  212. } else {
  213. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "CONFIGURATION NOT APPLICABLE FOR ENV_VARIABLE: " << atts[1]);
  214. }
  215. } else {
  216. processingEnvVariable = true;
  217. }
  218. if (processingEnvVariable) {
  219. envVariableCount++;
  220. envVar_t envVar;
  221. (*aEnvironmentStructPtr).push_back(envVar);
  222. }
  223. } else if (strcmp(name, "BUFFER") == 0) {
  224. char * bufferName = copy_value(atts[1]);
  225. Buffer* buffer = buffers[bufferName];
  226. if (buffer == NULL) {
  227. currentBufferName = bufferName;
  228. Buffer* buffer = new Buffer();
  229. buffer->name = currentBufferName;
  230. buffer->wireSize = 0;
  231. buffer->memSize = 0;
  232. buffer->lastPad = 0;
  233. buffers[buffer->name] = buffer;
  234. } else {
  235. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "Duplicate buffer detected: " << currentBufferName);
  236. free (bufferName);
  237. currentBufferName = NULL;
  238. }
  239. } else if (strcmp(name, "ATTRIBUTE") == 0) {
  240. if (currentBufferName != NULL) {
  241. Buffer* buffer = buffers[currentBufferName];
  242. Attribute* attribute = new Attribute();
  243. attribute->id = NULL;
  244. attribute->type = NULL;
  245. attribute->count = 0;
  246. attribute->length = 0;
  247. attribute->wirePosition = 0;
  248. attribute->memPosition = 0;
  249. for(int i = 0; atts[i]; i += 2) {
  250. if(strcmp(atts[i], "id") == 0) {
  251. attribute->id = copy_value(atts[i+1]);
  252. } else if(strcmp(atts[i], "type") == 0) {
  253. attribute->type = copy_value(atts[i+1]);
  254. } else if(strcmp(atts[i], "arrayCount") == 0) {
  255. attribute->count = atoi(atts[i+1]);
  256. } else if(strcmp(atts[i], "arrayLength") == 0) {
  257. attribute->length = atoi(atts[i+1]);
  258. }
  259. }
  260. int memTypeSize = -1;
  261. int wireTypeSize = -1;
  262. Attribute* toCheck = buffer->attributes[attribute->id];
  263. bool fail = false;
  264. bool isDbl = false;
  265. if (toCheck == NULL) {
  266. // short, int, long, float, double, char
  267. if (strcmp(attribute->type, "short") == 0) {
  268. memTypeSize = MEM_SHORT_SIZE;
  269. wireTypeSize = WIRE_SHORT_SIZE;
  270. attribute->memSize = memTypeSize;
  271. attribute->wireSize = wireTypeSize;
  272. } else if (strcmp(attribute->type, "int") == 0) {
  273. memTypeSize = MEM_INT_SIZE;
  274. wireTypeSize = WIRE_INT_SIZE;
  275. attribute->memSize = memTypeSize;
  276. attribute->wireSize = wireTypeSize;
  277. } else if (strcmp(attribute->type, "long") == 0) {
  278. memTypeSize = MEM_LONG_SIZE;
  279. wireTypeSize = WIRE_LONG_SIZE;
  280. attribute->memSize = memTypeSize;
  281. attribute->wireSize = wireTypeSize;
  282. } else if (strcmp(attribute->type, "float") == 0) {
  283. memTypeSize = MEM_FLOAT_SIZE;
  284. wireTypeSize = WIRE_FLOAT_SIZE;
  285. attribute->memSize = memTypeSize;
  286. attribute->wireSize = wireTypeSize;
  287. } else if (strcmp(attribute->type, "double") == 0) {
  288. isDbl = true;
  289. memTypeSize = MEM_DOUBLE_SIZE;
  290. wireTypeSize = WIRE_DOUBLE_SIZE;
  291. attribute->memSize = memTypeSize;
  292. attribute->wireSize = wireTypeSize;
  293. } else if (strcmp(attribute->type, "char") == 0) {
  294. memTypeSize = MEM_CHAR_SIZE;
  295. wireTypeSize = WIRE_CHAR_SIZE;
  296. attribute->memSize = memTypeSize;
  297. attribute->wireSize = wireTypeSize;
  298. } else if (strcmp(attribute->type, "char[]") == 0) {
  299. memTypeSize = MEM_CHAR_SIZE;
  300. wireTypeSize = WIRE_CHAR_SIZE;
  301. if (attribute->length == 0) {
  302. attribute->length = 1;
  303. }
  304. attribute->memSize = memTypeSize * attribute->length;
  305. attribute->wireSize = wireTypeSize * attribute->length;
  306. } else if (strcmp(attribute->type, "short[]") == 0) {
  307. memTypeSize = MEM_SHORT_SIZE;
  308. wireTypeSize = WIRE_SHORT_SIZE;
  309. if (attribute->length == 0) {
  310. attribute->length = 1;
  311. }
  312. attribute->memSize = memTypeSize * attribute->length;
  313. attribute->wireSize = wireTypeSize * attribute->length;
  314. } else if (strcmp(attribute->type, "int[]") == 0) {
  315. memTypeSize = MEM_INT_SIZE;
  316. wireTypeSize = WIRE_INT_SIZE;
  317. if (attribute->length == 0) {
  318. attribute->length = 1;
  319. }
  320. attribute->memSize = memTypeSize * attribute->length;
  321. attribute->wireSize = wireTypeSize * attribute->length;
  322. } else if (strcmp(attribute->type, "long[]") == 0) {
  323. memTypeSize = MEM_LONG_SIZE;
  324. wireTypeSize = WIRE_LONG_SIZE;
  325. if (attribute->length == 0) {
  326. attribute->length = 1;
  327. }
  328. attribute->memSize = memTypeSize * attribute->length;
  329. attribute->wireSize = wireTypeSize * attribute->length;
  330. } else if (strcmp(attribute->type, "float[]") == 0) {
  331. memTypeSize = MEM_FLOAT_SIZE;
  332. wireTypeSize = WIRE_FLOAT_SIZE;
  333. if (attribute->length == 0) {
  334. attribute->length = 1;
  335. }
  336. attribute->memSize = memTypeSize * attribute->length;
  337. attribute->wireSize = wireTypeSize * attribute->length;
  338. } else if (strcmp(attribute->type, "double[]") == 0) {
  339. isDbl = true;
  340. memTypeSize = MEM_DOUBLE_SIZE;
  341. wireTypeSize = WIRE_DOUBLE_SIZE;
  342. if (attribute->length == 0) {
  343. attribute->length = 1;
  344. }
  345. attribute->memSize = memTypeSize * attribute->length;
  346. attribute->wireSize = wireTypeSize * attribute->length;
  347. } else if (strcmp(attribute->type, "char[][]") == 0) {
  348. memTypeSize = MEM_CHAR_SIZE;
  349. wireTypeSize = WIRE_CHAR_SIZE;
  350. if (attribute->length == 0) {
  351. attribute->length = 1;
  352. }
  353. if (attribute->count == 0) {
  354. attribute->count = 1;
  355. }
  356. attribute->memSize = memTypeSize * attribute->length * attribute->count;
  357. attribute->wireSize = wireTypeSize * attribute->length * attribute->count;
  358. } else {
  359. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "Unknown attribute type: " << attribute->type);
  360. fail = true;
  361. }
  362. if (!fail) {
  363. buffer->attributes[attribute->id] = attribute;
  364. // doubles are aligned on a (long) word boundary
  365. #ifndef WIN32
  366. if (isDbl) {
  367. memTypeSize = MEM_LONG_SIZE;
  368. }
  369. #endif
  370. // Extend the buffer by the required extra buffer size
  371. if (buffer->lastPad < memTypeSize) {
  372. buffer->lastPad = memTypeSize;
  373. }
  374. // advance to then next alignment boundary
  375. buffer->memSize = buffer->memSize + (buffer->memSize % memTypeSize);
  376. attribute->memPosition = buffer->memSize;
  377. attribute->wirePosition = buffer->wireSize;
  378. buffer->wireSize = buffer->wireSize + attribute->wireSize;
  379. buffer->memSize = buffer->memSize + attribute->memSize;
  380. } else {
  381. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "Cleaning attribute: " << attribute->id);
  382. free(attribute->id);
  383. free(attribute->type);
  384. delete attribute;
  385. }
  386. } else {
  387. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "Duplicate attribute detected: " << attribute->id);
  388. free(attribute->id);
  389. free(attribute->type);
  390. delete attribute;
  391. }
  392. } else {
  393. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "No buffer is being processed");
  394. }
  395. } else if(strcmp(name, "SERVICE") == 0) {
  396. if(atts != 0) {
  397. char  adm[16];
  398. char* server;
  399. server = servers.back()->serverName;
  400. memset(&service, 0, sizeof(ServiceInfo));
  401. ACE_OS::strcpy(adm, "_ADMIN");
  402. service.transportLib = NULL;
  403. service.advertised = false;
  404. service.poolSize = 1;
  405. for(int i = 0; atts[i]; i += 2) {
  406. if(strcmp(atts[i], "name") == 0) {
  407. if(ACE_OS::strstr(atts[i+1], adm)) {
  408. LOG4CXX_WARN(loggerAtmiBrokerEnvXml, (char*) "Can not define " << atts[i+1]);
  409. throw std::exception();
  410. }
  411. if(checkService(server, atts[i+1])) {
  412. LOG4CXX_WARN(loggerAtmiBrokerEnvXml, (char*) "Can not define Same Service " << atts[i+1]);
  413. throw std::exception();
  414. }
  415. service.serviceName = copy_value(atts[i+1]);
  416. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "set name: " << service.serviceName);
  417. } else if(strcmp(atts[i], "function_name") == 0) {
  418. service.function_name = strdup(atts[i+1]);
  419. } else if(strcmp(atts[i], "advertised") == 0) {
  420. if(strcmp(atts[i+1], "true") == 0) {
  421. service.advertised = true;
  422. } else {
  423. service.advertised = false;
  424. }
  425. } else if (strcmp(atts[i], "size") == 0) {
  426. service.poolSize = (short) atol(atts[i+1]);
  427. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "storing size " << service.poolSize);
  428. }
  429. }
  430. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "setting transportlib");
  431. #ifdef WIN32
  432. service.transportLib = strdup("atmibroker-hybrid.dll");
  433. #else
  434. service.transportLib = strdup("libatmibroker-hybrid.so");
  435. #endif
  436. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "set transportlib: " << service.transportLib);
  437. if(service.function_name == NULL) {
  438. service.function_name = copy_value(service.serviceName);
  439. }
  440. }
  441. } else if (strcmp(name, "LIBRARY_NAME") == 0) {
  442. if(atts != 0 && atts[0] && strcmp(atts[0], "configuration") == 0) {
  443. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "comparing" << atts[1] << " with " << configuration);
  444. if (strcmp(atts[1], configuration) == 0) {
  445. service.library_name = copy_value(atts[3]);
  446. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "processed LIBRARY_NAME: " << service.library_name);
  447. } else {
  448. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "CONFIGURATION NOT APPLICABLE FOR LIBRARY_NAME: " << atts[1]);
  449. }
  450. }
  451. }
  452. strcpy(element, name);
  453. strcpy(value, "");
  454. depth += 1;
  455. }
  456. static void XMLCALL endElement
  457. (void *userData, const char *name) {
  458. std::vector<envVar_t>* aEnvironmentStructPtr = (std::vector<envVar_t>*) userData;
  459. bool storedElement = false;
  460. strcpy(last_element, name);
  461. strcpy(last_value, value);
  462. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "storing element: " << last_element);
  463. if (strcmp(last_element, "DOMAIN") == 0) {
  464. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "storing domain value: " << last_value);
  465. storedElement = true;
  466. strcpy(domain, last_value);
  467. } else if (strcmp(last_element, "XA_RESOURCE") == 0) {
  468. processingXaResource = false;
  469. } else if (strcmp(last_element, "XA_RESOURCE_MGR_ID") == 0) {
  470. if (processingXaResource) {
  471. xarmp->resourceMgrId = atol(last_value);
  472. }
  473. } else if (strcmp(last_element, "XA_RESOURCE_NAME") == 0) {
  474. if (processingXaResource) {
  475. xarmp->resourceName = copy_value(last_value);
  476. }
  477. } else if (strcmp(last_element, "XA_OPEN_STRING") == 0) {
  478. if (processingXaResource) {
  479. xarmp->openString = copy_value(last_value);
  480. }
  481. } else if (strcmp(last_element, "XA_CLOSE_STRING") == 0) {
  482. if (processingXaResource) {
  483. xarmp->closeString = copy_value(last_value);
  484. }
  485. } else if (strcmp(last_element, "XA_SWITCH") == 0) {
  486. if (processingXaResource) {
  487. xarmp->xasw = copy_value(last_value);
  488. }
  489. } else if (strcmp(last_element, "XA_LIB_NAME") == 0) {
  490. if (processingXaResource) {
  491. xarmp->xalib = copy_value(last_value);
  492. }
  493. } else if (strcmp(last_element, "ENV_VARIABLE") == 0) {
  494. if (processingEnvVariable) {
  495. int index = envVariableCount - 1;
  496. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "stored EnvVariable at index %d" << index);
  497. }
  498. processingEnvVariable = false;
  499. } else if (strcmp(last_element, "NAME") == 0) {
  500. if (processingEnvVariable) {
  501. int index = envVariableCount - 1;
  502. (*aEnvironmentStructPtr)[index].name = copy_value(last_value);
  503. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "stored EnvName %s at index %d" << last_value << index);
  504. }
  505. } else if (strcmp(last_element, "VALUE") == 0) {
  506. if (processingEnvVariable) {
  507. int index = envVariableCount - 1;
  508. (*aEnvironmentStructPtr)[index].value = copy_value(last_value);
  509. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "stored Env Value %s at index %d" << last_value << index);
  510. }
  511. } else if (strcmp(last_element, "BUFFER") == 0) {
  512. if (currentBufferName != NULL) {
  513. Buffer* buffer = buffers[currentBufferName];
  514. int currentSize = buffer->memSize;
  515. if (currentSize != 0) {
  516. if (currentSize % buffer->lastPad != 0) {
  517. buffer->lastPad = buffer->lastPad - (currentSize % buffer->lastPad);
  518. buffer->memSize = currentSize + buffer->lastPad;
  519. } else {
  520. buffer->lastPad = 0;
  521. }
  522. } else {
  523. buffer->lastPad = 1;
  524. buffer->memSize = 1;
  525. }
  526. currentBufferName = NULL;
  527. }
  528. } else if (strcmp(last_element, "SERVICE") == 0) {
  529. servers.back()->serviceVector.push_back(service);
  530. }
  531. depth -= 1;
  532. }
  533. static void XMLCALL characterData
  534. (void *userData, const char *cdata, int len) {
  535. int i = 0;
  536. int j = 0;
  537. int priorLength = strlen(value);
  538. i = priorLength;
  539. for (; i < len + priorLength; i++, j++) {
  540. value[i] = cdata[j];
  541. }
  542. value[i] = '';
  543. if (value[0] == 'n') {
  544. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "value starts with newline (may be other character data)");
  545. } else {
  546. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "value is :" << value);
  547. }
  548. }
  549. bool AtmiBrokerEnvXml::parseXmlDescriptor(
  550. std::vector<envVar_t>* aEnvironmentStructPtr,
  551. const char * configurationDir, char * conf) {
  552. char aDescriptorFileName[256];
  553. if (configurationDir != NULL) {
  554. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "read env from dir: "
  555. << configurationDir);
  556. ACE_OS::snprintf(aDescriptorFileName, 256, "%s"ACE_DIRECTORY_SEPARATOR_STR_A"btconfig.xml",
  557. configurationDir);
  558. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml,
  559. (char*) "in parseXmlDescriptor() " << aDescriptorFileName);
  560. } else {
  561. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml,
  562. (char*) "read env from default file");
  563. ACE_OS::strcpy(aDescriptorFileName, "btconfig.xml");
  564. }
  565. configuration = conf;
  566. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, "BLACKTIE_CONFIGURATION: " << configuration);
  567. bool toReturn = true;
  568. char schemaPath[256];
  569. char* schemaDir;
  570. schemaDir = ACE_OS::getenv("BLACKTIE_SCHEMA_DIR");
  571. if (schemaDir) {
  572. ACE_OS::snprintf(schemaPath, 256, "%s"ACE_DIRECTORY_SEPARATOR_STR_A"btconfig.xsd", schemaDir);
  573. } else {
  574. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml,
  575. (char*) "BLACKTIE_SCHEMA_DIR is not set, cannot validate configuration");
  576. return false;
  577. }
  578. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "schemaPath is "
  579. << schemaPath);
  580. XsdValidator validator;
  581. if (validator.validate(schemaPath, aDescriptorFileName) == false) {
  582. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml,
  583. (char*) "btconfig.xml did not validate against btconfig.xsd");
  584. return false;
  585. }
  586. struct stat s; /* file stats */
  587. FILE *aDescriptorFile = fopen(aDescriptorFileName, "r");
  588. if (!aDescriptorFile) {
  589. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml,
  590. (char*) "loadfile: fopen failed on %s" << aDescriptorFileName);
  591. return false;
  592. }
  593. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml, (char*) "read file %p"
  594. << aDescriptorFile);
  595. /* Use fstat to obtain the file size */
  596. if (fstat(fileno(aDescriptorFile), &s) != 0) {
  597. /* fstat failed */
  598. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml,
  599. (char*) "loadfile: fstat failed on %s" << aDescriptorFileName);
  600. return false;
  601. }
  602. if (s.st_size == 0) {
  603. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml,
  604. (char*) "loadfile: file %s is empty" << aDescriptorFileName);
  605. }
  606. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml,
  607. (char*) "loadfile: file %s is %d long" << aDescriptorFileName
  608. << s.st_size);
  609. char *buf = (char *) malloc(sizeof(char) * s.st_size + 1);
  610. if (!buf) {
  611. /* malloc failed */
  612. LOG4CXX_ERROR(
  613. loggerAtmiBrokerEnvXml,
  614. (char*) "loadfile: Could not allocate enough memory to load file %s"
  615. << aDescriptorFileName);
  616. return false;
  617. }
  618. memset(buf, '', s.st_size + 1);
  619. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml,
  620. (char*) "loadfile: Allocated enough memory to load file %d"
  621. << s.st_size);
  622. XML_Parser parser = XML_ParserCreate(NULL);
  623. int done;
  624. strcpy(element, "");
  625. strcpy(value, "");
  626. XML_SetUserData(parser, aEnvironmentStructPtr);
  627. XML_SetElementHandler(parser, startElement, endElement);
  628. XML_SetCharacterDataHandler(parser, characterData);
  629. try {
  630. do {
  631. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "reading file");
  632. size_t len = fread(buf, 1, s.st_size, aDescriptorFile);
  633. done = len < sizeof(buf);
  634. if (len > 0) {
  635. LOG4CXX_TRACE(loggerAtmiBrokerEnvXml, (char*) "buf is " << buf);
  636. if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
  637. LOG4CXX_ERROR(loggerAtmiBrokerEnvXml, (char*) "%d at line %d"
  638. << XML_ErrorString(XML_GetErrorCode(parser))
  639. << XML_GetCurrentLineNumber(parser));
  640. toReturn = false;
  641. break;
  642. }
  643. }
  644. } while (!done);
  645. } catch (...) {
  646. free(buf);
  647. XML_ParserFree(parser);
  648. fflush(aDescriptorFile);
  649. fclose(aDescriptorFile);
  650. throw;
  651. }
  652. free(buf);
  653. XML_ParserFree(parser);
  654. fflush(aDescriptorFile);
  655. fclose(aDescriptorFile);
  656. LOG4CXX_DEBUG(loggerAtmiBrokerEnvXml,
  657. (char*) "leaving parseXmlDescriptor() %s" << aDescriptorFileName);
  658. if (warnCnt) {
  659. warnCnt = 0;
  660. return false;
  661. }
  662. return toReturn;
  663. }