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

中间件编程

开发平台:

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. package org.jboss.blacktie.jatmibroker.core.conf;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import java.util.Properties;
  24. import org.apache.log4j.LogManager;
  25. import org.apache.log4j.Logger;
  26. import org.xml.sax.Attributes;
  27. import org.xml.sax.SAXException;
  28. import org.xml.sax.helpers.DefaultHandler;
  29. /**
  30.  * XMLEnvHandler extends DefaultHandler to Environment Info
  31.  */
  32. public class XMLEnvHandler extends DefaultHandler {
  33. private static final Logger log = LogManager.getLogger(XMLEnvHandler.class);
  34. private final String DOMAIN = "DOMAIN";
  35. private final String BUFFER = "BUFFER";
  36. private final String ATTRIBUTE = "ATTRIBUTE";
  37. private final String SERVER_NAME = "SERVER";
  38. private final String SERVICE_NAME = "SERVICE";
  39. private final String NAME = "NAME";
  40. private final String VALUE = "VALUE";
  41. private final String ORB = "ORB";
  42. private final String MQ = "MQ";
  43. private final String JMX = "JMX";
  44. private final String MACHINE = "MACHINE";
  45. private final String MACHINE_REF = "MACHINE-REF";
  46. private final String ROLE = "role";
  47. private final String VERSION = "VERSION";
  48. private Properties prop;
  49. private String value;
  50. private String name;
  51. private String serverName;
  52. private String serviceName;
  53. private String jbossasIpAddr = System.getenv("JBOSSAS_IP_ADDR");
  54. private List<String> servers = new ArrayList<String>();
  55. private Map<String, BufferStructure> buffers = new HashMap<String, BufferStructure>();
  56. private Map<String, Machine> machines = new HashMap<String, Machine>();
  57. private List<Server> serverLaunchers = new ArrayList<Server>();
  58. private String currentBufferName;
  59. static int CHAR_SIZE = 1;
  60. static int LONG_SIZE = 8;
  61. static int INT_SIZE = 4;
  62. static int SHORT_SIZE = 2;
  63. static int FLOAT_SIZE = 4;
  64. static int DOUBLE_SIZE = 8;
  65. public XMLEnvHandler(Properties prop) {
  66. this.prop = prop;
  67. prop.put("blacktie.domain.servers", servers);
  68. prop.put("blacktie.domain.buffers", buffers);
  69. prop.put("blacktie.domain.serverLaunchers", serverLaunchers);
  70. }
  71. public void characters(char[] ch, int start, int length)
  72. throws SAXException {
  73. String strValue = new String(ch, start, length);
  74. value += strValue;
  75. }
  76. public void startElement(String namespaceURI, String localName,
  77. String qName, Attributes atts) throws SAXException {
  78. value = "";
  79. if (SERVER_NAME.equals(localName)) {
  80. if (atts != null) {
  81. for (int i = 0; i < atts.getLength(); i++) {
  82. if (atts.getLocalName(i).equals("name")) {
  83. serverName = atts.getValue(i);
  84. }
  85. }
  86. if (serverName == null) {
  87. serverName = "default";
  88. }
  89. if (servers.contains(serverName)) {
  90. throw new SAXException("Duplicate server detected: "
  91. + serverName);
  92. }
  93. servers.add(serverName);
  94. serverLaunchers.add(new Server(serverName));
  95. }
  96. } else if (MACHINE_REF.equals(localName)) {
  97. String value = null;
  98. Machine machine = null;
  99. for (int i = 0; i < atts.getLength(); i++) {
  100. if (atts.getLocalName(i).equals("id")) {
  101. value = atts.getValue(i);
  102. // Get the machine out of the list
  103. machine = machines.get(value);
  104. }
  105. }
  106. if (machine == null) {
  107. throw new SAXException("Machine did not exist: " + value);
  108. } else {
  109. // This will be the last server added
  110. Server server = serverLaunchers.get(serverLaunchers.size() - 1);
  111. server.addMachine(machine);
  112. }
  113. } else if (BUFFER.equals(localName)) {
  114. currentBufferName = atts.getValue(0);
  115. BufferStructure buffer = buffers.get(currentBufferName);
  116. if (buffer == null) {
  117. buffer = new BufferStructure();
  118. buffer.name = currentBufferName;
  119. buffer.wireSize = 0;
  120. buffer.memSize = 0;
  121. buffer.lastPad = 0;
  122. buffers.put(currentBufferName, buffer);
  123. } else {
  124. log.error("Duplicate buffer detected: " + currentBufferName);
  125. currentBufferName = null;
  126. }
  127. } else if (ATTRIBUTE.equals(localName)) {
  128. if (currentBufferName != null) {
  129. BufferStructure buffer = buffers.get(currentBufferName);
  130. AttributeStructure attribute = new AttributeStructure();
  131. attribute.id = null;
  132. attribute.type = null;
  133. attribute.count = 0;
  134. attribute.length = 0;
  135. attribute.wirePosition = 0;
  136. attribute.memPosition = 0;
  137. String type = null;
  138. for (int i = 0; i < atts.getLength(); i++) {
  139. if (atts.getLocalName(i).equals("id")) {
  140. attribute.id = atts.getValue(i);
  141. } else if (atts.getLocalName(i).equals("type")) {
  142. type = atts.getValue(i);
  143. } else if (atts.getLocalName(i).equals("arrayCount")) {
  144. attribute.count = Integer.parseInt(atts.getValue(i));
  145. } else if (atts.getLocalName(i).equals("arrayLength")) {
  146. attribute.length = Integer.parseInt(atts.getValue(i));
  147. }
  148. }
  149. int typeSize = -1;
  150. boolean contains = buffer.attributeNames.contains(attribute.id);
  151. boolean fail = false;
  152. if (!contains) {
  153. // short, int, long, float, double, char
  154. if (type.equals("short")) {
  155. typeSize = SHORT_SIZE;
  156. attribute.instanceSize = SHORT_SIZE;
  157. attribute.type = short.class;
  158. } else if (type.equals("int")) {
  159. typeSize = INT_SIZE;
  160. attribute.instanceSize = INT_SIZE;
  161. attribute.type = int.class;
  162. } else if (type.equals("long")) {
  163. typeSize = LONG_SIZE;
  164. attribute.instanceSize = LONG_SIZE;
  165. attribute.type = long.class;
  166. } else if (type.equals("float")) {
  167. typeSize = FLOAT_SIZE;
  168. attribute.instanceSize = FLOAT_SIZE;
  169. attribute.type = float.class;
  170. } else if (type.equals("double")) {
  171. typeSize = DOUBLE_SIZE;
  172. attribute.instanceSize = DOUBLE_SIZE;
  173. attribute.type = double.class;
  174. } else if (type.equals("char")) {
  175. typeSize = CHAR_SIZE;
  176. attribute.instanceSize = CHAR_SIZE;
  177. attribute.type = byte.class;
  178. } else if (type.equals("char[]")) {
  179. if (attribute.length == 0) {
  180. attribute.length = 1;
  181. }
  182. typeSize = CHAR_SIZE;
  183. attribute.instanceSize = CHAR_SIZE * attribute.length;
  184. attribute.type = byte[].class;
  185. } else if (type.equals("short[]")) {
  186. if (attribute.length == 0) {
  187. attribute.length = 1;
  188. }
  189. typeSize = SHORT_SIZE;
  190. attribute.instanceSize = SHORT_SIZE * attribute.length;
  191. attribute.type = short[].class;
  192. } else if (type.equals("int[]")) {
  193. if (attribute.length == 0) {
  194. attribute.length = 1;
  195. }
  196. typeSize = INT_SIZE;
  197. attribute.instanceSize = INT_SIZE * attribute.length;
  198. attribute.type = int[].class;
  199. } else if (type.equals("long[]")) {
  200. if (attribute.length == 0) {
  201. attribute.length = 1;
  202. }
  203. typeSize = LONG_SIZE;
  204. attribute.instanceSize = LONG_SIZE * attribute.length;
  205. attribute.type = long[].class;
  206. } else if (type.equals("float[]")) {
  207. if (attribute.length == 0) {
  208. attribute.length = 1;
  209. }
  210. typeSize = FLOAT_SIZE;
  211. attribute.instanceSize = FLOAT_SIZE * attribute.length;
  212. attribute.type = float[].class;
  213. } else if (type.equals("double[]")) {
  214. if (attribute.length == 0) {
  215. attribute.length = 1;
  216. }
  217. typeSize = DOUBLE_SIZE;
  218. attribute.instanceSize = DOUBLE_SIZE * attribute.length;
  219. attribute.type = double[].class;
  220. } else if (type.equals("char[][]")) {
  221. if (attribute.length == 0) {
  222. attribute.length = 1;
  223. }
  224. if (attribute.count == 0) {
  225. attribute.count = 1;
  226. }
  227. typeSize = CHAR_SIZE;
  228. attribute.instanceSize = CHAR_SIZE * attribute.length
  229. * attribute.count;
  230. attribute.type = byte[][].class;
  231. } else {
  232. log.error("Unknown attribute type: " + attribute.type);
  233. fail = true;
  234. }
  235. if (!fail) {
  236. buffer.attributes.add(attribute);
  237. // Extend the buffer by the required extra buffer size
  238. if (buffer.lastPad < typeSize) {
  239. buffer.lastPad = typeSize;
  240. }
  241. buffer.memSize = buffer.memSize
  242. + (buffer.memSize % typeSize);
  243. attribute.memPosition = buffer.memSize;
  244. attribute.wirePosition = buffer.wireSize;
  245. buffer.wireSize = buffer.wireSize
  246. + attribute.instanceSize;
  247. buffer.memSize = buffer.memSize
  248. + attribute.instanceSize;
  249. }
  250. } else {
  251. log.error("Duplicate attribute detected: " + attribute.id);
  252. }
  253. } else {
  254. log.error("No buffer is being processed");
  255. }
  256. } else if (ORB.equals(localName)) {
  257. for (int j = 0; j < atts.getLength(); j++) {
  258. if (atts.getLocalName(j).equals("OPT")) {
  259. String[] argv;
  260. argv = atts.getValue(j).split(" ");
  261. int orbargs = argv.length;
  262. for (int i = 1; i <= orbargs; i++) {
  263. String arg = "blacktie.orb.arg." + i;
  264. String toSet = argv[i - 1];
  265. if (jbossasIpAddr != null) {
  266. toSet = toSet.replace("${JBOSSAS_IP_ADDR}",
  267. jbossasIpAddr);
  268. }
  269. prop.setProperty(arg, toSet);
  270. log.debug(arg + " is " + toSet);
  271. }
  272. log.debug("blacktie.orb.args is " + orbargs);
  273. prop.setProperty("blacktie.orb.args", Integer
  274. .toString(orbargs));
  275. } else if (atts.getLocalName(j).equals("TRANS_FACTORY_ID")) {
  276. prop.setProperty("blacktie.trans.factoryid", atts
  277. .getValue(j));
  278. }
  279. }
  280. } else if (MQ.equals(localName)) {
  281. for (int i = 0; i < atts.getLength(); i++) {
  282. if (atts.getLocalName(i).equals("USER")) {
  283. String value = atts.getValue(i);
  284. prop.setProperty("StompConnectUsr", value);
  285. } else if (atts.getLocalName(i).equals("PASSWORD")) {
  286. String value = atts.getValue(i);
  287. prop.setProperty("StompConnectPwd", value);
  288. } else if (atts.getLocalName(i).equals("DESTINATION_TIMEOUT")) {
  289. String value = atts.getValue(i);
  290. prop.setProperty("DestinationTimeout", value);
  291. } else if (atts.getLocalName(i).equals("RECEIVE_TIMEOUT")) {
  292. String value = atts.getValue(i);
  293. prop.setProperty("RequestTimeout", value);
  294. } else if (atts.getLocalName(i).equals("TIME_TO_LIVE")) {
  295. String value = atts.getValue(i);
  296. prop.setProperty("TimeToLive", value);
  297. } else if (atts.getLocalName(i).equals("NAMING_URL")) {
  298. String value = atts.getValue(i);
  299. if (jbossasIpAddr != null) {
  300. value = value.replace("${JBOSSAS_IP_ADDR}",
  301. jbossasIpAddr);
  302. }
  303. prop.setProperty("java.naming.provider.url", value);
  304. }
  305. }
  306. } else if (MACHINE.equals(localName)) {
  307. Machine machine = new Machine();
  308. for (int i = 0; i < atts.getLength(); i++) {
  309. if (atts.getLocalName(i).equals("id")) {
  310. String value = atts.getValue(i);
  311. machine.setId(value);
  312. } else if (atts.getLocalName(i).equals("hostname")) {
  313. String value = atts.getValue(i);
  314. machine.setHostname(value);
  315. } else if (atts.getLocalName(i).equals("pathToExecutable")) {
  316. String value = atts.getValue(i);
  317. machine.setPathToExecutable(value);
  318. } else if (atts.getLocalName(i).equals("workingDirectory")) {
  319. String value = atts.getValue(i);
  320. machine.setWorkingDirectory(value);
  321. } else if (atts.getLocalName(i).equals("serverId")) {
  322. String value = atts.getValue(i);
  323. machine.setServerId(Integer.parseInt(value));
  324. } else if (atts.getLocalName(i).equals("argLine")) {
  325. String value = atts.getValue(i);
  326. machine.setArgLine(value);
  327. }
  328. }
  329. machines.put(machine.getId(), machine);
  330. } else if (JMX.equals(localName)) {
  331. for (int i = 0; i < atts.getLength(); i++) {
  332. if (atts.getLocalName(i).equals("url")) {
  333. String value = atts.getValue(i);
  334. if (jbossasIpAddr != null) {
  335. value = value.replace("${JBOSSAS_IP_ADDR}",
  336. jbossasIpAddr);
  337. }
  338. prop.setProperty("JMXURL", value);
  339. }
  340. }
  341. } else if (SERVICE_NAME.equals(localName)) {
  342. if (atts != null) {
  343. for (int i = 0; i < atts.getLength(); i++) {
  344. String attsLocalName = atts.getLocalName(i);
  345. if (attsLocalName.equals("name")) {
  346. serviceName = atts.getValue(i);
  347. if (serviceName.length() > 15) {
  348. log
  349. .warn("service "
  350. + serviceName
  351. + " is longer than XATMI_SERVICE_NAME_LENGTH and will be ignore");
  352. serviceName = null;
  353. break;
  354. }
  355. String serviceServer = (String) prop.get("blacktie."
  356. + serviceName + ".server");
  357. if (serviceServer != null
  358. && !serviceServer.equals(serverName)) {
  359. log.warn("service " + serviceName
  360. + " has already define in "
  361. + prop.get(serviceServer));
  362. serviceName = null;
  363. throw new SAXException(
  364. "Can not define the same service");
  365. }
  366. if (serviceName.indexOf("_ADMIN") >= 0) {
  367. log.warn("service " + serviceName
  368. + " is admin service");
  369. serviceName = null;
  370. throw new SAXException(
  371. "Can not define ADMIN service");
  372. }
  373. } else if (attsLocalName.equals("function_name")) {
  374. String func_key = "blacktie." + serviceName
  375. + ".function_name";
  376. String function_name = atts.getValue(i);
  377. prop.put(func_key, function_name);
  378. } else if (attsLocalName.equals("java_class_name")) {
  379. String java_key = "blacktie." + serviceName
  380. + ".java_class_name";
  381. String java_class_name = atts.getValue(i);
  382. prop.put(java_key, java_class_name);
  383. } else if (attsLocalName.equals("library_name")) {
  384. String lib_key = "blacktie." + serviceName
  385. + ".library_name";
  386. String library_name = atts.getValue(i);
  387. prop.put(lib_key, library_name);
  388. } else if (attsLocalName.equals("advertised")) {
  389. String advertised = atts.getValue(i);
  390. String ad_key = "blacktie." + serviceName
  391. + ".advertised";
  392. prop.put(ad_key, advertised);
  393. if (advertised.equals("true")) {
  394. String skey = "blacktie." + serverName
  395. + ".services";
  396. String object = (String) prop.get(skey);
  397. if (object == null) {
  398. object = serviceName;
  399. } else {
  400. object = new String(object + "," + serviceName);
  401. }
  402. prop.put(skey, object);
  403. }
  404. } else if (attsLocalName.equals("size")) {
  405. String sizeKey = "blacktie." + serviceName + ".size";
  406. String sizeVal = atts.getValue(i);
  407. prop.setProperty(sizeKey, sizeVal);
  408. }
  409. }
  410. if (serviceName != null) {
  411. // If a function was not defined above
  412. String func_key = "blacktie." + serviceName
  413. + ".function_name";
  414. if (prop.get(func_key) == null) {
  415. prop.put(func_key, serviceName);
  416. }
  417. prop.put("blacktie." + serviceName + ".server", serverName);
  418. prop.put("blacktie." + serviceName + ".transportLib",
  419. "hybrid");
  420. log.trace("Added the service: " + serviceName);
  421. }
  422. }
  423. } else if (ROLE.equals(localName)) {
  424. String key = null;
  425. if (serviceName != null) {
  426. log.debug("Processing role for service" + serviceName);
  427. key = "blacktie." + serviceName + ".security";
  428. } else if (serverName != null) {
  429. log.debug("Processing role for server: " + serverName);
  430. key = "blacktie." + serverName + ".security";
  431. }
  432. if (key != null) {
  433. String roleList = prop.getProperty(key, "");
  434. String name = null;
  435. String read = "false";
  436. String write = "false";
  437. for (int i = 0; i < atts.getLength(); i++) {
  438. String attsLocalName = atts.getLocalName(i);
  439. if (attsLocalName.equals("name")) {
  440. name = atts.getValue(i);
  441. } else if (atts.getLocalName(i).equals("read")) {
  442. read = atts.getValue(i);
  443. } else {
  444. write = atts.getValue(i);
  445. }
  446. }
  447. String role = name + ':' + read + ':' + write;
  448. if (roleList.length() > 0) {
  449. roleList = roleList + ',' + role;
  450. } else {
  451. roleList = role;
  452. }
  453. prop.put(key, roleList);
  454. log.trace("Added the role: " + role);
  455. } else {
  456. log.error("Ignoring role as not processing service or server");
  457. }
  458. }
  459. }
  460. public void endElement(String namespaceURI, String localName, String qName)
  461. throws SAXException {
  462. if (DOMAIN.equals(localName)) {
  463. prop.setProperty("blacktie.domain.name", value);
  464. } else if (NAME.equals(localName)) {
  465. name = value;
  466. } else if (VALUE.equals(localName)) {
  467. if (jbossasIpAddr != null) {
  468. value = value.replace("${JBOSSAS_IP_ADDR}", jbossasIpAddr);
  469. }
  470. prop.setProperty(name, value);
  471. } else if (SERVICE_NAME.equals(localName)) {
  472. if (serviceName != null) {
  473. serviceName = null;
  474. }
  475. } else if (VERSION.equals(localName)) {
  476. prop.setProperty("blacktie.domain.version", value);
  477. }
  478. }
  479. }