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

中间件编程

开发平台:

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 <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <stdarg.h>
  22. #include <iostream>
  23. #include "userlogc.h"
  24. #include "AtmiBrokerEnv.h"
  25. #include "AtmiBrokerEnvXml.h"
  26. #include "SynchronizableObject.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 loggerAtmiBrokerEnv(log4cxx::Logger::getLogger(
  34. "AtmiBrokerEnv"));
  35. int AtmiBrokerEnv::ENV_VARIABLE_SIZE = 30;
  36. char *AtmiBrokerEnv::ENVIRONMENT_DIR = NULL;
  37. AtmiBrokerEnv *AtmiBrokerEnv::ptrAtmiBrokerEnv = NULL;
  38. char* configuration = NULL;
  39. SynchronizableObject instance_lock;
  40. int referencesAtmiBrokerEnv = 0;
  41. AtmiBrokerEnv * AtmiBrokerEnv::get_instance() {
  42. initializeLogger();
  43. instance_lock.lock();
  44. if (referencesAtmiBrokerEnv == 0) {
  45. if (ptrAtmiBrokerEnv == NULL) {
  46. try {
  47. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  48. (char*) "Creating AtmiBrokerEnv");
  49. ptrAtmiBrokerEnv = new AtmiBrokerEnv();
  50. } catch (...) {
  51. instance_lock.unlock();
  52. throw ;
  53. }
  54. } else {
  55. LOG4CXX_WARN(loggerAtmiBrokerEnv,
  56. (char*) "Did not create AtmiBrokerEnv");
  57. }
  58. }
  59. referencesAtmiBrokerEnv++;
  60. LOG4CXX_TRACE(loggerAtmiBrokerEnv,
  61. (char*) "Reference count: " << referencesAtmiBrokerEnv);
  62. instance_lock.unlock();
  63. return ptrAtmiBrokerEnv;
  64. }
  65. void AtmiBrokerEnv::discard_instance() {
  66. instance_lock.lock();
  67. referencesAtmiBrokerEnv--;
  68. LOG4CXX_TRACE(loggerAtmiBrokerEnv, (char*) "Reference count: "
  69. << referencesAtmiBrokerEnv);
  70. if (referencesAtmiBrokerEnv == 0) {
  71. if (ptrAtmiBrokerEnv != NULL) {
  72. try {
  73. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  74. (char*) "Deleting AtmiBrokerEnv");
  75. delete ptrAtmiBrokerEnv;
  76. } catch (...) {
  77. instance_lock.unlock();
  78. ptrAtmiBrokerEnv = NULL;
  79. throw ;
  80. }
  81. ptrAtmiBrokerEnv = NULL;
  82. } else {
  83. LOG4CXX_WARN(loggerAtmiBrokerEnv,
  84. (char*) "Did not delete AtmiBrokerEnv");
  85. }
  86. }
  87. instance_lock.unlock();
  88. }
  89. void AtmiBrokerEnv::set_environment_dir(const char* dir) {
  90. if (ENVIRONMENT_DIR != NULL) {
  91. free( ENVIRONMENT_DIR);
  92. ENVIRONMENT_DIR = NULL;
  93. }
  94. if (dir != NULL) {
  95. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  96. (char*) "setting configuration dir: " << dir);
  97. ENVIRONMENT_DIR = strdup(dir);
  98. } else {
  99. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  100. (char*) "setting configuration to null");
  101. }
  102. }
  103. void AtmiBrokerEnv::set_configuration(const char* dir) {
  104. if (configuration == NULL) {
  105. initializeLogger();
  106. if (dir != NULL) {
  107. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  108. (char*) "setting configuration type: " << dir);
  109. configuration = strdup(dir);
  110. } else {
  111. configuration = strdup("");
  112. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  113. (char*) "setting configuration to null");
  114. }
  115. }
  116. }
  117. AtmiBrokerEnv::AtmiBrokerEnv() {
  118. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "constructor");
  119. readEnvironment = false;
  120. set_environment_dir(ACE_OS::getenv("BLACKTIE_CONFIGURATION_DIR"));
  121. set_configuration(ACE_OS::getenv("BLACKTIE_CONFIGURATION"));
  122. try {
  123. readenv();
  124. } catch (...) {
  125. destroy();
  126. throw ;
  127. }
  128. }
  129. AtmiBrokerEnv::~AtmiBrokerEnv() {
  130. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "destructor");
  131. destroy();
  132. }
  133. void AtmiBrokerEnv::destroy() {
  134. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "destroy");
  135. for (std::vector<envVar_t>::iterator i = envVariableInfoSeq.begin(); i
  136. != envVariableInfoSeq.end(); i++) {
  137. free((*i).name);
  138. free((*i).value);
  139. }
  140. set_environment_dir( NULL);
  141. if (configuration != NULL) {
  142. free( configuration);
  143. configuration = NULL;
  144. }
  145. envVariableInfoSeq.clear();
  146. //free(namingServiceId);
  147. //free(transFactoryId);
  148. if (xarmp) {
  149. xarmp = xarmp->head;
  150. while (xarmp) {
  151. xarm_config_t * next = xarmp->next;
  152. free(xarmp->resourceName);
  153. free(xarmp->openString);
  154. free(xarmp->closeString);
  155. free(xarmp->xasw);
  156. free(xarmp->xalib);
  157. free( xarmp);
  158. xarmp = next;
  159. }
  160. xarmp = 0;
  161. }
  162. if (servers.size() != 0) {
  163. for (ServersInfo::iterator server = servers.begin(); server
  164. != servers.end(); server++) {
  165. free((*server)->serverName);
  166. std::vector<ServiceInfo>* services = &(*server)->serviceVector;
  167. for (std::vector<ServiceInfo>::iterator i = services->begin(); i
  168. != services->end(); i++) {
  169. free((*i).serviceName);
  170. free((*i).transportLib);
  171. free((*i).function_name);
  172. free((*i).library_name);
  173. }
  174. services->clear();
  175. delete (*server);
  176. }
  177. servers.clear();
  178. }
  179. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "free orbConfig");
  180. free(orbConfig.opt);
  181. free(orbConfig.transactionFactoryName);
  182. orbConfig.opt = NULL;
  183. orbConfig.transactionFactoryName = NULL;
  184. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "free mqConfig");
  185. free(mqConfig.host);
  186. free(mqConfig.user);
  187. free(mqConfig.pwd);
  188. mqConfig.host = NULL;
  189. mqConfig.user = NULL;
  190. mqConfig.pwd = NULL;
  191. Buffers::iterator it;
  192. for (it = buffers.begin(); it != buffers.end(); ++it) {
  193. Buffer* buffer = it->second;
  194. if (buffer != NULL) {
  195. free(buffer->name);
  196. buffer->name = NULL;
  197. buffer->memSize = -1;
  198. buffer->wireSize = -1;
  199. //std::vector<ServiceInfo>* services = &(*server)->serviceVector;
  200. Attributes::iterator i;
  201. for (i = buffer->attributes.begin(); i != buffer->attributes.end(); ++i) {
  202. Attribute* attribute = i->second;
  203. free(attribute->id);
  204. attribute->id = NULL;
  205. free(attribute->type);
  206. delete attribute;
  207. }
  208. buffer->attributes.clear();
  209. delete buffer;
  210. }
  211. }
  212. buffers.clear();
  213. readEnvironment = false;
  214. }
  215. char*
  216. AtmiBrokerEnv::getTransportLibrary(char* serviceName) {
  217. if (servers.size() != 0) {
  218. for (ServersInfo::iterator server = servers.begin(); server
  219. != servers.end(); server++) {
  220. std::vector<ServiceInfo>* services = &(*server)->serviceVector;
  221. for (std::vector<ServiceInfo>::iterator i = services->begin(); i
  222. != services->end(); i++) {
  223. if (ACE_OS::strncmp((*i).serviceName, serviceName, 15) == 0) {
  224. return (*i).transportLib;
  225. }
  226. }
  227. }
  228. }
  229. return NULL;
  230. }
  231. const char* AtmiBrokerEnv::getenv(const char* anEnvName, const char* defValue) {
  232. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "getenv %s" << anEnvName);
  233. char *envValue = ::getenv(anEnvName);
  234. if (envValue != NULL) {
  235. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "getenv env is %s"
  236. << envValue);
  237. return envValue;
  238. }
  239. for (std::vector<envVar_t>::iterator i = envVariableInfoSeq.begin(); i
  240. != envVariableInfoSeq.end(); i++) {
  241. if (strcmp(anEnvName, (*i).name) == 0) {
  242. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  243. (char*) "getenv found env name '%s'" << (*i).value);
  244. return (*i).value;
  245. }
  246. }
  247. return defValue;
  248. }
  249. char*
  250. AtmiBrokerEnv::getenv(char* anEnvName) {
  251. const char* val = getenv(anEnvName, NULL);
  252. if (val != NULL)
  253. return (char *) val;
  254. LOG4CXX_ERROR(loggerAtmiBrokerEnv, (char*) "Could not locate: "
  255. << anEnvName);
  256. throw new std::exception();
  257. }
  258. int AtmiBrokerEnv::putenv(char* anEnvNameValue) {
  259. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "putenv %s" << anEnvNameValue);
  260. char *p = strchr(anEnvNameValue, '=');
  261. envVar_t envVar;
  262. envVar.name = ACE::strndup(anEnvNameValue, (size_t)(p - anEnvNameValue));
  263. envVar.value = ACE::strndup(p + 1, (int) (strlen(anEnvNameValue)
  264. - strlen(p)));
  265. envVariableInfoSeq.push_back(envVar);
  266. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "putenv name '" << envVar.name
  267. << "' value '" << envVar.value);
  268. return 1;
  269. }
  270. int AtmiBrokerEnv::readenv() {
  271. if (!readEnvironment) {
  272. LOG4CXX_DEBUG(loggerAtmiBrokerEnv, (char*) "readenv");
  273. if (ENVIRONMENT_DIR != NULL) {
  274. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  275. (char*) "readenv configuration dir: " << ENVIRONMENT_DIR);
  276. } else {
  277. LOG4CXX_DEBUG(loggerAtmiBrokerEnv,
  278. (char*) "readenv default configuration");
  279. }
  280. AtmiBrokerEnvXml aAtmiBrokerEnvXml;
  281. if (aAtmiBrokerEnvXml.parseXmlDescriptor(&envVariableInfoSeq,
  282. ENVIRONMENT_DIR, configuration)) {
  283. readEnvironment = true;
  284. } else {
  285. if (ENVIRONMENT_DIR != NULL) {
  286. LOG4CXX_ERROR(loggerAtmiBrokerEnv, (char*) "can not parse "
  287. << ENVIRONMENT_DIR << "/btconfig.xml");
  288. } else {
  289. LOG4CXX_ERROR(loggerAtmiBrokerEnv,
  290. (char*) "can not parse btconfig.xml");
  291. }
  292. throw std::exception();
  293. }
  294. }
  295. return 1;
  296. }
  297. std::vector<envVar_t>& AtmiBrokerEnv::getEnvVariableInfoSeq() {
  298. return envVariableInfoSeq;
  299. }