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

中间件编程

开发平台:

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.jab.factory;
  19. import java.util.ArrayList;
  20. import java.util.Iterator;
  21. import java.util.List;
  22. import java.util.Map;
  23. import org.apache.log4j.LogManager;
  24. import org.apache.log4j.Logger;
  25. import org.jboss.blacktie.jatmibroker.jab.JABException;
  26. import org.jboss.blacktie.jatmibroker.jab.JABMessage;
  27. import org.jboss.blacktie.jatmibroker.jab.JABRemoteService;
  28. import org.jboss.blacktie.jatmibroker.jab.JABSession;
  29. import org.jboss.blacktie.jatmibroker.jab.JABTransaction;
  30. import org.jboss.blacktie.jatmibroker.jab.TransactionException;
  31. import org.jboss.blacktie.jatmibroker.xatmi.Connection;
  32. import org.jboss.blacktie.jatmibroker.xatmi.ConnectionException;
  33. /**
  34.  * The JAB connection abstraction allows invocations to services to several
  35.  * services to be multiplexed over the same connection. It also provides a
  36.  * factory method to begin transactions.
  37.  * 
  38.  * @see JABConnectionFactory
  39.  */
  40. public class JABConnection {
  41. /**
  42.  * The logger to debug using
  43.  */
  44. private static final Logger log = LogManager.getLogger(JABConnection.class);
  45. /**
  46.  * The list of open transactions
  47.  */
  48. private List<Transaction> transactions = new ArrayList<Transaction>();
  49. private Connection connection;
  50. private JABSession session;
  51. private Transaction transaction;
  52. /**
  53.  * The constructor is hidden from classes as it is intended to be used
  54.  * solely by the JABConnectionFactory class.
  55.  * 
  56.  * @param connection
  57.  *            The connection to send requests on
  58.  * @param session
  59.  *            The session to use for creating transactions
  60.  * 
  61.  * @throws JABException
  62.  *             If the connection cannot be established
  63.  */
  64. JABConnection(Connection connection, JABSession session)
  65. throws JABException {
  66. this.connection = connection;
  67. this.session = session;
  68. }
  69. /**
  70.  * Begin a new transaction. This transaction reference can then be used in
  71.  * calls to "call" and completed via the options on the JABTransaction class
  72.  * itself.
  73.  * 
  74.  * @param timeout
  75.  *            Specify a timeout for the transaction
  76.  * @return The transaction object
  77.  * @throws JABException
  78.  *             In case the transaction cannot be created
  79.  */
  80. public synchronized Transaction beginTransaction(int timeout)
  81. throws TransactionException {
  82. if (transaction != null) {
  83. return transaction;
  84. }
  85. transaction = new Transaction(this, session, timeout);
  86. return transaction;
  87. }
  88. /**
  89.  * Invoke the service specified by the first parameter. The buffer to send
  90.  * is provided as the second parameter. If the service should be invoked
  91.  * within the scope of a transaction, the last parameter should also be
  92.  * provided. This can be obtained via the beginTransaction method.
  93.  * 
  94.  * @param serviceName
  95.  *            The name of the service
  96.  * @param toSend
  97.  *            The buffer to use
  98.  * @param transaction
  99.  *            The transaction to use, may be null
  100.  * @return The buffer returned from the remote service
  101.  * 
  102.  * @throws TransactionException
  103.  *             In case the transaction cannot be handled
  104.  * @throws JABException
  105.  *             In case the service cannot be contacted
  106.  */
  107. public synchronized JABResponse call(String serviceName, JABBuffer toSend,
  108. Transaction transaction, String bufferType, String bufferSubType)
  109. throws TransactionException, JABException {
  110. log.debug("call");
  111. JABTransaction tx = transaction.getJABTransaction();
  112. JABRemoteService remoteService = new JABRemoteService(serviceName,
  113. session, bufferType, bufferSubType);
  114. serialize(toSend, remoteService.getRequest());
  115. remoteService.call(tx);
  116. JABResponse responseMessage = new JABResponse(remoteService.getRCode());
  117. deserialize(responseMessage, remoteService.getResponse());
  118. return responseMessage;
  119. }
  120. /**
  121.  * Shutdown the connection object/
  122.  * 
  123.  * @throws JABException
  124.  *             In case associated state cannot be cleaned up
  125.  */
  126. public synchronized void close() throws JABException {
  127. Iterator<Transaction> iterator = transactions.iterator();
  128. while (iterator.hasNext()) {
  129. Transaction next = iterator.next();
  130. synchronized (next) {
  131. next.rollback();
  132. }
  133. iterator.remove();
  134. }
  135. try {
  136. connection.close();
  137. } catch (ConnectionException e) {
  138. throw new JABException("Could not close the connection: "
  139. + e.getMessage(), e);
  140. }
  141. }
  142. /**
  143.  * Remove a completed transaction from the list.
  144.  * 
  145.  * @param transaction
  146.  *            The completed transaction
  147.  */
  148. synchronized void removeTransaction(Transaction transaction) {
  149. transactions.remove(transaction);
  150. }
  151. private void serialize(JABBuffer buffer, JABMessage message) {
  152. Map<String, Class> messageFormat = message.getMessageFormat();
  153. Iterator<String> iterator = messageFormat.keySet().iterator();
  154. while (iterator.hasNext()) {
  155. String key = iterator.next();
  156. Class type = messageFormat.get(key);
  157. setBufferValue(buffer, message, key, type);
  158. }
  159. }
  160. private void deserialize(JABBuffer buffer, JABMessage message) {
  161. Map<String, Class> messageFormat = message.getMessageFormat();
  162. Iterator<String> iterator = messageFormat.keySet().iterator();
  163. while (iterator.hasNext()) {
  164. String key = iterator.next();
  165. Class type = messageFormat.get(key);
  166. setMessageValue(buffer, message, key, type);
  167. }
  168. }
  169. private void setBufferValue(JABBuffer buffer, JABMessage message,
  170. String key, Class type) {
  171. try {
  172. if (type == byte.class) {
  173. buffer.setValue(key, message.getByte(key));
  174. } else if (type == short.class) {
  175. buffer.setValue(key, message.getShort(key));
  176. } else if (type == int.class) {
  177. buffer.setValue(key, message.getInt(key));
  178. } else if (type == double.class) {
  179. buffer.setValue(key, message.getDouble(key));
  180. } else if (type == float.class) {
  181. buffer.setValue(key, message.getFloat(key));
  182. } else if (type == byte[].class) {
  183. buffer.setArrayValue(key, message.getByteArray(key));
  184. } else if (type == short[].class) {
  185. buffer.setArrayValue(key, message.getShortArray(key));
  186. } else if (type == int[].class) {
  187. buffer.setArrayValue(key, message.getIntArray(key));
  188. } else if (type == double[].class) {
  189. buffer.setArrayValue(key, message.getDoubleArray(key));
  190. } else if (type == float[].class) {
  191. buffer.setArrayValue(key, message.getFloatArray(key));
  192. }
  193. } catch (JABException e) {
  194. log.trace("Could not locate the message property: " + e);
  195. }
  196. }
  197. private void setMessageValue(JABBuffer buffer, JABMessage message,
  198. String key, Class type) {
  199. try {
  200. if (type == byte.class) {
  201. message.setByte(key, ((Byte) buffer.getValue(key)));
  202. } else if (type == short.class) {
  203. message.setShort(key, ((Short) buffer.getValue(key)));
  204. } else if (type == int.class) {
  205. message.setInt(key, ((Integer) buffer.getValue(key)));
  206. } else if (type == double.class) {
  207. message.setDouble(key, ((Double) buffer.getValue(key)));
  208. } else if (type == float.class) {
  209. message.setFloat(key, ((Float) buffer.getValue(key)));
  210. } else if (type == byte[].class) {
  211. message.setByteArray(key, buffer.getByteArray(key));
  212. } else if (type == short[].class) {
  213. message.setShortArray(key, buffer.getShortArray(key));
  214. } else if (type == int[].class) {
  215. message.setIntArray(key, buffer.getIntArray(key));
  216. } else if (type == double[].class) {
  217. message.setDoubleArray(key, buffer.getDoubleArray(key));
  218. } else if (type == float[].class) {
  219. message.setFloatArray(key, buffer.getFloatArray(key));
  220. }
  221. } catch (JABException e) {
  222. log.trace("Could not locate the message property: " + e);
  223. }
  224. }
  225. }